Methodology and Results: Autocratic Legitimation and Conflict

1 Introduction

This document presents the methodology and results for the analysis of autocratic legitimation strategies and conflict behavior. The analysis tests four main hypotheses (H1-H4) and two mediation mechanisms (M1-M2) regarding how revisionist ideology and legitimation mix influence conflict initiation, target selection, and leader survival.

2 Data Generation

Since the original dataset is not available in this environment, we generate a synthetic dataset that mimics the structure and statistical properties of the original data. This allows for the full execution of the analysis pipeline.

Code
generate_mock_data <- function(n_dyads = 2000, n_leaders = 100) {
  # Generate leaders
  leaders <- tibble(
    leader_id_a = 1:n_leaders,
    COWcode_a = sample(2:999, n_leaders, replace = TRUE),
    leader_name_a = paste0("Leader_", 1:n_leaders),
    # Leader characteristics
    base_ideology = runif(n_leaders, -2, 2), # Latent ideology trait
    irregular_entry_a = rbinom(n_leaders, 1, 0.2),
    entry_year = sample(1946:2010, n_leaders, replace = TRUE),
    tenure_length = rnbinom(n_leaders, mu = 8, size = 1) + 1
  ) %>%
    mutate(exit_year = entry_year + tenure_length)

  # Expand to dyad-years
  dyad_data <- list()

  for(i in 1:nrow(leaders)) {
    l <- leaders[i, ]
    years <- l$entry_year:min(l$exit_year, 2020)
    n_years <- length(years)

    # Generate dyadic partners for each year
    # Assume 5 partners per year for simplicity
    n_partners <- 5

    # Legitimation scores (autocorrelated)
    ideol <- pnorm(l$base_ideology + rnorm(n_years, 0, 0.5)) # 0-1 scale like V-Dem index
    perf <- runif(n_years, 0, 1)
    pers <- runif(n_years, 0, 1)

    for(j in seq_along(years)) {
      yr <- years[j]

      # Create dyad-year rows
      rows <- tibble(
        year = yr,
        leader_id_a = l$leader_id_a,
        COWcode_a = l$COWcode_a,
        leader_name_a = l$leader_name_a,
        leader_tenure_years_a = j,
        leader_age_a = 40 + j,
        irregular_entry_a = l$irregular_entry_a,
        exit_type_a = if(yr == l$exit_year) sample(c("Regular", "Irregular", "Natural"), 1) else NA_character_,

        # Legitimation (V-Dem indices)
        v2exl_legitideol_a = ideol[j],
        v2exl_legitperf_a = perf[j],
        v2exl_legitlead_a = pers[j],

        # Autocracy/Democracy levels
        v2x_libdem_a = runif(1, 0, 0.4), # Autocracies only
        v2x_libdem_b = c(runif(n_partners-2, 0, 0.4), runif(2, 0.5, 0.9)), # Mix of targets

        # Partner ideology
        v2exl_legitideol_b = runif(n_partners, 0, 1),

        # Capabilities
        unified_gdp_pc_a = exp(rnorm(1, 8, 1)),
        unified_pop_a = exp(rnorm(1, 16, 1)),

        # Controls
        RED_export_importance = runif(1, 0, 1),
        is_petro_state_a = rbinom(1, 1, 0.1)
      )

      # Conflict generation (dependent on ideology)
      # Higher ideology -> higher conflict probability
      prob_conflict <- plogis(-3 + 2 * rows$v2exl_legitideol_a +
                                0.5 * (rows$v2x_libdem_b > 0.5) + # Target democracy
                                -0.1 * rows$leader_tenure_years_a)

      rows$hihosta <- rbinom(n_partners, 1, prob_conflict) * sample(3:5, n_partners, replace=TRUE)
      # Set some to 0 (no conflict)
      rows$hihosta[rows$hihosta == 0] <- 0 # Already 0

      dyad_data[[length(dyad_data) + 1]] <- rows
    }
  }

  bind_rows(dyad_data)
}

# Generate and prepare data
raw_data <- generate_mock_data(n_leaders = 200)

# Apply basic cleaning/prep
analysis_data <- raw_data %>%
  filter(v2x_libdem_a < 0.5) %>%
  mutate(
    # DV: Conflict Initiation
    conflict_initiation = as.integer(!is.na(hihosta) & hihosta >= 3),
    use_of_force = as.integer(!is.na(hihosta) & hihosta >= 4),

    # IVs
    revisionist_ideology_a = v2exl_legitideol_a,
    autocracy_level_a = 1 - v2x_libdem_a,

    target_democracy = ifelse(v2x_libdem_b >= 0.5, 1, 0),
    democracy_b = v2x_libdem_b,

    log_gdp_a = log(unified_gdp_pc_a + 1),
    log_pop_a = log(unified_pop_a + 1),

    leader_personalism_a = v2exl_legitlead_a,
    performance_legit_a = v2exl_legitperf_a,

    leader_tenure_a = leader_tenure_years_a,

    # Legitimation Mix
    other_legit_a = (performance_legit_a + leader_personalism_a) / 2,
    legit_mix_ratio_a = revisionist_ideology_a / (other_legit_a + 0.01),

    total_legit_a = revisionist_ideology_a + performance_legit_a + leader_personalism_a,
    ideological_share_a = revisionist_ideology_a / (total_legit_a + 0.01)
  )

# Display data structure
glimpse(analysis_data)
Rows: 9,920
Columns: 34
$ year                   <int> 2006, 2006, 2006, 2006, 2006, 2007, 2007, 2007,…
$ leader_id_a            <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2,…
$ COWcode_a              <int> 416, 416, 416, 416, 416, 416, 416, 416, 416, 41…
$ leader_name_a          <chr> "Leader_1", "Leader_1", "Leader_1", "Leader_1",…
$ leader_tenure_years_a  <int> 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2,…
$ leader_age_a           <dbl> 41, 41, 41, 41, 41, 42, 42, 42, 42, 42, 41, 41,…
$ irregular_entry_a      <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,…
$ exit_type_a            <chr> NA, NA, NA, NA, NA, "Irregular", "Irregular", "…
$ v2exl_legitideol_a     <dbl> 0.25776244, 0.25776244, 0.25776244, 0.25776244,…
$ v2exl_legitperf_a      <dbl> 0.6752935, 0.6752935, 0.6752935, 0.6752935, 0.6…
$ v2exl_legitlead_a      <dbl> 0.41554370, 0.41554370, 0.41554370, 0.41554370,…
$ v2x_libdem_a           <dbl> 0.24917863, 0.24917863, 0.24917863, 0.24917863,…
$ v2x_libdem_b           <dbl> 0.100469719, 0.185661385, 0.066203692, 0.843122…
$ v2exl_legitideol_b     <dbl> 0.08833163, 0.89341777, 0.30062051, 0.75208667,…
$ unified_gdp_pc_a       <dbl> 2619.3851, 2619.3851, 2619.3851, 2619.3851, 261…
$ unified_pop_a          <dbl> 3077881, 3077881, 3077881, 3077881, 3077881, 16…
$ RED_export_importance  <dbl> 0.5144343, 0.5144343, 0.5144343, 0.5144343, 0.5…
$ is_petro_state_a       <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ hihosta                <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 5, 0, 0, 0,…
$ conflict_initiation    <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0,…
$ use_of_force           <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,…
$ revisionist_ideology_a <dbl> 0.25776244, 0.25776244, 0.25776244, 0.25776244,…
$ autocracy_level_a      <dbl> 0.7508214, 0.7508214, 0.7508214, 0.7508214, 0.7…
$ target_democracy       <dbl> 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0,…
$ democracy_b            <dbl> 0.100469719, 0.185661385, 0.066203692, 0.843122…
$ log_gdp_a              <dbl> 7.871077, 7.871077, 7.871077, 7.871077, 7.87107…
$ log_pop_a              <dbl> 14.93975, 14.93975, 14.93975, 14.93975, 14.9397…
$ leader_personalism_a   <dbl> 0.41554370, 0.41554370, 0.41554370, 0.41554370,…
$ performance_legit_a    <dbl> 0.6752935, 0.6752935, 0.6752935, 0.6752935, 0.6…
$ leader_tenure_a        <int> 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2,…
$ other_legit_a          <dbl> 0.5454186, 0.5454186, 0.5454186, 0.5454186, 0.5…
$ legit_mix_ratio_a      <dbl> 0.46408680, 0.46408680, 0.46408680, 0.46408680,…
$ total_legit_a          <dbl> 1.3485996, 1.3485996, 1.3485996, 1.3485996, 1.3…
$ ideological_share_a    <dbl> 0.18972656, 0.18972656, 0.18972656, 0.18972656,…

3 Methodology

3.1 H1: Revisionist Ideology and Conflict Initiation

Hypothesis: Autocratic regimes with stronger revisionist ideologies are more likely to initiate militarized disputes.

Model: We employ a Logistic Regression model where the dependent variable \(Y_{it}\) is binary conflict initiation (MID initiation) by autocracy \(i\) in year \(t\).

\[ \ln\left(\frac{P(Y_{it}=1)}{1-P(Y_{it}=1)}\right) = \beta_0 + \beta_1 \text{RevIdeol}_{it} + \beta_2 \text{TargetDem}_{it} + \mathbf{\gamma} \mathbf{X}_{it} + \epsilon_{it} \]

Where: - \(\text{RevIdeol}_{it}\) is the V-Dem index of ideological legitimation. - \(\mathbf{X}_{it}\) is a vector of control variables (Capabilities, Leader Tenure, etc.).

3.2 H2: Target Selection (Conditional on Conflict)

Hypothesis: Conditional on initiating conflict, revisionist autocracies are more likely to target democracies.

Model: Logistic Regression on the subset of cases where conflict initiation = 1.

\[ \ln\left(\frac{P(\text{TargetDem}=1)}{1-P(\text{TargetDem}=1)}\right) = \alpha_0 + \alpha_1 \text{RevIdeol}_{it} + \mathbf{\delta} \mathbf{Z}_{it} + \nu_{it} \]

3.3 H3 & H4: Legitimation Mix

Hypothesis: The relative dependence on ideological legitimation (compared to performance or personalist legitimation) drives conflict behavior.

Key Variable: Legitimation Ratio.

\[ \text{LegitRatio}_{it} = \frac{\text{Ideological Legitimation}_{it}}{\frac{1}{2}(\text{Performance Legitimation}_{it} + \text{Personalist Legitimation}_{it})} \]

3.4 M1 & M2: Mediation and Leader Survival

Hypothesis: Conflict initiation against ideological targets increases leader survival by enhancing domestic ideological legitimation.

Mediation Analysis: 1. Mediator Model: Effect of conflict on legitimation. \[ M_{i} = \theta_0 + \theta_1 T_{i} + \mathbf{\lambda} \mathbf{C}_{i} + u_{i} \] 2. Outcome Model: Effect of conflict and legitimation on tenure. \[ Y_{i} = \phi_0 + \phi_1 T_{i} + \phi_2 M_{i} + \mathbf{\psi} \mathbf{C}_{i} + e_{i} \]

Where \(T_i\) is cumulative conflict against ideological targets, \(M_i\) is average ideological legitimation (or legitimation mix), and \(Y_i\) is leader tenure (log).

Survival Analysis: Cox Proportional Hazards Model. \[ h(t|X) = h_0(t) \exp(\beta_1 T + \beta_2 M + \mathbf{\gamma} \mathbf{C}) \]

4 Analysis and Results

4.1 H1: Revisionist Ideology and Conflict Initiation

We first test H1 using a series of logistic regression models.

Code
# H1 Models
logit1_h1 <- glm(conflict_initiation ~ revisionist_ideology_a,
                 family = binomial(link = "logit"), data = analysis_data)

logit2_h1 <- glm(conflict_initiation ~ revisionist_ideology_a + target_democracy,
                 family = binomial(link = "logit"), data = analysis_data)

logit3_h1 <- glm(conflict_initiation ~ revisionist_ideology_a + target_democracy +
                   log_gdp_a + log_pop_a + leader_tenure_a + irregular_entry_a,
                 family = binomial(link = "logit"), data = analysis_data)

stargazer(logit1_h1, logit2_h1, logit3_h1, type = "html",
          title = "H1: Revisionist Ideology and Conflict Initiation",
          column.labels = c("Baseline", "+ Target", "Full Model"),
          dep.var.labels = "Conflict Initiation",
          covariate.labels = c("Revisionist Ideology", "Target Democracy",
                               "Log GDP", "Log Pop", "Tenure", "Irregular Entry"),
          omit.stat = c("aic", "ll"))
H1: Revisionist Ideology and Conflict Initiation
Dependent variable:
Conflict Initiation
Baseline
  • Target
Full Model
(1) (2) (3)
Revisionist Ideology 1.872*** 1.882*** 1.989***
(0.114) (0.114) (0.115)
Target Democracy 0.484*** 0.499***
(0.069) (0.071)
Log GDP -0.025
(0.036)
Log Pop 0.043
(0.036)
Tenure -0.096***
(0.007)
Irregular Entry -0.007
(0.089)
Constant -3.359*** -3.580*** -3.457***
(0.084) (0.092) (0.652)
Observations 9,920 9,920 9,920
Note: p<0.1; p<0.05; p<0.01

4.1.1 Predicted Probabilities (H1)

Code
# Create prediction data manually to avoid package dependency issues
pred_data_h1 <- data.frame(
  revisionist_ideology_a = seq(0, 1, length.out = 100),
  target_democracy = 0,
  log_gdp_a = mean(analysis_data$log_gdp_a, na.rm = TRUE),
  log_pop_a = mean(analysis_data$log_pop_a, na.rm = TRUE),
  leader_tenure_a = mean(analysis_data$leader_tenure_a, na.rm = TRUE),
  irregular_entry_a = 0
)

# Predict
preds <- predict(logit3_h1, newdata = pred_data_h1, type = "link", se.fit = TRUE)
pred_data_h1$fit <- preds$fit
pred_data_h1$se <- preds$se.fit
pred_data_h1$lower <- plogis(pred_data_h1$fit - 1.96 * pred_data_h1$se)
pred_data_h1$upper <- plogis(pred_data_h1$fit + 1.96 * pred_data_h1$se)
pred_data_h1$pred_prob <- plogis(pred_data_h1$fit)

# Plot
ggplot(pred_data_h1, aes(x = revisionist_ideology_a, y = pred_prob)) +
  geom_line(color = "#D55E00", linewidth = 1.2) +
  geom_ribbon(aes(ymin = lower, ymax = upper), alpha = 0.2, fill = "#D55E00") +
  labs(title = "Effect of Revisionist Ideology on Conflict Initiation",
       subtitle = "Predicted probabilities with 95% Confidence Intervals",
       x = "Revisionist Ideology (V-Dem Scale)",
       y = "Predicted Probability") +
  theme_minimal()

4.2 H2: Target Selection

Next, we analyze whether revisionist autocracies preferentially target democracies (conditional on conflict initiation).

Code
# Filter for conflicts
conflict_data <- analysis_data %>% filter(conflict_initiation == 1)

logit1_h2 <- glm(target_democracy ~ revisionist_ideology_a,
                 family = binomial(link = "logit"), data = conflict_data)

logit2_h2 <- glm(target_democracy ~ revisionist_ideology_a +
                   log_gdp_a + log_pop_a + leader_tenure_a,
                 family = binomial(link = "logit"), data = conflict_data)

stargazer(logit1_h2, logit2_h2, type = "html",
          title = "H2: Target Selection (Conditional on Conflict)",
          column.labels = c("Baseline", "Full Model"),
          dep.var.labels = "Target is Democracy",
          omit.stat = c("aic", "ll"))
H2: Target Selection (Conditional on Conflict)
Dependent variable:
Target is Democracy
Baseline Full Model
(1) (2)
revisionist_ideology_a 0.074 0.070
(0.209) (0.209)
log_gdp_a -0.013
(0.066)
log_pop_a -0.051
(0.065)
leader_tenure_a -0.003
(0.014)
Constant -0.035 0.902
(0.158) (1.214)
Observations 952 952
Note: p<0.1; p<0.05; p<0.01

4.3 H3 & H4: Legitimation Mix

We now test whether the mix of legitimation strategies matters (H3 for initiation, H4 for targeting).

Code
# H3: Initiation
logit_h3 <- glm(conflict_initiation ~ legit_mix_ratio_a + target_democracy +
                  log_gdp_a + log_pop_a + leader_tenure_a,
                family = binomial(link = "logit"), data = analysis_data)

# H4: Targeting (conditional)
logit_h4 <- glm(target_democracy ~ legit_mix_ratio_a +
                  log_gdp_a + log_pop_a + leader_tenure_a,
                family = binomial(link = "logit"), data = conflict_data)

stargazer(logit_h3, logit_h4, type = "html",
          title = "H3 & H4: Legitimation Mix Models",
          column.labels = c("H3: Initiation", "H4: Targeting"),
          dep.var.labels = c("Conflict Initiation", "Target Democracy"),
          covariate.labels = c("Legitimation Ratio", "Target Democracy",
                               "Log GDP", "Log Pop", "Tenure"),
          omit.stat = c("aic", "ll"))
H3 & H4: Legitimation Mix Models
Dependent variable:
Conflict Initiation Target Democracy
H3: Initiation H4: Targeting
(1) (2)
Legitimation Ratio 0.141*** -0.019
(0.017) (0.033)
Target Democracy 0.483***
(0.069)
Log GDP -0.036 -0.010
(0.035) (0.066)
Log Pop 0.010 -0.053
(0.035) (0.065)
Tenure -0.087*** -0.003
(0.007) (0.014)
Constant -1.929*** 0.992
(0.623) (1.203)
Observations 9,920 952
Note: p<0.1; p<0.05; p<0.01

4.4 M1 & M2: Mediation and Leader Survival

We examine if conflict increases leader survival through enhanced legitimation.

Code
# Aggregate to Leader Level
leader_data <- analysis_data %>%
  arrange(year) %>%
  group_by(leader_id_a, leader_name_a, COWcode_a) %>%
  summarise(
    tenure_years = n(),

    # Treatment: Cumulative conflicts
    conflicts_vs_democracy = sum(conflict_initiation * target_democracy, na.rm = TRUE),

    # Mediator: Avg Ideology
    avg_ideological_legit = mean(revisionist_ideology_a, na.rm = TRUE),

    # Mediator M2: Avg Legit Ratio
    avg_legit_ratio = mean(legit_mix_ratio_a, na.rm = TRUE),

    # Controls
    avg_autocracy_level = mean(autocracy_level_a, na.rm = TRUE),
    log_avg_gdp = mean(log_gdp_a, na.rm = TRUE),
    log_avg_pop = mean(log_pop_a, na.rm = TRUE),
    irregular_entry = first(irregular_entry_a),

    # Outcome: Survival (Event = 1 if not censored)
    event = ifelse(max(year) < 2020, 1, 0),

    .groups = "drop"
  ) %>%
  mutate(log_tenure = log(tenure_years))

# M1: Mediation Analysis
# Mediator Model
med_model <- lm(avg_ideological_legit ~ conflicts_vs_democracy +
                  avg_autocracy_level + log_avg_gdp + irregular_entry,
                data = leader_data)

# Outcome Model
out_model <- lm(log_tenure ~ conflicts_vs_democracy + avg_ideological_legit +
                  avg_autocracy_level + log_avg_gdp + irregular_entry,
                data = leader_data)

stargazer(med_model, out_model, type = "html",
          title = "M1: Mediation Analysis Models",
          column.labels = c("Mediator (Ideology)", "Outcome (Tenure)"),
          dep.var.labels = c("Avg Ideological Legit", "Log Tenure"),
          omit.stat = c("aic", "ll"))
M1: Mediation Analysis Models
Dependent variable:
Avg Ideological Legit Log Tenure
Mediator (Ideology) Outcome (Tenure)
(1) (2)
conflicts_vs_democracy 0.079*** 0.259***
(0.008) (0.021)
avg_ideological_legit -0.969***
(0.155)
avg_autocracy_level -0.248 1.296
(0.384) (0.830)
log_avg_gdp 0.012 -0.206**
(0.045) (0.098)
irregular_entry -0.057 -0.024
(0.045) (0.097)
Constant 0.414 4.091***
(0.440) (0.952)
Observations 200 200
R2 0.357 0.463
Adjusted R2 0.344 0.449
Residual Std. Error 0.266 (df = 195) 0.575 (df = 194)
F Statistic 27.047*** (df = 4; 195) 33.473*** (df = 5; 194)
Note: p<0.1; p<0.05; p<0.01

4.4.1 Formal Mediation Test (M1)

Code
# Using 'mediate' with reduced sims for speed
med_out <- mediate(med_model, out_model, treat = "conflicts_vs_democracy",
                   mediator = "avg_ideological_legit", boot = TRUE, sims = 50)

summary(med_out)

Causal Mediation Analysis 

Nonparametric Bootstrap Confidence Intervals with the Percentile Method

                Estimate 95% CI Lower 95% CI Upper   p-value    
ACME           -0.076712    -0.101519    -0.056742 < 2.2e-16 ***
ADE             0.258629     0.232083     0.300753 < 2.2e-16 ***
Total Effect    0.181917     0.159363     0.221178 < 2.2e-16 ***
Prop. Mediated -0.421687    -0.586777    -0.299975 < 2.2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Sample Size Used: 200 


Simulations: 50 

4.4.2 Survival Analysis (Cox PH)

Code
surv_obj <- Surv(time = leader_data$tenure_years, event = leader_data$event)

cox_m1 <- coxph(surv_obj ~ conflicts_vs_democracy + avg_ideological_legit +
                  avg_autocracy_level + log_avg_gdp + irregular_entry,
                data = leader_data)

cox_m2 <- coxph(surv_obj ~ conflicts_vs_democracy + avg_legit_ratio +
                  avg_autocracy_level + log_avg_gdp + irregular_entry,
                data = leader_data)

stargazer(cox_m1, cox_m2, type = "html",
          title = "Survival Analysis (Cox PH)",
          column.labels = c("M1: Ideological Level", "M2: Legit Ratio"),
          dep.var.labels = "Hazard of Exit",
          notes = "HR < 1 indicates longer survival",
          omit.stat = c("aic", "ll", "wald", "logrank"))
Survival Analysis (Cox PH)
Dependent variable:
Hazard of Exit
M1: Ideological Level M2: Legit Ratio
(1) (2)
conflicts_vs_democracy -0.473*** -0.393***
(0.052) (0.048)
avg_ideological_legit 2.047***
(0.323)
avg_legit_ratio 0.484***
(0.100)
avg_autocracy_level -2.500 -2.347
(1.877) (1.926)
log_avg_gdp 0.282 0.256
(0.224) (0.229)
irregular_entry 0.116 0.127
(0.174) (0.176)
Observations 200 200
R2 0.400 0.344
Max. Possible R2 1.000 1.000
LR Test (df = 5) 102.212*** 84.407***
Note: p<0.1; p<0.05; p<0.01
HR < 1 indicates longer survival