This vignette shows how to create and modify the index of personal power used in several chapters of my book Non-democratic Politics: Authoritarianism, Dictatorships, and Democratization (Palgrave Macmillan, 2016). It assumes that you have downloaded the replication package as follows:
if(!require(devtools)) {
install.packages("devtools")
}
devtools::install_github('xmarquez/AuthoritarianismBook')
It also assumes you have the dplyr
, ggplot2
, scales
, forcats
, GGally
, lubridate
, reshape2
, mirt
, and knitr
packages installed:
if(!require(dplyr)) {
install.packages("dplyr")
}
if(!require(ggplot2)) {
install.packages("ggplot2")
}
if(!require(scales)) {
install.packages("forcats")
}
if(!require(forcats)) {
install.packages("scales")
}
if(!require(GGally)) {
install.packages("GGally")
}
if(!require(lubridate)) {
install.packages("lubridate")
}
if(!require(reshape2)) {
install.packages("reshape2")
}
if(!require(mirt)) {
install.packages("mirt")
}
if(!require(knitr)) {
install.packages("knitr")
}
There are three types of measures of personalism that have been used by scholars. First, there are measures of legal or de-facto “constraints on the executive;” second, there are measures of how much of a regime is “taken up” by a single executive (e.g., tenure, executive turnover); and finally, there are “all things considered” qualitative judgments of whether a regime is a “personal” one. I use all three in constructing the index of personalism used in the book.
The V-Dem dataset (Coppedge et al. 2016) contains three variables that measure constraints, legal or de facto, on the executive: an index of “legislative constraints on the executive” (v2xlg_legcon
: “To what extent is the legislature and government agencies (e.g., comptroller general, general prosecutor, or ombudsman) capable of questioning, investigating, and exercising oversight over the executive?”), an index of “judicial constraints on the executive” (v2x_jucon
: “To what extent does the executive respect the constitution and comply with court rulings, and to what extent is the judiciary able to act in an independent fashion?”), and an index of “executive corruption” (v2x_execorr
: “How routinely do members of the executive, or their agents grant favors in exchange for bribes, kickbacks, or other material inducements, and how often do they steal, embezzle, or misappropriate public funds or other state resources for personal or family use?”). These are highly correlated, but we use all three, since they provide distinct information about the personalization of power in a regime:
library(AuthoritarianismBook)
library(dplyr)
library(reshape2)
personalism_data <- vdem %>%
select(country_name, GWn, year, in_system,
v2xlg_legcon, v2x_jucon, v2x_execorr) %>%
melt(id.vars = c("country_name", "GWn", "year", "in_system"), na.rm = TRUE)
And Polity IV has a measure of constraints on the executive, the exconst
variable (excluding the transition/interruption/interregunum codes):
polity_annual <- polity_annual %>% mutate(exconst = ifelse(unclass(exconst) < 4, NA, unclass(exconst) - 3))
personalism_data <- bind_rows(personalism_data, polity_annual %>%
select(country_name, GWn, year, exconst, in_system) %>%
melt(id.vars = c("country_name","GWn","year", "in_system")))
## Warning in bind_rows_(x, .id): Unequal factor levels: coercing to character
rm(polity_annual)
library(ggplot2)
library(GGally)
library(reshape2)
ggcorr(dcast(personalism_data, GWn + year + in_system ~ variable) %>%
select(-GWn, -in_system, -year), label = TRUE,
label_round = 2)
These measures are generally reasonable. Here’s the graph for Russia, for example:
library(lubridate)
library(purrr)
library(tidyr)
leader_data_yearly <- archigos %>%
group_by(obsid, GWn, leader, startdate,enddate) %>%
mutate(year = map2(startdate, enddate, ~ year(.x):year(.y))) %>%
unnest() %>%
group_by(GWn, year) %>%
filter(enddate == max(enddate), startdate == max(startdate)) %>%
group_by(leader) %>%
mutate(is_start_leader_year = (year == min(year))) %>%
ungroup()
country <- "Russia (Soviet Union)"
data <- left_join(personalism_data, leader_data_yearly) %>%
filter(country_name %in% country)
## Joining, by = c("country_name", "GWn", "year")
extra_breaks <- NULL
extra_labels <- NULL
axis_labels <- data_frame(breaks = c(data$year[data$is_start_leader_year], extra_breaks),
labels = c(paste(data$year[data$is_start_leader_year],
data$leader[data$is_start_leader_year]), extra_labels)) %>%
distinct() %>%
group_by(breaks) %>%
summarise(labels = paste(labels, collapse = "\n"))
ggplot(data = data %>%
filter(grepl("v2", variable)),
aes(x=year, y = value,
color = variable,
fill = variable)) +
geom_path() +
facet_wrap(~country_name, ncol=2) +
theme_bw() +
scale_x_continuous(breaks = axis_labels$breaks,
labels = axis_labels$labels) +
theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
geom_vline(data = data %>%
filter(is_start_leader_year) %>%
distinct(leader,value, is_start_leader_year, .keep_all = TRUE),
aes(xintercept = year)) +
labs(y = "Degree of constraint/corruption
(in standard deviations from mean,
0 is the mean in sample)", x = "Year") +
theme(legend.position = "bottom") +
guides(linetype = guide_legend(title = ""),
color = guide_legend(title = ""),
fill = guide_legend(title = ""))
ggplot(data = data %>%
filter(grepl("exconst", variable)),
aes(x=year, y = value,
color = variable,
fill = variable)) +
geom_path() +
facet_wrap(~country_name, ncol=2) +
theme_bw() +
scale_x_continuous(breaks = axis_labels$breaks,
labels = axis_labels$labels) +
theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
geom_vline(data = data %>%
filter(is_start_leader_year) %>%
distinct(leader,value, is_start_leader_year, .keep_all = TRUE),
aes(xintercept = year)) +
labs(y = "Degree of constraint/corruption
(in standard deviations from mean,
0 is the mean in sample)", x = "Year") +
theme(legend.position = "bottom") +
guides(linetype = guide_legend(title = ""),
color = guide_legend(title = ""),
fill = guide_legend(title = ""))
The graphs basically say that during Soviet times, legislative and executive constraints on the executive were greatly weakened. Executive corruption was at the mean in the sample, though it increased with Brezhnev (as we might have guessed from case knowledge), and it really shot upwards with the break up of the Soviet Union. At the same time, legislative and executive constraints increased until Putin came into office, when they began to decrease again.
The dataset of regime types by Magaloni, Chu, and Min (2013) contains two measures of personalism: one derived from the exconst
variable of the Polity IV dataset, and another one (lindex
) which they describe as follows:
the variable is essentially a Herfindahl index (sum of squared shares) using the name of the executive. For a given country-year in a unique regime (see reg_id), the following calculation is made: \(\sum_{i=1}^m(exec_i/n)^2\) where n is the age of the regime up to that year, and exec is the number of years that a unique executive i (out of a total m executives up to that year) has led the regime. As such, a regime led by only one person up through that year yields a personalism index of 1. A theoretical scenario where leadership changes every single year would yield \(1/n\). These calculations are made using the non-rounded values. We note that this is a relatively sensitive measure in the early/formative years of an individual regime, but we propose this is a useful way of considering personalism as an evolving attribute of a regime over time.
I use this lindex
variable only (since I directly included the exconst
variable, noted above):
personalism_data <- bind_rows(personalism_data, magaloni %>%
select(country_name, GWn, year, in_system, lindex) %>%
melt(id.vars = c("country_name", "GWn", "year", "in_system"), na.rm = TRUE))
Wahman, Teorell, and Hadenius (Wahman, Teorell, and Hadenius 2013) also propose a measure of personalism based on “mean executive turnover”: the number of “changes of the chief executive during the regime spell, divided by the number of years of regime spell duration”, according" according to their regime classification. In a highly personalized regime this should be zero, while it ranges up to 3 chief executives per year for regimes with significant personnel turnover:
personalism_data <- bind_rows(personalism_data, wahman_teorell %>%
select(country_name, GWn, year, persagg1ny, in_system) %>%
melt(id.vars = c("country_name", "GWn", "year", "in_system"), na.rm= TRUE))
These measures are not well correlated with the measures of executive constraint or with one another. The lindex
measure is also always 1 during the first year of the regime, which ensures it will always show “high” personalism at the time. This is perhaps justified as capturing the fact that new regimes are not yet highly institutionalized; every regime is highly personalized in its first year, until a regular transfer of power happens. But it is unintuitive, seemingly suggesting that both democratic and non-democratic regimes are equally personalized early on. At any rate, the lack of correlation between these measures indicates that they are at best measuring a different dimension of the phenomenon of personal rule than the constraints-based measures:
ggcorr(dcast(personalism_data, GWn + year + in_system ~ variable) %>%
select(-GWn:-in_system), label = TRUE,
label_round = 2)
It is also worth noting that both lindex
and persagg1ny
are highly sensitive to the particular periodization of regimes used. For example, using Archigos (Goemans, Gleditsch, and Chiozza 2009), we can reconstruct both the Wahman, Teorell, and Hadenius (2013) and the Magaloni, Chu, and Min (2013) indexes for the Geddes, Wright, and Frantz (2014) classification of political regimes:
cumulative_levels <- function(seq) {
seq <- as.factor(seq)
levels(seq) <- seq_along(levels(seq))
as.numeric(seq)
}
reconstruction <- magaloni %>%
select(country_name, GWn, year, in_system, lindex) %>%
full_join(magaloni_extended %>%
select(country_name, GWn, year, in_system, regime_nr)) %>%
full_join(wahman_teorell %>%
select(country_name, GWn, year, in_system, regime1ny, persagg1ny)) %>%
full_join(all_gwf_extended_yearly %>%
select(country_name, GWn, year, in_system, gwf_casename, gwf_full_regimetype)) %>%
full_join(leader_data_yearly) %>%
arrange(country_name, year, startdate) %>%
filter(!is.na(obsid), !is.na(gwf_casename)) %>%
group_by(gwf_casename) %>%
mutate(gwf_persagg1ny = (length(unique(obsid)) - 1)/length(unique(year))) %>%
ungroup()
## Joining, by = c("country_name", "GWn", "year", "in_system")
## Joining, by = c("country_name", "GWn", "year", "in_system")
## Joining, by = c("country_name", "GWn", "year", "in_system")
## Joining, by = c("country_name", "GWn", "year")
ggcorr(reconstruction %>%
select(gwf_persagg1ny, persagg1ny, lindex),
label = TRUE,
label_round = 2)
lindex_reconstruction <- reconstruction %>%
group_by(gwf_casename) %>%
arrange(year) %>%
mutate(m = cumulative_levels(obsid),
m = m - min(m) + 1,
max_year = max(year)) %>%
group_by(gwf_casename, obsid) %>%
mutate(min_year = min(year),
max_tenure = n()) %>%
group_by(country_name, gwf_casename, leader, m, max_tenure, obsid) %>%
do(data.frame(year = unique(.$min_year):unique(.$max_year))) %>%
mutate(exec_i = seq_along(year),
exec_i = ifelse(exec_i > max_tenure,
max_tenure,
exec_i)) %>%
group_by(gwf_casename) %>%
arrange(year) %>%
mutate(n = seq_along(year),
share = (exec_i/n)^2) %>%
group_by(country_name, gwf_casename, year) %>%
summarise(gwf_lindex = sum(share))
reconstruction <- left_join(reconstruction, lindex_reconstruction)
## Joining, by = c("country_name", "year", "gwf_casename")
ggcorr(reconstruction %>%
select(gwf_persagg1ny, persagg1ny, lindex, gwf_lindex),
label = TRUE,
label_round = 2)
The correlations between the original and reconstructed variables are only moderately strong, since the regime periodizations in the respective datasets of political regimes are not identical. For example, here is what original and reconstructed variables look for Russia:
data <- reconstruction %>%
filter(country_name %in% country) %>%
melt(measure.vars = c("gwf_persagg1ny", "persagg1ny", "lindex", "gwf_lindex"))
ggplot(data = data %>% filter(grepl("persa", variable)),
aes(x=year, y = value,
color = variable,
fill = variable)) +
geom_path() +
facet_wrap(~country_name, ncol=2) +
theme_bw() +
scale_x_continuous(breaks = axis_labels$breaks,
labels = axis_labels$labels) +
theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
geom_vline(data = data %>%
filter(is_start_leader_year) %>%
distinct(leader,value, is_start_leader_year, .keep_all = TRUE),
aes(xintercept = year)) +
labs(y = "Persagg1ny", x = "Year") +
theme(legend.position = "bottom") +
guides(linetype = guide_legend(title = ""),
color = guide_legend(title = ""),
fill = guide_legend(title = ""))
## Warning: Removed 55 rows containing missing values (geom_path).
ggplot(data = data %>% filter(grepl("lindex", variable)),
aes(x=year, y = value,
color = variable,
fill = variable)) +
geom_path() +
facet_wrap(~country_name, ncol=2) +
theme_bw() +
scale_x_continuous(breaks = axis_labels$breaks,
labels = axis_labels$labels) +
theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
geom_vline(data = data %>%
filter(is_start_leader_year) %>%
distinct(leader,value, is_start_leader_year, .keep_all = TRUE),
aes(xintercept = year)) +
labs(y = "Lindex", x = "Year") +
theme(legend.position = "bottom") +
guides(linetype = guide_legend(title = ""),
color = guide_legend(title = ""),
fill = guide_legend(title = ""))
## Warning: Removed 33 rows containing missing values (geom_path).
Because persagg1ny
is invariant over the life of a regime, it is insensitive to fluctuations in personal power; by this measure, Lenin, Stalin, and Brezhnev all have the same amount of personal power over the life of the Soviet regime, since the “personalism” of the regime is averaged throughout its entire duration. Similarly, because lindex
is always 1 at the beginning of a regime, the measure barely begins to capture Stalin’s personal power as his tenure lengthened. Despite these problems, we nevertheless include both lindex
and persagg1ny
in the construction of the personal power index; in any case the model will discount them when they are highly uncorrelated with the rest of the other measures.
personalism_data <- bind_rows(personalism_data, reconstruction %>%
select(country_name, GWn, year, in_system, gwf_lindex, gwf_persagg1ny) %>%
melt(id.vars = c("country_name","GWn","year", "in_system")))
personalism_data <- personalism_data %>%
filter(!is.na(value)) %>%
distinct()
ggcorr(dcast(personalism_data, country_name + GWn + year + in_system ~ variable) %>%
select(-country_name:-in_system), label = TRUE,
label_round = 2)
Finally, two datasets contain “all things considered” measures of whether a regime is “personal” (or has a personalistic component): Kailitz (2013) and Geddes, Wright, and Frantz (2014).
personalism_data <- bind_rows(personalism_data, kailitz_yearly %>%
select(country_name, GWn, year, in_system, personal) %>%
melt(id.vars = c("country_name", "GWn", "year", "in_system")))
all_gwf_extended_yearly <- all_gwf_extended_yearly %>%
select(country_name, GWn, year, in_system, gwf_full_regimetype) %>%
mutate(gwf_personal_single = grepl("^personal",gwf_full_regimetype),
gwf_personal_hybrid = grepl("personal",gwf_full_regimetype),
gwf_personal = gwf_personal_single + gwf_personal_hybrid) %>%
select(-gwf_personal_single,-gwf_personal_hybrid)
personalism_data <- bind_rows(personalism_data, all_gwf_extended_yearly %>%
select(-gwf_full_regimetype) %>%
melt(id.vars = c("country_name", "GWn", "year", "in_system")))
rm(all_gwf_extended_yearly)
Both of these measures represent coarse qualitative judgments, and are not perfectly correlated:
ggcorr(dcast(personalism_data, country_name + GWn + year + in_system ~ variable) %>%
select(gwf_personal, personal), label = TRUE,
label_round = 2)
Nevertheless, both add some information to our index of personal power, and are therefore both used. The total correlation matrix looks like this:
ggcorr(data = dcast(personalism_data, GWn + year + in_system ~ variable) %>%
select(exconst:v2xlg_legcon),
label = TRUE,
label_round = 2)
Before running the model, it is necessary to cut the continuous variables into a finite number of intervals. For entirely arbitrary reasons, I use 20 intervals. I also first transform the lindex
and persagg1ny
measures into percentile ranks. In the case of lindex
, this smooths out some of the spikes of personal power at the beginning of a regime.
personalism_data <- dcast(personalism_data, country_name + GWn + year + in_system ~ variable)
summary(personalism_data)
## country_name GWn year in_system
## Length:22597 Min. : 2.0 Min. :1741 Mode :logical
## Class :character 1st Qu.:220.0 1st Qu.:1908 FALSE:5420
## Mode :character Median :432.0 Median :1949 TRUE :17177
## Mean :436.3 Mean :1940 NA's :0
## 3rd Qu.:640.0 3rd Qu.:1985
## Max. :990.0 Max. :2015
##
## exconst gwf_lindex gwf_persagg1ny gwf_personal
## Min. :1.000 Min. :0.000 Min. :0.000 Min. :0.000
## 1st Qu.:1.000 1st Qu.:0.026 1st Qu.:0.036 1st Qu.:0.000
## Median :3.000 Median :0.217 Median :0.107 Median :0.000
## Mean :3.777 Mean :0.431 Mean :0.149 Mean :0.349
## 3rd Qu.:7.000 3rd Qu.:1.000 3rd Qu.:0.220 3rd Qu.:0.000
## Max. :7.000 Max. :1.000 Max. :0.985 Max. :2.000
## NA's :6310 NA's :13286 NA's :13286 NA's :13030
## lindex persagg1ny personal v2x_execorr
## Min. :0.114 Min. :0.000 Min. :0.000 Min. :0.011
## 1st Qu.:0.515 1st Qu.:0.050 1st Qu.:0.000 1st Qu.:0.166
## Median :1.000 Median :0.125 Median :0.000 Median :0.440
## Mean :0.762 Mean :0.170 Mean :0.062 Mean :0.453
## 3rd Qu.:1.000 3rd Qu.:0.250 3rd Qu.:0.000 3rd Qu.:0.726
## Max. :1.000 Max. :3.000 Max. :1.000 Max. :0.979
## NA's :17444 NA's :15904 NA's :12991 NA's :6268
## v2x_jucon v2xlg_legcon
## Min. :0.005 Min. :0.023
## 1st Qu.:0.267 1st Qu.:0.172
## Median :0.514 Median :0.450
## Mean :0.517 Mean :0.467
## 3rd Qu.:0.777 3rd Qu.:0.754
## Max. :0.992 Max. :0.987
## NA's :6268 NA's :9309
personalism_data <- personalism_data %>%
mutate_at(.funs = funs(unclass(cut(.,
breaks = 20,
include.lowest = TRUE,
right = FALSE,
ordered_result = TRUE))),
.cols = c("v2x_execorr", "v2xlg_legcon", "v2x_jucon"))
personalism_data <- personalism_data %>%
mutate_at(.funs = funs(unclass(cut(percent_rank(.),
20,
include.lowest=TRUE,
ordered_result=TRUE))),
.cols = c("lindex", "gwf_lindex", "persagg1ny", "gwf_persagg1ny"))
personalism_data <- personalism_data %>%
mutate_at(.funs = funs(as.numeric(unclass(factor(.,
ordered = TRUE)))),
.cols = c("v2x_execorr", "v2xlg_legcon", "v2x_jucon", "exconst",
"lindex", "gwf_lindex", "persagg1ny", "gwf_persagg1ny",
"personal", "gwf_personal"))
With these cuts, here is what the measures look like for Russia:
data <- left_join(personalism_data, leader_data_yearly) %>%
filter(country_name %in% country) %>%
melt(measure.vars = c("lindex",
"gwf_lindex",
"persagg1ny",
"gwf_persagg1ny",
"v2xlg_legcon",
"v2x_jucon",
"v2x_execorr",
"exconst"))
## Joining, by = c("country_name", "GWn", "year")
ggplot(data = data,
aes(x=year, y = value,
color = variable,
fill = variable)) +
geom_path() +
facet_wrap(~country_name, ncol=2) +
theme_bw() +
scale_x_continuous(breaks = axis_labels$breaks,
labels = axis_labels$labels) +
theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
geom_vline(data = data %>%
filter(is_start_leader_year) %>%
distinct(leader,value, is_start_leader_year, .keep_all = TRUE),
aes(xintercept = year)) +
labs(y = "Transformed variables", x = "Year") +
theme(legend.position = "bottom") +
guides(linetype = guide_legend(title = ""),
color = guide_legend(title = ""),
fill = guide_legend(title = ""))
## Warning: Removed 880 rows containing missing values (geom_path).
The correlations between the transformed variables are very similar to the correlations between the untransformed variables:
library(GGally)
ggcorr(data= personalism_data %>% select(exconst:v2xlg_legcon), label = TRUE, label_round = 2)
Finally we create the model. Model 1 is the one used in the book:
data_1 <- personalism_data %>%
melt(measure.vars = c("exconst",
"gwf_personal",
"lindex",
"persagg1ny",
"personal",
"v2x_execorr",
"v2x_jucon",
"v2xlg_legcon"),
na.rm = TRUE) %>%
dcast(country_name + GWn + year + in_system ~ variable)
library(mirt)
personal_model <- mirt(data_1 %>%
select(exconst,
gwf_personal,
lindex,
persagg1ny,
personal,
v2x_execorr,
v2x_jucon,
v2xlg_legcon),
model = 1,
itemtype = "graded",
SE = TRUE,
verbose = FALSE)
personal_model
##
## Call:
## mirt(data = data_1 %>% select(exconst, gwf_personal, lindex,
## persagg1ny, personal, v2x_execorr, v2x_jucon, v2xlg_legcon),
## model = 1, itemtype = "graded", SE = TRUE, verbose = FALSE)
##
## Full-information item factor analysis with 1 factor(s).
## Converged within 1e-04 tolerance after 29 EM iterations.
## mirt version: 1.21
## M-step optimizer: BFGS
## EM acceleration: Ramsay
## Number of rectangular quadrature: 61
##
## Information matrix estimated with method: crossprod
## Condition number of information matrix = 2575.065
## Second-order test: model is a possible local maximum
##
## Log-likelihood = -182105.3
## Estimated parameters: 109
## AIC = 364428.5; AICc = 364429.6
## BIC = 365303.3; SABIC = 364956.9
summary(personal_model)
## F1 h2
## exconst 0.848 0.719
## gwf_personal -0.743 0.552
## lindex -0.266 0.071
## persagg1ny 0.442 0.196
## personal -0.727 0.528
## v2x_execorr -0.770 0.593
## v2x_jucon 0.912 0.832
## v2xlg_legcon 0.850 0.723
##
## SS loadings: 4.214
## Proportion Var: 0.527
##
## Factor correlations:
##
## F1
## F1 1
In model 1, the latent factor is most closely correlated with the measures of executive constraint, though Kailitz and Geddes, Wright, and Frantz’s measures of personalism get some weight too.
Model 2 uses instead the constructed measures of lindex
and persagg1ny
created from GWF’s regime classification and the ARCHIGOS data:
data_2 <- personalism_data %>%
melt(measure.vars = c("exconst",
"gwf_personal",
"gwf_lindex",
"gwf_persagg1ny",
"personal",
"v2x_execorr",
"v2x_jucon",
"v2xlg_legcon"),
na.rm = TRUE) %>%
dcast(country_name + GWn + year + in_system ~ variable)
personal_model_2 <- mirt(data_2 %>%
select(v2x_execorr, v2xlg_legcon, v2x_jucon, exconst,
gwf_lindex, gwf_persagg1ny, personal, gwf_personal),
model = 1,
itemtype = "graded",
SE = TRUE,
verbose = FALSE)
personal_model_2
##
## Call:
## mirt(data = data_2 %>% select(v2x_execorr, v2xlg_legcon, v2x_jucon,
## exconst, gwf_lindex, gwf_persagg1ny, personal, gwf_personal),
## model = 1, itemtype = "graded", SE = TRUE, verbose = FALSE)
##
## Full-information item factor analysis with 1 factor(s).
## Converged within 1e-04 tolerance after 43 EM iterations.
## mirt version: 1.21
## M-step optimizer: BFGS
## EM acceleration: Ramsay
## Number of rectangular quadrature: 61
##
## Information matrix estimated with method: crossprod
## Condition number of information matrix = 1897.445
## Second-order test: model is a possible local maximum
##
## Log-likelihood = -199257.5
## Estimated parameters: 110
## AIC = 398734.9; AICc = 398736
## BIC = 399617.7; SABIC = 399268.1
summary(personal_model_2)
## F1 h2
## v2x_execorr -0.770 0.592
## v2xlg_legcon 0.840 0.705
## v2x_jucon 0.895 0.801
## exconst 0.855 0.731
## gwf_lindex -0.641 0.411
## gwf_persagg1ny 0.631 0.398
## personal -0.792 0.627
## gwf_personal -0.818 0.668
##
## SS loadings: 4.933
## Proportion Var: 0.617
##
## Factor correlations:
##
## F1
## F1 1
Model 2 puts a lot of weight on the GWF-based persagg1ny
measure.
Model 3 excludes the tenure-based measures of personal power completely:
data_3 <- personalism_data %>%
melt(measure.vars = c("exconst",
"gwf_personal",
"personal",
"v2x_execorr",
"v2x_jucon",
"v2xlg_legcon"),
na.rm = TRUE) %>%
dcast(country_name + GWn + year + in_system ~ variable)
personal_model_3 <- mirt(data_3 %>%
select(v2x_execorr, v2xlg_legcon, v2x_jucon, exconst,
personal, gwf_personal),
model = 1,
itemtype = "graded",
SE = TRUE,
verbose = FALSE)
personal_model_3
##
## Call:
## mirt(data = data_3 %>% select(v2x_execorr, v2xlg_legcon, v2x_jucon,
## exconst, personal, gwf_personal), model = 1, itemtype = "graded",
## SE = TRUE, verbose = FALSE)
##
## Full-information item factor analysis with 1 factor(s).
## Converged within 1e-04 tolerance after 184 EM iterations.
## mirt version: 1.21
## M-step optimizer: BFGS
## EM acceleration: Ramsay
## Number of rectangular quadrature: 61
##
## Information matrix estimated with method: crossprod
## Condition number of information matrix = 2525.262
## Second-order test: model is a possible local maximum
##
## Log-likelihood = -154163.4
## Estimated parameters: 72
## AIC = 308470.9; AICc = 308471.3
## BIC = 309048.7; SABIC = 308819.9
summary(personal_model_3)
## F1 h2
## v2x_execorr -0.774 0.599
## v2xlg_legcon 0.846 0.716
## v2x_jucon 0.920 0.847
## exconst 0.837 0.701
## personal -0.710 0.504
## gwf_personal -0.733 0.537
##
## SS loadings: 3.905
## Proportion Var: 0.651
##
## Factor correlations:
##
## F1
## F1 1
personal_scores <- fscores(personal_model, full.scores = TRUE, full.scores.SE = TRUE) %>%
data.frame() %>%
dplyr::rename(z1 = F1, se.z1 = SE_F1) %>%
mutate(pct975 = z1 + 1.96 * se.z1, pct025 = z1 - 1.96 * se.z1)
personal_scores <- bind_cols(data_1 %>% select(country_name, GWn, year), personal_scores)
personal_scores_2 <- fscores(personal_model_2, full.scores = TRUE, full.scores.SE = TRUE) %>%
data.frame() %>%
dplyr::rename(z1 = F1, se.z1 = SE_F1) %>%
mutate(pct975 = z1 + 1.96 * se.z1, pct025 = z1 - 1.96 * se.z1)
personal_scores_2 <- bind_cols(data_2 %>% select(country_name, GWn, year), personal_scores_2)
personal_scores_3 <- fscores(personal_model_3, full.scores = TRUE, full.scores.SE = TRUE) %>%
data.frame() %>%
dplyr::rename(z1 = F1, se.z1 = SE_F1) %>%
mutate(pct975 = z1 + 1.96 * se.z1, pct025 = z1 - 1.96 * se.z1)
personal_scores_3 <- bind_cols(data_3 %>% select(country_name, GWn, year), personal_scores_3)
personal_scores <- bind_rows(personal_scores,
personal_scores_2,
personal_scores_3,
.id = "model")
rm(data_1, data_2, personal_scores_2, personal_scores_3)
The index right now is inverted - shows higher values of personal power as lower numbers - so we typically want to reverse it:
personal_scores <- personal_scores %>%
mutate(z1 = -z1,
pct975 = -pct975,
pct025 = -pct025)
With that adjustment, this is what these scores look like for Russia:
data <- left_join(personal_scores, leader_data_yearly) %>%
filter(country_name %in% country)
## Joining, by = c("country_name", "GWn", "year")
ggplot(data = data,
aes(x=year, y = z1,
ymin = pct025,
ymax = pct975,
color = model,
fill = model)) +
geom_path() +
geom_ribbon(alpha = 0.3) +
facet_wrap(~country_name, ncol=2) +
theme_bw() +
scale_x_continuous(breaks = axis_labels$breaks,
labels = axis_labels$labels) +
theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
geom_vline(data = data %>%
filter(is_start_leader_year) %>%
distinct(leader, is_start_leader_year, .keep_all = TRUE),
aes(xintercept = year)) +
labs(y = "Index score", x = "Year") +
theme(legend.position = "bottom") +
guides(linetype = guide_legend(title = ""),
color = guide_legend(title = "Model"),
fill = guide_legend(title = "Model"))
The scores from each of these models are in any case extremely well correlated:
data <- personal_scores %>%
mutate(model = plyr::mapvalues(model,
from = c(1,2,3),
to = c("Model_1_in_book","Model_2","Model_3"))) %>%
dcast(country_name + GWn + year ~ model, value.var = "z1") %>%
select(Model_1_in_book:Model_3)
ggcorr(data = data, label = TRUE, label_round = 2)
We can visualize the full set of scores (this takes a long time to run, so it is not run by default; set eval = TRUE
to run the chunk when compiling the vignette):
library(lubridate)
# Visual test
leader_data <- archigos %>%
group_by(GWn, leader, startdate, enddate) %>%
summarise(year = year(startdate)) %>%
group_by(GWn, year) %>%
filter(enddate == max(enddate),
startdate == max(startdate))
personal_data <- left_join(personal_scores,leader_data) %>%
group_by(country_name, model) %>%
arrange(model, country_name, year) %>%
ungroup()
## Joining, by = c("GWn", "year")
for(country in unique(personal_data$country_name)) {
data <- personal_data %>% filter(country_name %in% country, year > 1900)
if(length(data$year[!is.na(data$leader)]) > 0) {
p <- ggplot(data = data, aes(x=year,
y = z1,
ymin = pct025,
ymax = pct975,
color = model,
fill = model)) +
geom_path() +
geom_ribbon(alpha=0.2) +
theme_bw() +
scale_x_continuous(breaks = data$year[!is.na(data$leader) & data$model == 1 ],
labels = paste(data$year[!is.na(data$leader) & data$model == 1 ],
data$leader[!is.na(data$leader) & data$model == 1 ])) +
theme(axis.text.x = element_text(angle = 90,
hjust = 1,
vjust = 0.5,
size = 5)) +
labs(x = "") +
facet_wrap(~country_name, scales="free")
print(p)
}
}
Coppedge, Michael, John Gerring, Staffan I. Lindberg, Svend-Erik Skaaning, Jan Teorell, David Altman, Michael Bernhard, et al. 2016. “V-Dem [Country-Year/Country-Date] Dataset, Version 6.1.” Dataset. Varieties of Democracy (V-Dem) Project. https://www.v-dem.net/en/data/data-version-6-1/.
Geddes, Barbara, Joseph Wright, and Erica Frantz. 2014. “Autocratic Breakdown and Regime Transitions: A New Data Set.” Perspectives on Politics 12 (1): 313–31. doi:10.1017/S1537592714000851.
Goemans, Henk, Kristian Gleditsch, and Giacomo Chiozza. 2009. “Introducing Archigos: A Dataset of Political Leaders.” Journal of Peace Research 46 (2): 269–83.
Kailitz, Steffen. 2013. “Classifying Political Regimes Revisited: Legitimation and Durability.” Democratization 20 (1): 39–60. doi:10.1080/13510347.2013.738861.
Magaloni, Beatriz, Jonathan Chu, and Eric Min. 2013. “Autocracies of the World, 1950-2012 (Version 1.0).” Dataset. http://cddrl.fsi.stanford.edu/research/autocracies_of_the_world_dataset.
Wahman, Michael, Jan Teorell, and Axel Hadenius. 2013. “Authoritarian Regime Types Revisited: Updated Data in Comparative Perspective.” Contemporary Politics 19 (1): 19–34. https://sites.google.com/site/authoritarianregimedataset/data.