Replication Materials

This repository provides the data and code required to reproduce the analyses and figures reported in “Do democracies prefer to support invaded countries that are democratic?” All scripts are written in R and are organized to mirror the structure of the paper and Supplementary Information.

Required R Packages

We conducted the analyses in R (Version 4.4.2). The packages listed below are needed to reproduce the results. You can install any missing packages with the code snippet provided. We recommend using renv to snapshot and restore the exact package versions.

library(broom) #Ver.1.0.7
library(flextable) #Ver.0.9.7
library(interactions) #Ver.
library(lubridate) #Ver.1.2.0
library(moments) #Ver.0.14.1
library(officer) #Ver.0.6.7
library(patchwork) #Ver.1.3.0
library(psych) #Ver.2.4.12
library(scales) #Ver.1.4.0
library(stargazer) #Ver.5.2.3
library(tidyverse) #Ver.2.0.0
library(visreg) #Ver.2.7.0
library(vtable) #Ver.1.4.8

Setting Variables

Setting variables for the Study 1

security <- read.csv("security.csv") %>%
  filter(Q6.1_10 == 2) %>%
  mutate(
    across(
      starts_with("Q6.1_"),
      ~ case_when(
        . == 1 ~ 5,
        . == 2 ~ 4,
        . == 3 ~ 3,
        . == 4 ~ 2,
        . == 5 ~ 1,
        TRUE   ~ NA_real_
      )), 
    manipulation_pass = case_when(
      Q3.2 == 1 & Q7.1 == 3 ~ TRUE,   
      Q4.2 == 1 & Q7.1 == 1 ~ TRUE,  
      Q5.2 == 1 & Q7.1 == 2 ~ TRUE,  
      TRUE                   ~ FALSE
    ),
    group = case_when(
      Q3.2 == 1 ~ "Control",
      Q4.2 == 1 ~ "Democracy",
      Q5.2 == 1 ~ "Authoritarian",
      TRUE      ~ NA_character_
    ),
    group_race = case_when(
      Q11.2 == 1 ~ "Democracy_White",
      Q12.2 == 1 ~ "Democracy_Asian",
      Q13.2 == 1 ~ "Authoritarian_White",
      Q14.2 == 1 ~ "Authoritarian_Asian",
      TRUE       ~ NA_character_
    ),
    constitution = if_else(Q8.1 == 1, 1, 0),
    ideology       = Q8.2_1,
    ideology_group = case_when(
      ideology <= 3                       ~ "Liberal",
      ideology >= 4 & ideology <= 6       ~ "Neutral",
      ideology >= 7                       ~ "Conservative",
      TRUE                                ~ NA_character_
    ),
    psu = case_when(
      Q2.1 %in% c(1, 4)   ~ "In-partisans",
      Q2.1 %in% 2:11      ~ "Out-partisans",
      Q2.1 == 12          ~ "Independents",
      TRUE                ~ NA_character_
    ),
    psu_rul   = case_when(Q2.1 %in% c(1,4)    ~ 1,
                          Q2.1 %in% 2:12     ~ 0,
                          TRUE               ~ NA_real_),
    psu_op    = case_when(Q2.1 %in% 2:11      ~ 1,
                          Q2.1 %in% c(1,4,12)~ 0,
                          TRUE               ~ NA_real_),
    psu_indep = case_when(Q2.1 == 12          ~ 1,
                          Q2.1 %in% 1:11     ~ 0,
                          TRUE               ~ NA_real_),
    female    = if_else(Q17.2 == 2, 1, 0),
    age       = Q17.3 + 17,
    education = if_else(Q17.4 >= 5, NA_real_, as.numeric(Q17.4)),
    income    = Q17.5_1,
    culture1 = case_when(Q8.5_1 == 1 ~ 5,
                         Q8.5_1 == 2 ~ 4,
                         Q8.5_1 == 3 ~ 3,
                         Q8.5_1 == 4 ~ 2,
                         Q8.5_1 == 5 ~ 1,
                         TRUE        ~ NA_real_),
    culture2 = case_when(Q8.5_2 == 1 ~ 5,
                         Q8.5_2 == 2 ~ 4,
                         Q8.5_2 == 3 ~ 3,
                         Q8.5_2 == 4 ~ 2,
                         Q8.5_2 == 5 ~ 1,
                         TRUE        ~ NA_real_),
    culture3 = case_when(Q8.5_3 == 1 ~ 5,
                         Q8.5_3 == 2 ~ 4,
                         Q8.5_3 == 3 ~ 3,
                         Q8.5_3 == 4 ~ 2,
                         Q8.5_3 == 5 ~ 1,
                         TRUE        ~ NA_real_),
    culture4 = case_when(Q8.5_4 == 1 ~ 5,
                         Q8.5_4 == 2 ~ 4,
                         Q8.5_4 == 3 ~ 3,
                         Q8.5_4 == 4 ~ 2,
                         Q8.5_4 == 5 ~ 1,
                         TRUE        ~ NA_real_)
  ) %>%
  rowwise() %>%
  mutate(culture = mean(c(culture1, culture2, culture3, culture4), na.rm = FALSE)) %>%
  ungroup() %>%
  mutate(culture_group = if_else(culture < 12, "Neutral", "Superiority"))  %>%
  filter(!if_any(paste0("Q7_", 1:6), is.na)) %>%
  { 
    fa_res <- fa(select(., Q7_1:Q7_6),
                 nfactors = 2,
                 rotate   = "varimax",
                 fm       = "ml")
    scores <- factor.scores(select(., Q7_1:Q7_6), fa_res)$scores
    bind_cols(., as_tibble(scores))
  }  %>%
  mutate(
    patr_group = cut(ML1,
                     breaks = c(-Inf, quantile(ML1, 0.33, na.rm = TRUE),
                                quantile(ML1, 0.67, na.rm = TRUE), Inf),
                     labels = c("Low", "Medium", "High"))
  ) %>%
  dplyr::select(starts_with("Q6.1_"),
                group, group_race,
                constitution,
                ideology, ideology_group,
                psu, psu_rul, psu_op, psu_indep,
                female, age, education, income,
                culture, culture_group,
                ML1, ML2, patr_group, manipulation_pass
  )


security_counts <- read.csv("security.csv") %>%
  mutate(
    is_satisficer = (Q6.1_10 == 2),
    group = case_when(
      Q3.2 == 1 ~ "Control",
      Q4.2 == 1 ~ "Democracy",
      Q5.2 == 1 ~ "Authoritarian",
      TRUE      ~ NA_character_
    )
  )

summary_counts <- security_counts %>%
  group_by(group) %>%
  summarise(
    total_n         = n(),
    n_satisficers   = sum(is_satisficer, na.rm = TRUE),
    n_dropped       = total_n - n_satisficers
  )

print(summary_counts)
## # A tibble: 4 × 4
##   group         total_n n_satisficers n_dropped
##   <chr>           <int>         <int>     <int>
## 1 Authoritarian     749           550       199
## 2 Control           744           596       148
## 3 Democracy         702           518       184
## 4 <NA>              346             0       346

Setting variables for the Study 2

taiwan <- read.csv("taiwan.csv") %>%
  mutate(
    across(
      starts_with("Q7.1"),
      ~ case_when(
        . == 1 ~ 5,
        . == 2 ~ 4,
        . == 4 ~ 2,
        . == 5 ~ 1,
        TRUE   ~ .
      )
    ),
    across(
      starts_with("Q7.2_"),
      ~ case_when(
        . == 1 ~ 5,
        . == 2 ~ 4,
        . == 4 ~ 2,
        . == 5 ~ 1,
        TRUE   ~ .
      )
    ),
    group = case_when(
      Q3.2 == 1 ~ "Control",
      Q4.2 == 1 ~ "Democracy",
      Q5.2 == 1 ~ "Article9",
      Q6.2 == 1 ~ "Democracy_Article9",
      TRUE      ~ NA_character_
    ),
    knowledge = case_when(
      Q8.1 == 1 ~ 1,
      Q8.1 == 2 ~ 0,
      Q8.1 %in% c(3, 4) ~ NA_real_,
      TRUE ~ NA_real_
    ),
    constitution = if_else(Q9.1 == 1, 1, 0),
    ideology = Q9.2_1,
    ideology_group = case_when(
      Q9.2_1 <= 3 ~ "Liberal",
      Q9.2_1 >= 4 & Q9.2_1 <= 6 ~ "Neutral",
      Q9.2_1 >= 7 ~ "Conservative",
      TRUE ~ NA_character_
    ),
    psu = case_when(
      Q2.1 %in% c(1,4) ~ "In-partisans",
      Q2.1 %in% 2:11 ~ "Out-partisans",
      Q2.1 == 12 ~ "Independents",
      TRUE ~ NA_character_
    ),
    psu_rul = case_when(Q2.1 %in% c(1,4) ~ 1, Q2.1 %in% 2:12 ~ 0, TRUE ~ NA_real_),
    psu_op  = case_when(Q2.1 %in% 2:11 ~ 1, Q2.1 %in% c(1,4,12) ~ 0, TRUE ~ NA_real_),
    psu_indep = case_when(Q2.1 == 12 ~ 1, Q2.1 %in% 1:11 ~ 0, TRUE ~ NA_real_),
    female = if_else(Q17.2 == 2, 1, 0),
    age = Q17.3 + 17,
    education = if_else(Q17.4 >= 5, NA_real_, as.numeric(Q17.4)),
    income = Q17.5_1,
    age_group = case_when(
      age < 20 ~ "10s", age < 30 ~ "20s", age < 40 ~ "30s",
      age < 50 ~ "40s", age < 60 ~ "50s", age < 70 ~ "60s", TRUE ~ "70s"
    ),
    income_group = case_when(
      income < 1000 ~ "0-1000",
      income < 2000 ~ "1000-2000",
      income <= 3000 ~ "2000-3000",
      TRUE ~ ">3000"
    )
  ) %>%
  mutate(across(starts_with("Q9.5_"), ~ case_when(
    . == 1 ~ 5, . == 2 ~ 4, . == 3 ~ 3, . == 4 ~ 2, . == 5 ~ 1, TRUE ~ NA_real_
  ), .names="culture_{col}")) %>%
  rowwise() %>%
  mutate(culture = mean(c_across(starts_with("culture_Q9.5_")), na.rm = FALSE)) %>%
  ungroup() %>%
  { 
    fa_res <- fa(select(., Q7_1:Q7_6), nfactors=1, fm="ml")
    mutate(., patriotism = factor.scores(select(., Q7_1:Q7_6), fa_res)$scores[,1])
  }

data <- taiwan %>%
  filter(Q7.1_10 == 4) %>%
  select(
    group,
    Q7.1_1, Q7.1_2, Q7.1_3, Q7.1_4, Q7.1_5, Q7.1_6,
    Q7.1_7, Q7.1_8, Q7.1_9, Q7.1_10,
    Q7.2_1, Q7.2_2, Q7.2_3, Q7.2_4, Q7.2_5, Q7.2_6,
    Q7.2_7, Q7.2_8, Q7.2_9,
    psu, psu_rul, psu_op, psu_indep,
    ideology, ideology_group,
    culture, constitution,
    female, age, income, education,
    knowledge, age_group, income_group
  ) %>%
  drop_na()

summary_counts <- taiwan %>%
  group_by(group) %>%
  summarise(
    total_n         = n(),
    n_satisficers   = sum(Q7.1_10 != 4, na.rm = TRUE),
    dif = total_n - n_satisficers
  )

print(summary_counts)
## # A tibble: 5 × 4
##   group              total_n n_satisficers   dif
##   <chr>                <int>         <int> <int>
## 1 Article9               534           121   413
## 2 Control                557           113   444
## 3 Democracy              554           126   428
## 4 Democracy_Article9     557           143   414
## 5 <NA>                   342             0   342

Code for the Main-Text Analyses

Table 1: Pass rate for manipulation check (Study 1)

check_summary <- security %>%
  summarise(
    N        = n(),
    Pass     = sum(manipulation_pass, na.rm = TRUE),
    Fail     = N - Pass,
    PassRate = round(Pass / N * 100, 1)
  )

N

Pass

Fail

PassRate

1,651

787

864

47.7

Table 4: Descriptive statistics of Study 1

label_map2 <- c(
  Q6.1_1      = "Military",
  Q6.1_2      = "Comb.Weapon",
  Q6.1_3      = "NoComb.Weapon",
  Q6.1_4      = "Comb.Ammun.",
  Q6.1_5      = "NoComb.Ammun.",
  Q6.1_6      = "Comb.Trans.",
  Q6.1_7      = "NoComb.Trans.",
  Q6.1_8      = "Mil.Aid",
  Q6.1_9      = "Fin.Aid",
  psu_rul     = "In-partisans",
  psu_op      = "Out-partisans",
  psu_indep   = "Independent",
  ideology    = "Ideology",
  culture     = "Cultural superiority",
  ML1         = "Patriotism",
  constitution= "Constitution",
  female      = "Female",
  age         = "Age",
  income      = "Income",
  education   = "Education"
)


desc_sec <- security %>%
  select(all_of(names(label_map2))) %>%
  summarise(across(everything(), list(
    N    = ~ sum(!is.na(.x)),
    Mean = ~ round(mean(.x, na.rm = TRUE), 2),
    SD   = ~ round(sd(.x,   na.rm = TRUE), 2),
    Min  = ~ round(min(.x,  na.rm = TRUE), 2),
    Max  = ~ round(max(.x,  na.rm = TRUE), 2),
    Skew = ~ round(skewness(.x, na.rm = TRUE), 2)
  ), .names = "{col}__{fn}")) %>%
  pivot_longer(
    cols      = everything(),
    names_to  = c("variable","stat"),
    names_sep = "__",
    values_to = "value"
  ) %>%
  pivot_wider(
    names_from  = stat,
    values_from = value
  ) %>%
  mutate(
    Variable = label_map2[variable]
  ) %>%
  select(Variable, N, Mean, SD, Min, Max, Skew)

Variable

N

Mean

SD

Min

Max

Skew

Military

1,651

1.90

1.08

1.00

5.00

0.89

Comb.Weapon

1,651

2.19

1.11

1.00

5.00

0.53

NoComb.Weapon

1,651

2.27

1.12

1.00

5.00

0.41

Comb.Ammun.

1,651

2.17

1.09

1.00

5.00

0.54

NoComb.Ammun.

1,651

2.27

1.11

1.00

5.00

0.37

Comb.Trans.

1,651

2.17

1.12

1.00

5.00

0.55

NoComb.Trans.

1,651

2.30

1.13

1.00

5.00

0.34

Mil.Aid

1,651

2.40

1.13

1.00

5.00

0.26

Fin.Aid

1,651

2.83

1.16

1.00

5.00

-0.11

In-partisans

1,441

0.22

0.41

0.00

1.00

1.37

Out-partisans

1,441

0.38

0.49

0.00

1.00

0.48

Independent

1,441

0.42

0.49

0.00

1.00

0.32

Ideology

1,382

5.48

1.92

0.00

10.00

0.13

Cultural superiority

1,648

3.33

0.77

1.00

5.00

-0.16

Patriotism

1,651

0.00

1.00

-2.47

4.13

0.72

Constitution

1,651

0.33

0.47

0.00

1.00

0.74

Female

1,617

0.48

0.50

0.00

1.00

0.09

Age

1,616

46.41

16.69

18.00

80.00

0.12

Income

1,611

632.39

510.97

0.00

3,000.00

1.80

Education

1,609

3.19

0.92

1.00

4.00

-0.59

Table 5: Descriptive statics of Study 2

label_map <- c(
  Q7.1_1 = "Military",
  Q7.1_2 = "Comb.Weapon",
  Q7.1_3 = "NoComb.Weapon",
  Q7.1_4 = "Comb.Ammun.",
  Q7.1_5 = "NoComb.Ammun.",
  Q7.1_6 = "Comb.Trans.",
  Q7.1_7 = "NoComb.Trans.",
  Q7.1_8 = "Mil.Aid",
  Q7.1_9 = "Fin.Aid",
  psu_rul  = "In-partisans",
  psu_op   = "Out-partisans",
  psu_indep= "Independent",
  ideology = "Ideology",
  culture = "Cultural superiority",
  constitution = "Constitution",
  female   = "Female",
  age      = "Age",
  income   = "Income",
  education= "Education",
  knowledge= "Knowledge on Taiwan"
)

desc_stats <- taiwan %>%
  select(all_of(names(label_map))) %>%
  summarise(across(everything(), list(
    N    = ~ sum(!is.na(.x)),
    Mean = ~ round(mean(.x, na.rm = TRUE), 2),
    SD   = ~ round(sd(.x,   na.rm = TRUE), 2),
    Min  = ~ round(min(.x,  na.rm = TRUE), 2),
    Max  = ~ round(max(.x,  na.rm = TRUE), 2),
    Skew = ~ round(skewness(.x, na.rm = TRUE), 2)
  ), .names = "{col}__{fn}")) %>%
  pivot_longer(
    cols = everything(),
    names_to  = c("variable","stat"),
    names_sep = "__",
    values_to = "value"
  ) %>%
  pivot_wider(
    names_from  = stat,
    values_from = value
  ) %>%
  mutate(
    Variable = label_map[variable]
  ) %>%
  select(Variable, N, Mean, SD, Min, Max, Skew)

Variable

N

Mean

SD

Min

Max

Skew

Military

2,163

2.48

1.25

1

5

0.36

Comb.Weapon

2,163

2.76

1.20

1

5

0.10

NoComb.Weapon

2,163

2.86

1.19

1

5

-0.03

Comb.Ammun.

2,163

2.73

1.19

1

5

0.11

NoComb.Ammun.

2,163

2.84

1.18

1

5

-0.02

Comb.Trans.

2,163

2.75

1.19

1

5

0.13

NoComb.Trans.

2,163

2.87

1.19

1

5

-0.01

Mil.Aid

2,163

2.96

1.13

1

5

-0.10

Fin.Aid

2,163

3.25

1.12

1

5

-0.33

In-partisans

1,775

0.23

0.42

0

1

1.27

Out-partisans

1,775

0.35

0.48

0

1

0.64

Independent

1,775

0.45

0.50

0

1

0.21

Ideology

1,616

5.42

1.95

0

10

0.09

Cultural superiority

2,136

3.30

0.77

1

5

-0.08

Constitution

2,144

0.31

0.46

0

1

0.85

Female

2,076

0.50

0.50

0

1

0.00

Age

2,076

45.21

16.80

18

80

0.19

Income

2,067

663.75

534.15

0

3,000

1.72

Education

2,056

3.12

0.95

1

4

-0.49

Knowledge on Taiwan

1,075

0.83

0.37

0

1

-1.79

Table 6: Balance check for Study 1

security <- security %>%
  mutate(
    age_group = case_when(
      age < 20 ~ "10s",
      age < 30 ~ "20s",
      age < 40 ~ "30s",
      age < 50 ~ "40s",
      age < 60 ~ "50s",
      age < 70 ~ "60s",
      TRUE     ~ ">70s"
    ),
    income_group = case_when(
      income < 1000 ~ "0–1000",
      income < 2000 ~ "1000–2000",
      income <= 3000 ~ "2000–3000",
      TRUE          ~ ">3000"
    )
  )

balance_vars <- c("psu_rul", "ideology_group", "age", "female", "education", "income_group")
tbl1 <- sumtable(
  security,
  group = "group",
  vars  = balance_vars,
  out   = "return",
  group.test = TRUE
)

colnames(tbl1) <- make.unique(colnames(tbl1))

Variable

N

Mean

SD

N.1

Mean.1

SD.1

N.2

Mean.2

SD.2

Test

group

Authoritarian

Control

Democracy

psu_rul

474

0.22

0.42

516

0.23

0.42

451

0.19

0.4

F=1.262

ideology_group

455

495

432

X2=2.766

... Conservative

120

26%

140

28%

102

24%

... Liberal

56

12%

56

11%

52

12%

... Neutral

279

61%

299

60%

278

64%

age

533

47

17

584

45

16

499

47

17

F=2.509*

female

533

0.48

0.5

585

0.49

0.5

499

0.46

0.5

F=0.407

education

531

3.2

0.91

583

3.2

0.93

495

3.2

0.91

F=0.089

income_group

544

595

512

X2=3.96

... >3000

11

2%

13

2%

16

3%

... 0–1000

433

80%

482

81%

411

80%

... 1000–2000

91

17%

88

15%

72

14%

... 2000–3000

9

2%

12

2%

13

3%

Table 7: Balance check for Study 2

tbl2 <- sumtable(
  data = taiwan,
  group      = "group",
  vars       = c("psu_rul","ideology_group","age","female","education","income_group","knowledge"),
  out        = "return",
  group.test = TRUE
)

colnames(tbl2) <- make.unique(colnames(tbl2))

Variable

N

Mean

SD

N.1

Mean.1

SD.1

N.2

Mean.2

SD.2

N.3

Mean.3

SD.3

Test

group

Article9

Control

Democracy

Democracy_Article9

psu_rul

432

0.22

0.42

452

0.21

0.41

444

0.26

0.44

432

0.24

0.43

F=0.892

ideology_group

381

429

415

391

X2=8.352

... Conservative

104

27%

99

23%

101

24%

108

28%

... Liberal

35

9%

60

14%

49

12%

54

14%

... Neutral

242

64%

270

63%

265

64%

229

59%

age

501

45

17

533

46

16

516

45

17

526

45

17

F=0.65

female

501

0.53

0.5

533

0.49

0.5

516

0.48

0.5

526

0.5

0.5

F=0.764

education

496

3.1

0.96

529

3.2

0.93

513

3.1

0.94

518

3.1

0.97

F=0.801

income_group

534

557

554

557

X2=7.696

... >3000

35

7%

27

5%

41

7%

32

6%

... 0-1000

404

76%

436

78%

407

73%

413

74%

... 1000-2000

77

14%

82

15%

88

16%

96

17%

... 2000-3000

18

3%

12

2%

18

3%

16

3%

knowledge

228

0.78

0.41

236

0.83

0.37

351

0.87

0.33

260

0.82

0.38

F=3.037**

Figure 3: Distributions of each outcome variable within the control group (Study 1)

data2 <- security %>%
  filter(group == "Control") %>% 
  pivot_longer(
    cols      = starts_with("Q6.1_"),
    names_to  = "Item",
    values_to = "Value"
  ) %>%
  mutate(
    Item_JP = case_when(
      Item == "Q6.1_1" ~ "Military",
      Item == "Q6.1_2" ~ "Comb.\nWeapon",
      Item == "Q6.1_3" ~ "NoComb.\nWeapon",
      Item == "Q6.1_4" ~ "Comb.\nAmmun.",
      Item == "Q6.1_5" ~ "NoComb.\nAmmun.",
      Item == "Q6.1_6" ~ "Comb.\nTrans.",
      Item == "Q6.1_7" ~ "NoComb.\nTrans.",
      Item == "Q6.1_8" ~ "Mil.\nAid",
      Item == "Q6.1_9" ~ "Fin.\nAid",
      TRUE             ~ NA_character_
    ),
    Value = factor(
      Value,
      levels = 1:5,
      labels = c(
        "Strongly disagree",
        "Somewhat disagree",
        "Neither",
        "Somewhat agree",
        "Agree"
      )
    )
  ) %>%
  filter(!is.na(Item_JP)) %>%
  mutate(Item_JP = factor(
    Item_JP,
    levels = c(
      "Military",
      "Comb.\nWeapon",
      "NoComb.\nWeapon",
      "Comb.\nAmmun.",
      "NoComb.\nAmmun.",
      "Comb.\nTrans.",
      "NoComb.\nTrans.",
      "Mil.\nAid",
      "Fin.\nAid"
    )
  ))

hist_df <- data2 %>%
  filter(!is.na(Value)) %>%
  group_by(Item_JP, Value) %>%
  summarise(count = n(), .groups="drop") %>%
  group_by(Item_JP) %>%
  mutate(pct = count / sum(count) * 100) %>%
  ungroup()

ggplot(hist_df, aes(x = Value, y = pct)) +
  geom_col(fill = "grey60") +
  geom_label(
    aes(label = paste0(round(pct, 1), "%")),
    fill       = "white",
    label.size = 0.2,
    size       = 3,
    vjust      = -0.2
  ) +
  facet_wrap(~ Item_JP, scales = "free_y") +
  scale_y_continuous(
    expand = expansion(mult = c(0, 0.1)),
    labels = scales::percent_format(scale = 1)
  ) +
  labs(
    x     = "Agree / Disagree",
    y     = "(%)",
    title = ""
  ) +
  theme_bw(base_size = 12) +
  theme(
    axis.text.x       = element_text(angle = 45, vjust = 0.5),
    strip.text        = element_text(size = 10),
    panel.grid.major.x = element_blank()
  )

Figure 4: Distributions of each outcome variable within the control group (Study 2)

data2 <- taiwan %>%
  filter(group == "Control") %>% 
  pivot_longer(
    cols      = starts_with("Q7.1_"),
    names_to  = "Item",
    values_to = "Value"
  ) %>%
  mutate(
    Item_JP = case_when(
      Item == "Q7.1_1" ~ "Military",
      Item == "Q7.1_2" ~ "Comb.\nWeapon",
      Item == "Q7.1_3" ~ "NoComb.\nWeapon",
      Item == "Q7.1_4" ~ "Comb.\nAmmun.",
      Item == "Q7.1_5" ~ "NoComb.\nAmmun.",
      Item == "Q7.1_6" ~ "Comb.\nTrans.",
      Item == "Q7.1_7" ~ "NoComb.\nTrans.",
      Item == "Q7.1_8" ~ "Mil.\nAid",
      Item == "Q7.1_9" ~ "Fin.\nAid",
      TRUE             ~ NA_character_
    ),
    Value = factor(
      Value,
      levels = 1:5,
      labels = c(
        "Strongly disagree",
        "Somewhat disagree",
        "Neither",
        "Somewhat agree",
        "Agree"
      )
    )
  ) %>%
  filter(!is.na(Item_JP)) %>%
  mutate(Item_JP = factor(
    Item_JP,
    levels = c(
      "Military",
      "Comb.\nWeapon",
      "NoComb.\nWeapon",
      "Comb.\nAmmun.",
      "NoComb.\nAmmun.",
      "Comb.\nTrans.",
      "NoComb.\nTrans.",
      "Mil.\nAid",
      "Fin.\nAid"
    )
  ))

hist_df <- data2 %>%
  filter(!is.na(Value)) %>%
  group_by(Item_JP, Value) %>%
  summarise(count = n(), .groups="drop") %>%
  group_by(Item_JP) %>%
  mutate(pct = count / sum(count) * 100) %>%
  ungroup()

ggplot(hist_df, aes(x = Value, y = pct)) +
  geom_col(fill = "grey60") +
  geom_label(
    aes(label = paste0(round(pct, 1), "%")),
    fill       = "white",
    label.size = 0.2,
    size       = 3,
    vjust      = -0.2
  ) +
  facet_wrap(~ Item_JP, scales = "free_y") +
  scale_y_continuous(
    expand = expansion(mult = c(0, 0.1)),
    labels = scales::percent_format(scale = 1)
  ) +
  labs(
    x     = "Agree / Disagree",
    y     = "(%)",
    title = ""
  ) +
  theme_bw(base_size = 12) +
  theme(
    axis.text.x       = element_text(angle = 45, vjust = 0.5),
    strip.text        = element_text(size = 10),
    panel.grid.major.x = element_blank()
  )

Figure 5: Mean difference of each outcome variable (Study 1)

data2 <- security %>%
  select(
    group,
    starts_with("Q6.1_"),   
    psu, psu_rul, psu_op, psu_indep,
    ideology, ideology_group,
    patr_group, ML1, culture, culture_group,
    constitution,
    female, age, income, education
  ) %>%
  drop_na()

stats0 <- data2 %>%
  pivot_longer(
    cols      = starts_with("Q6.1_"),
    names_to  = "Item",
    values_to = "Value"
  ) %>%
  group_by(Item, group) %>%
  summarise(
    n    = n(),
    mean = mean(Value, na.rm = TRUE),
    sd   = sd(Value,   na.rm = TRUE),
    se   = sd / sqrt(n),
    .groups = "drop"
  )

ctrl_stats <- stats0 %>%
  filter(group == "Control") %>%
  select(Item, ctrl_mean = mean, ctrl_se = se)

stats <- stats0 %>%
  left_join(ctrl_stats, by = "Item") %>%
  mutate(
    diff       = mean - ctrl_mean,
    se_diff    = sqrt(se^2 + ctrl_se^2),
    lower_diff = diff - 1.96 * se_diff,
    upper_diff = diff + 1.96 * se_diff,
    signif     = (lower_diff > 0) | (upper_diff < 0),
    label      = paste0(round(diff, 2), "\n[",
                        round(lower_diff, 2), ", ",
                        round(upper_diff, 2), "]"),
    Item_JP = case_when(
      Item == "Q6.1_1" ~ "Military",
      Item == "Q6.1_2" ~ "Comb.\nWeapon",
      Item == "Q6.1_3" ~ "NoComb.\nWeapon",
      Item == "Q6.1_4" ~ "Comb.\nAmmun.",
      Item == "Q6.1_5" ~ "NoComb.\nAmmun.",
      Item == "Q6.1_6" ~ "Comb.\nTrans.",
      Item == "Q6.1_7" ~ "NoComb.\nTrans.",
      Item == "Q6.1_8" ~ "Mil.\nAid",
      Item == "Q6.1_9" ~ "Fin.\nAid",
      TRUE             ~ NA_character_
    )
  ) %>%
  filter(group %in% c("Democracy", "Authoritarian") & !is.na(Item_JP)) %>%
  mutate(
    group   = factor(group, levels = c("Democracy", "Authoritarian")),
    Item_JP = factor(Item_JP,
                     levels = c(
                       "Military", "Comb.\nWeapon", "NoComb.\nWeapon",
                       "Comb.\nAmmun.", "NoComb.\nAmmun.",
                       "Comb.\nTrans.", "NoComb.\nTrans.",
                       "Mil.\nAid", "Fin.\nAid"
                     ))
  )

pd <- position_dodge(width = 0.6)


ggplot(stats, aes(x = group, y = diff, ymin = lower_diff, ymax = upper_diff)) +
  geom_errorbar(data     = filter(stats, !signif),
                aes(group = group),
                position = pd, color = "grey70", size = 0.6, width = 0.2) +
  geom_point(data     = filter(stats, !signif),
             aes(group = group),
             position = pd, color = "grey70", size = 2) +
  geom_errorbar(data     = filter(stats, signif),
                aes(group = group),
                position = pd, color = "black", size = 1.2, width = 0.2) +
  geom_point(data     = filter(stats, signif),
             aes(group = group),
             position = pd, color = "black", size = 3) +
  geom_text(data       = filter(stats, signif),
            aes(label = label, group = group),
            position = pd,
            hjust = -0.2,
            size  = 3) +
  facet_wrap(~ Item_JP, scales = "free_y") +
  theme_bw(base_size = 12) +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    strip.text  = element_text(size = 10)
  ) +
  labs(
    x     = "Group (vs. Control)",
    y     = "Difference from Control",
    title = ""
  )

Figure 6: Ordinary Least Squares estimation’ coefficients plot (Study 1)

data_ols <- security %>%
  mutate(
    Democracy      = as.integer(group == "Democracy"),
    Authoritarian  = as.integer(group == "Authoritarian")
  ) %>%
  
  select(
    starts_with("Q6.1_"),
    Democracy, Authoritarian,
    psu_rul, ideology, ML1, culture,
    constitution, female, age, income, education
  ) %>%
  drop_na()

models1 <- lapply(paste0("Q6.1_", 1:5), function(outcome) {
  lm(
    reformulate(
      c("Democracy","Authoritarian","psu_rul","ideology",
        "ML1","culture","constitution","female","age","income","education"),
      response = outcome
    ),
    data = data_ols
  )
})

models2 <- lapply(paste0("Q6.1_", 6:9), function(outcome) {
  lm(
    reformulate(
      c("Democracy","Authoritarian","psu_rul","ideology",
        "ML1","culture","constitution","female","age","income","education"),
      response = outcome
    ),
    data = data_ols
  )
})

cov_labels <- c(
  "Democracy","Authoritarian","Partisanship","Ideology",
  "Patriotism","Culture","Constitution",
  "Female","Age","Income","Education"
)



all_models <- c(models1, models2)
outcomes   <- c("Military","Comb.Weapon","NoComb.Weapon","Comb.Ammun.","NoComb.Ammun.",
                "Comb.Trans.","NoComb.Trans.","Mil.Aid","Fin.Aid")
names(all_models) <- outcomes

coef_df <- imap_dfr(all_models, ~ {
  tidy(.x) %>%
    filter(term %in% c("Democracy","Authoritarian")) %>%
    transmute(
      outcome  = .y,
      term,
      estimate,
      se     = std.error,
      p.value,
      lower  = estimate - 1.96*std.error,
      upper  = estimate + 1.96*std.error,
      sig    = p.value < 0.05,
      label  = ifelse(sig,
                      paste0(round(estimate,2), "\n[", 
                             round(lower,2), ",", round(upper,2), "]"),
                      NA_character_)
    )
}) %>%
  mutate(
    term_jp = recode(term,
                     Democracy     = "Democracy",
                     Authoritarian = "Authoritarian"
    ),
    term_jp = factor(term_jp, levels = c("Democracy","Authoritarian")),
    outcome  = factor(outcome, levels = outcomes)
  )

ggplot(coef_df, aes(x = estimate, y = term_jp)) +
  geom_vline(xintercept = 0, linetype = "dashed") +
  geom_errorbarh(data = filter(coef_df, !sig),
                 aes(xmin = lower, xmax = upper),
                 color = "grey80", height = 0) +
  geom_point(data = filter(coef_df, !sig),
             color = "grey80", size = 2) +
  geom_errorbarh(data = filter(coef_df, sig),
                 aes(xmin = lower, xmax = upper),
                 color = "black", size = 1, height = 0) +
  geom_point(data = filter(coef_df, sig),
             color = "black", size = 3) +
  geom_text(data = filter(coef_df, sig),
            aes(label = label),
            nudge_y = 0.2, size = 3) +
  facet_wrap(~ outcome, ncol = 3) +
  theme_bw(base_size = 12) +
  theme(
    strip.text   = element_text(size = 10),
    axis.title.y = element_blank()
  ) +
  labs(
    x     = "Estimated Treatment Effect",
    title = ""
  )

Figure 7: Predicted values of military intervention by moderators (Study 1: Constitutional understanding; Cultural superiority; Patriotism; In-partisanship)

Figure 8: Predicted values of financial aids by moderators (Study 1: Constitutional understanding; Cultural superiority; Patriotism; In-partisanship)

data_ols <- security %>%
  mutate(
    treatment = factor(group,
                       levels = c("Control","Democracy","Authoritarian"))
  ) 

mod_names <- c(
  constitution = "Constitution",
  culture       = "Culture",
  ML1           = "Patriotism",
  psu_rul       = "In-partisans"
)

make_plot <- function(dv, modvar) {
  fmla <- as.formula(paste0(
    dv, " ~ treatment * ", modvar,
    " + ideology + female + age + income + education"
  ))
  fit <- lm(fmla, data = data_ols)
  
  visreg(
    fit,
    xvar    = modvar,
    by      = "treatment",
    overlay = TRUE,
    gg      = TRUE,
    line    = list(size = 1.0),
    fill    = list(alpha = 0.2)
  ) +
    labs(
      x = mod_names[modvar],
      y = "Predicted Support for Military"
    ) +
    scale_color_discrete(
      name   = "Treatment",
      labels = c("Control","Democracy","Article9","Democracy+9")
    ) +
    scale_fill_discrete(guide = "none") +
    theme_bw(base_size = 12) +
    theme(
      legend.position   = "bottom",
      legend.direction  = "horizontal",
      legend.title      = element_text(size = 10),
      legend.text       = element_text(size = 8),
      legend.margin     = margin(t = -2, r = 0, b = 0, l = 0),
      legend.box.margin = margin(0, 0, 0, 0)
    )
}

mods <- c("constitution","culture","ML1","psu_rul")

plots_mil <- lapply(mods, function(m) make_plot("Q6.1_1", m))

legend_mil <- cowplot::get_legend(
  plots_mil[[1]] +
    theme(
      legend.position  = "bottom",
      legend.direction = "horizontal"
    )
)

plots_mil_noleg <- lapply(plots_mil, function(p) p + theme(legend.position = "none"))

grid_mil <- wrap_plots(plots_mil_noleg, ncol = 2)

fig_mil <- cowplot::plot_grid(
  grid_mil,
  legend_mil,
  ncol = 1,
  rel_heights = c(1, 0.10)  
)

print(fig_mil)

plots_finaid <- lapply(mods, function(m) make_plot("Q6.1_9", m))
legend_finaid <- cowplot::get_legend(plots_finaid[[1]] + theme(legend.position = "bottom"))
plots_finaid_noleg <- lapply(plots_finaid, function(p) p + theme(legend.position = "none"))
grid_finaid <- wrap_plots(plots_finaid_noleg, ncol = 2)
fig_finaid <- cowplot::plot_grid(grid_finaid, legend_finaid, ncol = 1, rel_heights = c(1, 0.10))

print(fig_finaid)

Figure 9: Mean difference of each outcome variable (Study 2)

labels     <- c(
  "Q7.1_1" = "Military",   "Q7.1_2" = "Comb.Weapon",
  "Q7.1_3" = "NoComb.Weapon", "Q7.1_4" = "Comb.Ammun.",
  "Q7.1_5" = "NoComb.Ammun.", "Q7.1_6" = "Comb.Trans.",
  "Q7.1_7" = "NoComb.Trans.", "Q7.1_8" = "Mil.Aid",
  "Q7.1_9" = "Fin.Aid"
)
label_order <- c(
  "Military", "Comb.Weapon", "NoComb.Weapon",
  "Comb.Ammun.", "NoComb.Ammun.",
  "Comb.Trans.", "NoComb.Trans.",
  "Mil.Aid", "Fin.Aid"
)
group_order <- c("Democracy", "Article9", "Democracy_Article9", "Control")

stats0 <- taiwan %>%
  pivot_longer(
    cols      = paste0("Q7.1_", 1:9),
    names_to  = "Item",
    values_to = "Value"
  ) %>%
  group_by(Item, group) %>%
  summarise(
    n    = n(),
    mean = mean(Value, na.rm = TRUE),
    sd   = sd(Value,   na.rm = TRUE),
    se   = sd / sqrt(n),
    .groups = "drop"
  )

ctrl_stats <- stats0 %>%
  filter(group == "Control") %>%
  select(Item, ctrl_mean = mean, ctrl_se = se)

stats <- stats0 %>%
  left_join(ctrl_stats, by = "Item") %>%
  mutate(
    diff       = mean - ctrl_mean,
    se_diff    = sqrt(se^2 + ctrl_se^2),
    lower_diff = diff - 1.96 * se_diff,
    upper_diff = diff + 1.96 * se_diff,
    signif     = (lower_diff > 0) | (upper_diff < 0),
    label      = paste0(
      round(diff, 2),
      " [", round(lower_diff, 2), ",", round(upper_diff, 2), "]"
    ),
    Item_JP = case_when(
      Item == "Q7.1_1" ~ "Military",
      Item == "Q7.1_2" ~ "Comb.\nWeapon",
      Item == "Q7.1_3" ~ "NoComb.\nWeapon",
      Item == "Q7.1_4" ~ "Comb.\nAmmun.",
      Item == "Q7.1_5" ~ "NoComb.\nAmmun.",
      Item == "Q7.1_6" ~ "Comb.\nTrans.",
      Item == "Q7.1_7" ~ "NoComb.\nTrans.",
      Item == "Q7.1_8" ~ "Mil.\nAid",
      Item == "Q7.1_9" ~ "Fin.\nAid",
      TRUE             ~ NA_character_
    )
  ) %>%
  filter(group != "Control") %>%
  mutate(
    group = factor(group, levels = c("Democracy", "Article9", "Democracy_Article9")),
    Item_JP = factor(
      Item_JP,
      levels = c(
        "Military",
        "Comb.\nWeapon",
        "NoComb.\nWeapon",
        "Comb.\nAmmun.",
        "NoComb.\nAmmun.",
        "Comb.\nTrans.",
        "NoComb.\nTrans.",
        "Mil.\nAid",
        "Fin.\nAid"
      )
    )
  )

ggplot() +
  geom_errorbar(
    data = filter(stats, !signif),
    aes(x = group, ymin = lower_diff, ymax = upper_diff),
    color = "grey70", size = 0.5, width = 0.2
  ) +
  geom_point(
    data  = filter(stats, !signif),
    aes(x = group, y = diff),
    color = "grey70", size = 2
  ) +
  geom_errorbar(
    data = filter(stats, signif),
    aes(x = group, ymin = lower_diff, ymax = upper_diff),
    color = "black", size = 1.2, width = 0.2
  ) +
  geom_point(
    data  = filter(stats, signif),
    aes(x = group, y = diff),
    color = "black", size = 3
  ) +
  geom_text(
    data = filter(stats, signif),
    aes(x = group, y = upper_diff, label = label),
    vjust = -0.5, size = 3
  ) +
  facet_wrap(~ Item_JP, scales = "free_y") +
  theme_bw(base_size = 12) +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1),
    strip.text  = element_text(size = 10)
  ) +
  labs(
    x     = "Group (vs. Control)",
    y     = "Difference from Control"
  )

Figure 10: Ordinary Least Squares estimation’ coefficients plot (Study 2)

data_ols <- taiwan %>%
  mutate(
    Article9           = as.integer(group == "Article9"),
    Democracy          = as.integer(group == "Democracy"),
    Democracy_Article9 = as.integer(group == "Democracy_Article9")
  )

run_ols <- function(items, file, col_labels) {
  models <- lapply(items, function(outcome) {
    lm(
      formula = as.formula(
        paste0(outcome,
               " ~ Article9 + Democracy + Democracy_Article9 + psu_rul + ideology + culture + constitution + knowledge + female + age + income + education")
      ),
      data = data_ols
    )
  })
  stargazer(
    models,
    column.labels    = col_labels,
    covariate.labels = c(
      "Article9",
      "Democracy",
      "DemocracyArticle9",
      "Partisanship",   
      "Ideology",
      "Culture",        
      "Constitution",   
      "Knowledge",
      "Female",
      "Age",
      "Income",
      "Education"
    ),
    type              = "text",
    out               = file
  )
}


models1 <- lapply(paste0("Q7.1_", 1:5), function(outcome) {
  lm(as.formula(
    paste0(outcome,
           " ~ Article9 + Democracy + Democracy_Article9 + psu_rul + ideology + culture + constitution + knowledge + female + age + income + education")
  ), 
  data = data_ols)
})


models2 <- lapply(paste0("Q7.1_", 6:9), function(outcome) {
  lm(as.formula(
    paste0(outcome,
           " ~ Article9 + Democracy + Democracy_Article9 + psu_rul + ideology + culture + constitution + knowledge + female + age + income + education")
  ), 
  data = data_ols)
})


models1_q72 <- lapply(paste0("Q7.2_", 1:5), function(outcome) {
  lm(as.formula(
    paste0(outcome,
           " ~ Article9 + Democracy + Democracy_Article9 + ",
           "psu_rul + ideology + culture + constitution + knowledge + ",
           "female + age + income + education")
  ),
  data = data_ols)
})


models2_q72 <- lapply(paste0("Q7.2_", 6:9), function(outcome) {
  lm(as.formula(
    paste0(outcome,
           " ~ Article9 + Democracy + Democracy_Article9 + ",
           "psu_rul + ideology + culture + constitution + knowledge + ",
           "female + age + income + education")
  ),
  data = data_ols)
})



all_models <- c(models1, models2)
outcomes   <- c("Military","Comb.Weapon","NoComb.Weapon","Comb.Ammun.","NoComb.Ammun.",
                "Comb.Trans.","NoComb.Trans.","Mil.Aid","Fin.Aid")
names(all_models) <- outcomes

coef_df <- imap_dfr(all_models, ~ {
  broom::tidy(.x) %>%
    filter(term %in% c("Article9","Democracy","Democracy_Article9")) %>%
    transmute(
      outcome  = .y,
      term,
      estimate,
      std.error,
      p.value,
      lower = estimate - 1.96*std.error,
      upper = estimate + 1.96*std.error,
      sig   = p.value < 0.05
    )
}) %>%
  mutate(
    term_jp = case_when(
      term == "Article9"           ~ "Article9",
      term == "Democracy"          ~ "Democracy",
      term == "Democracy_Article9" ~ "Democracy+Article9"
    ),
    term_jp = factor(term_jp, levels = c("Article9","Democracy","Democracy+Article9")),
    outcome = factor(outcome, levels = outcomes),
    label = ifelse(
      sig,
      paste0(
        round(estimate,2),
        "\n[", round(lower,2), ",", round(upper,2), "]"
      ),
      NA_character_
    )
  )

pd <- position_dodge(width = 0.6)

ggplot(coef_df, aes(x = estimate, y = term_jp)) +
  geom_vline(xintercept = 0, linetype = "dashed", color = "black") +
  geom_errorbarh(
    data      = filter(coef_df, !sig),
    aes(xmin = lower, xmax = upper),
    height    = 0,
    color     = "grey80"
  ) +
  geom_point(
    data   = filter(coef_df, !sig),
    color  = "grey80",
    size   = 2
  ) +
  geom_errorbarh(
    data      = filter(coef_df, sig),
    aes(xmin = lower, xmax = upper),
    height    = 0,
    color     = "black",
    size      = 1
  ) +
  geom_point(
    data   = filter(coef_df, sig),
    color  = "black",
    size   = 3
  ) +
  geom_text(
    data       = filter(coef_df, sig),
    aes(label = label),
    nudge_y    = 0.2,
    size       = 3
  ) +
  facet_wrap(~ outcome, ncol = 3) +
  theme_bw(base_size = 12) +
  theme(
    strip.text   = element_text(size = 10),
    axis.title.y = element_blank()
  ) +
  labs(
    x     = "Estimated Treatment Effect",
    title = ""
  )

Figure 11: Predicted values of military intervention by moderators (Study 2: Constitutional understanding; Cultural superiority; Knowledge on Taiwan political system; In-partisanship)

Figure 12: Predicted values of financial aids by moderators (Study 2: Constitutional understanding; Cultural superiority; Knowledge on Taiwan political system; In-partisanship)

mod_names <- c(
  constitution = "Constitution",
  culture      = "Culture",
  knowledge    = "Knowledge",
  psu_rul      = "In-partisans"
)

data_ols <- data_ols %>%
  mutate(
    treatment = factor(
      group,
      levels = c("Control","Democracy","Article9","Democracy_Article9")
    )
  )

make_plot <- function(dv, modvar) {
  fmla <- as.formula(paste0(
    dv, " ~ treatment * ", modvar,
    " + ideology + female + age + income + education"
  ))
  fit <- lm(fmla, data = data_ols)
  
  visreg(
    fit,
    xvar    = modvar,
    by      = "treatment",
    overlay = TRUE,
    gg      = TRUE,
    line    = list(size = 1.2),
    fill    = list(alpha = 0.2)
  ) +
    labs(
      x = mod_names[modvar],
      y = if (dv == "Q7.1_1") "Predicted Support for Military"
          else               "Predicted Support for Financial Aid"
    ) +
    scale_color_discrete(
      name   = "Treatment",
      labels = c("Control","Democracy","Article9","Democracy+9")
    ) +
    scale_fill_discrete(guide = "none") +
    theme_bw(base_size = 12) +
    theme(
      legend.position   = "bottom",
      legend.title      = element_text(size = 10),
      legend.text       = element_text(size = 8),
      legend.direction  = "horizontal",
      legend.margin     = margin(t = -2, r = 0, b = 0, l = 0),
      legend.box.margin = margin(0, 0, 0, 0)
    )
}

mods <- c("constitution","culture","knowledge","psu_rul")

plots_mil    <- lapply(mods, function(m) make_plot("Q7.1_1", m))
plots_finaid <- lapply(mods, function(m) make_plot("Q7.1_9", m))


legend_mil <- cowplot::get_legend(
  plots_mil[[1]] +
    theme(legend.position = "bottom",
          legend.direction = "horizontal")
)

plots_mil_noleg <- lapply(plots_mil, function(p) p + theme(legend.position = "none"))

grid_mil <- wrap_plots(plots_mil_noleg, ncol = 2)

figure_mil <- cowplot::plot_grid(
  grid_mil,
  legend_mil,
  ncol = 1,
  rel_heights = c(1, 0.10)  
)

print(figure_mil) 

legend_fa <- cowplot::get_legend(
  plots_finaid[[1]] +
    theme(legend.position = "bottom",
          legend.direction = "horizontal")
)

plots_finaid_noleg <- lapply(plots_finaid, function(p) p + theme(legend.position = "none"))

grid_fa <- wrap_plots(plots_finaid_noleg, ncol = 2)

figure_fa <- cowplot::plot_grid(
  grid_fa,
  legend_fa,
  ncol = 1,
  rel_heights = c(1, 0.10)
)

print(figure_fa) 

Code for the Online Appendix

A. All of Ordinary Least Squares Results

Table A1: Ordinary Least Squares results for Study 1 (For five dependent variables)

Table A2: Ordinary Least Squares results for Study 1 (For four dependent variables)

data_ols <- security %>%
  mutate(
    Democracy      = as.integer(group == "Democracy"),
    Authoritarian  = as.integer(group == "Authoritarian")
  ) %>%
  
  select(
    starts_with("Q6.1_"),
    Democracy, Authoritarian,
    psu_rul, ideology, ML1, culture,
    constitution, female, age, income, education
  ) %>%
  drop_na()

models1 <- lapply(paste0("Q6.1_", 1:5), function(outcome) {
  lm(
    reformulate(
      c("Democracy","Authoritarian","psu_rul","ideology",
        "ML1","culture","constitution","female","age","income","education"),
      response = outcome
    ),
    data = data_ols
  )
})

models2 <- lapply(paste0("Q6.1_", 6:9), function(outcome) {
  lm(
    reformulate(
      c("Democracy","Authoritarian","psu_rul","ideology",
        "ML1","culture","constitution","female","age","income","education"),
      response = outcome
    ),
    data = data_ols
  )
})

cov_labels <- c(
  "Democracy","Authoritarian","Partisanship","Ideology",
  "Patriotism","Culture","Constitution",
  "Female","Age","Income","Education"
)
Military Comb.Weapon NoComb.Weapon Comb.Ammun. NoComb.Ammun.
Democracy 0.144* (0.074) 0.256*** (0.077) 0.322*** (0.078) 0.227*** (0.076) 0.253*** (0.078)
Authoritarian -0.028 (0.073) -0.055 (0.075) -0.048 (0.076) -0.085 (0.075) -0.060 (0.076)
Partisanship 0.199*** (0.073) 0.168** (0.076) 0.212*** (0.077) 0.244*** (0.075) 0.233*** (0.077)
Ideology 0.005 (0.016) 0.012 (0.016) 0.002 (0.016) 0.007 (0.016) -0.011 (0.016)
Patriotism 0.101*** (0.034) 0.075** (0.035) 0.072** (0.036) 0.047 (0.035) 0.041 (0.036)
Culture 0.176*** (0.042) 0.236*** (0.044) 0.206*** (0.044) 0.182*** (0.044) 0.172*** (0.044)
Constitution 0.242*** (0.067) 0.284*** (0.069) 0.353*** (0.070) 0.326*** (0.069) 0.370*** (0.070)
Female -0.158** (0.063) -0.290*** (0.065) -0.253*** (0.066) -0.235*** (0.065) -0.256*** (0.066)
Age -0.010*** (0.002) -0.010*** (0.002) -0.010*** (0.002) -0.010*** (0.002) -0.009*** (0.002)
Income 0.000** (0.000) 0.000 (0.000) 0.000 (0.000) 0.000* (0.000) 0.000 (0.000)
Education -0.077** (0.034) -0.077** (0.035) -0.070* (0.036) -0.059* (0.035) -0.063* (0.036)
Observations 1207 1207 1207 1207 1207
R-squared 0.083 0.110 0.114 0.109 0.103
F-statistic 9.804 13.493 13.983 13.278 12.532
✱ Signif. codes: * p<0.10, ** p<0.05, *** p<0.01. Standard errors in parentheses.
Comb.Trans. NoComb.Trans. Mil.Aid Fin.Aid
Democracy 0.236*** (0.078) 0.290*** (0.080) 0.304*** (0.079) 0.265*** (0.083)
Authoritarian -0.053 (0.076) -0.040 (0.078) -0.014 (0.078) -0.152* (0.081)
Partisanship 0.238*** (0.077) 0.208*** (0.079) 0.175** (0.078) 0.340*** (0.082)
Ideology 0.009 (0.016) -0.010 (0.017) -0.029* (0.017) -0.051*** (0.017)
Patriotism 0.039 (0.036) 0.048 (0.037) 0.057 (0.037) -0.074* (0.038)
Culture 0.175*** (0.044) 0.172*** (0.046) 0.212*** (0.045) 0.140*** (0.048)
Constitution 0.326*** (0.070) 0.347*** (0.072) 0.305*** (0.071) 0.197*** (0.075)
Female -0.307*** (0.066) -0.267*** (0.068) -0.189*** (0.068) -0.136* (0.071)
Age -0.010*** (0.002) -0.007*** (0.002) -0.010*** (0.002) -0.003 (0.002)
Income 0.000 (0.000) 0.000 (0.000) 0.000 (0.000) -0.000 (0.000)
Education -0.047 (0.036) -0.060 (0.037) -0.096*** (0.037) -0.030 (0.038)
Observations 1207 1207 1207 1207
R-squared 0.109 0.095 0.092 0.072
F-statistic 13.290 11.395 10.975 8.395
✱ Signif. codes: * p<0.10, ** p<0.05, *** p<0.01. Standard errors in parentheses.

Table A3: Ordinary Least Squares results for Study 2 (For five dependent variables)

Table A4: Ordinary Least Squares results for Study 2 (For four dependent variables)

data_ols <- taiwan %>%
  mutate(
    Article9           = as.integer(group == "Article9"),
    Democracy          = as.integer(group == "Democracy"),
    Democracy_Article9 = as.integer(group == "Democracy_Article9")
  )

models1 <- lapply(paste0("Q7.1_", 1:5), function(outcome) {
  lm(as.formula(
    paste0(outcome,
           " ~ Article9 + Democracy + Democracy_Article9 + psu_rul + ideology + culture + constitution + knowledge + female + age + income + education")
  ), 
  data = data_ols)
})

models2 <- lapply(paste0("Q7.1_", 6:9), function(outcome) {
  lm(as.formula(
    paste0(outcome,
           " ~ Article9 + Democracy + Democracy_Article9 + psu_rul + ideology + culture + constitution + knowledge + female + age + income + education")
  ), 
  data = data_ols)
})
Military Comb.Weapon NoComb.Weapon Comb.Ammun. NoComb.Ammun.
Article9 0.216 (0.132) 0.205 (0.127) 0.096 (0.123) 0.056 (0.127) 0.017 (0.123)
Democracy 0.007 (0.121) -0.024 (0.117) -0.151 (0.113) -0.131 (0.117) -0.146 (0.114)
DemocracyArticle9 0.243* (0.129) 0.247** (0.124) 0.211* (0.120) 0.184 (0.124) 0.228* (0.120)
Partisanship 0.157 (0.100) 0.227** (0.096) 0.258*** (0.094) 0.186* (0.097) 0.285*** (0.094)
Ideology 0.011 (0.022) -0.005 (0.021) 0.006 (0.021) -0.005 (0.021) 0.014 (0.021)
Culture 0.312*** (0.058) 0.267*** (0.056) 0.217*** (0.054) 0.240*** (0.056) 0.191*** (0.054)
Constitution 0.773*** (0.093) 0.802*** (0.089) 0.721*** (0.087) 0.757*** (0.089) 0.697*** (0.087)
Knowledge -0.147 (0.125) 0.024 (0.120) 0.058 (0.117) 0.045 (0.120) 0.141 (0.117)
Female -0.415*** (0.095) -0.460*** (0.091) -0.469*** (0.088) -0.440*** (0.091) -0.509*** (0.089)
Age -0.004* (0.003) -0.004 (0.003) -0.003 (0.002) -0.003 (0.003) -0.002 (0.002)
Income 0.000** (0.000) 0.000 (0.000) 0.000 (0.000) 0.000 (0.000) 0.000 (0.000)
Education -0.082 (0.051) -0.042 (0.048) -0.090* (0.047) -0.019 (0.049) -0.079* (0.047)
Observations 859 859 859 859 859
R-squared 0.192 0.202 0.191 0.181 0.188
F-statistic 16.722 17.837 16.655 15.611 16.336
✱ Signif. codes: * p<0.10, ** p<0.05, *** p<0.01. Standard errors in parentheses.
Comb.Trans. NoComb.Trans. Mil.Aid Fin.Aid
Article9 0.021 (0.126) -0.050 (0.123) -0.008 (0.122) -0.292** (0.122)
Democracy -0.102 (0.116) -0.165 (0.113) -0.118 (0.113) -0.138 (0.113)
DemocracyArticle9 0.169 (0.123) 0.217* (0.120) 0.206* (0.120) -0.065 (0.119)
Partisanship 0.172* (0.096) 0.165* (0.094) 0.147 (0.093) 0.168* (0.093)
Ideology -0.007 (0.021) -0.005 (0.021) -0.022 (0.021) -0.004 (0.021)
Culture 0.196*** (0.056) 0.204*** (0.054) 0.133** (0.054) 0.098* (0.054)
Constitution 0.837*** (0.089) 0.782*** (0.087) 0.533*** (0.086) 0.172** (0.086)
Knowledge -0.042 (0.120) -0.060 (0.117) -0.009 (0.116) 0.050 (0.116)
Female -0.469*** (0.091) -0.496*** (0.088) -0.136 (0.088) -0.112 (0.088)
Age -0.003 (0.003) -0.001 (0.002) -0.006** (0.002) 0.002 (0.002)
Income 0.000 (0.000) 0.000 (0.000) 0.000 (0.000) 0.000 (0.000)
Education 0.022 (0.048) 0.022 (0.047) -0.026 (0.047) 0.041 (0.047)
Observations 859 859 859 859
R-squared 0.192 0.195 0.092 0.031
F-statistic 16.704 17.061 7.147 2.279
✱ Signif. codes: * p<0.10, ** p<0.05, *** p<0.01. Standard errors in parentheses.

B. Ordinary Least Squares Results by Manipulation-Check Status

Figure B1: Ordinary Least Squares results by manipulation-check status

data_ols <- security %>%
  mutate(
    Democracy     = as.integer(group == "Democracy"),
    Authoritarian = as.integer(group == "Authoritarian")
  ) %>%
  select(
    manipulation_pass, 
    starts_with("Q6.1_"),
    Democracy, Authoritarian,
    psu_rul, ideology, ML1, culture,
    constitution, female, age, income, education
  ) %>%
  drop_na()

fit_models <- function(df) {
  models1 <- purrr::map(paste0("Q6.1_", 1:5), ~ lm(
    reformulate(
      c("Democracy","Authoritarian","psu_rul","ideology",
        "ML1","culture","constitution","female","age","income","education"),
      response = .x
    ), data = df
  ))
  models2 <- purrr::map(paste0("Q6.1_", 6:9), ~ lm(
    reformulate(
      c("Democracy","Authoritarian","psu_rul","ideology",
        "ML1","culture","constitution","female","age","income","education"),
      response = .x
    ), data = df
  ))
  list(models1 = models1, models2 = models2)
}

slices  <- data_ols %>% split(.$manipulation_pass)
results <- purrr::map(slices, fit_models)

for (pass_val in names(results)) {
  names(results[[pass_val]]$models1) <- paste0("Q6.1_", 1:5)
  names(results[[pass_val]]$models2) <- paste0("Q6.1_", 6:9)
}

coef_df <- purrr::map_dfr(
  names(results),
  function(pass_val) {
    pass_num <- as.integer(as.logical(pass_val)) 
    models <- c(results[[pass_val]]$models1,
                results[[pass_val]]$models2)
    purrr::map_dfr(
      models,
      ~ broom::tidy(.x),
      .id = "outcome"
    ) %>%
      dplyr::filter(term %in% c("Democracy", "Authoritarian")) %>%
      dplyr::transmute(
        outcome,
        term,
        pass     = pass_num,         
        estimate,
        se       = std.error,
        lower    = estimate - 1.96*std.error,
        upper    = estimate + 1.96*std.error,
        sig      = p.value < 0.05
      )
  }
) %>%
  dplyr::mutate(
    term    = factor(term, levels = c("Democracy","Authoritarian")),
    outcome = factor(
      outcome,
      levels = paste0("Q6.1_",1:9),
      labels = c(
        "Military","Comb.Weapon","NoComb.Weapon","Comb.Ammun.","NoComb.Ammun.",
        "Comb.Trans.","NoComb.Trans.","Mil.Aid","Fin.Aid"
      )
    )
  )

pd <- position_dodge(width = 0.6)

ggplot(coef_df, 
       aes(x     = estimate, 
           y     = term, 
           color = factor(pass), 
           group = factor(pass), 
           size  = sig,
           linewidth = sig)) +
  geom_vline(xintercept = 0, linetype = "dashed") +
  geom_errorbarh(aes(xmin = lower, xmax = upper),
                 height   = 0,
                 position = pd) +
  geom_point(position = pd, shape = 16) +
  facet_wrap(~ outcome, ncol = 3) +
  scale_color_manual(
    name   = "Manipulation Check",
    values = c("0" = "blue", "1" = "black"),
    labels = c("Not passed",   "Passed")
  ) +
  scale_size_manual(
    name   = "Significance",
    values = c("FALSE" = 0.5, "TRUE" = 2),
    labels = c("n.s.",       "* p < .05")
  ) +
  scale_linewidth_manual(
    name   = "Significance",
    values = c("FALSE" = 0.5, "TRUE" = 1.2)
  ) +
  theme_bw(base_size = 12) +
  theme(
    axis.title.y    = element_blank(),
    strip.text      = element_text(size = 10),
    legend.position = "bottom"
  ) +
  labs(x = "Estimated Treatment Effect")

Table B1: Ordinary Least Squares estimation results for the sample that DID NOT pass the manipulation check (Study 1)

Table B2: Ordinary Least Squares estimation results for the sample that DID NOT pass the manipulation check (Study 1)

Table B3: Ordinary Least Squares estimation results for the sample that PASSED the manipulation check (Study 1)

Table B4: Ordinary Least Squares estimation results for the sample that PASSED the manipulation check (Study 1)

OLS estimates (manipulation check NOT PASSED)
Military Comb.Weapon NoComb.Weapon Comb.Ammun. NoComb.Ammun.
Democracy 0.232* (0.119) 0.337*** (0.126) 0.371*** (0.124) 0.304** (0.123) 0.294** (0.125)
Authoritarian 0.311*** (0.106) 0.282** (0.113) 0.293*** (0.111) 0.275** (0.110) 0.297*** (0.112)
Partisanship 0.274*** (0.103) 0.261** (0.109) 0.313*** (0.107) 0.298*** (0.106) 0.346*** (0.108)
Ideology -0.022 (0.022) 0.011 (0.023) 0.011 (0.023) 0.015 (0.023) -0.007 (0.023)
Patriotism 0.114** (0.048) 0.062 (0.051) 0.080 (0.050) 0.052 (0.050) 0.071 (0.051)
Culture 0.133** (0.059) 0.192*** (0.062) 0.193*** (0.062) 0.156** (0.061) 0.135** (0.062)
Constitution 0.267*** (0.096) 0.328*** (0.102) 0.406*** (0.101) 0.388*** (0.100) 0.492*** (0.102)
Female -0.190** (0.090) -0.221** (0.095) -0.183* (0.094) -0.154* (0.093) -0.168* (0.094)
Age -0.011*** (0.003) -0.010*** (0.003) -0.010*** (0.003) -0.010*** (0.003) -0.008*** (0.003)
Income 0.000 (0.000) 0.000 (0.000) 0.000 (0.000) 0.000 (0.000) 0.000 (0.000)
Education -0.083* (0.048) -0.062 (0.051) -0.082* (0.050) -0.098** (0.050) -0.120** (0.050)
Observations 597 597 597 597 597
R-squared 0.109 0.109 0.130 0.120 0.125
F-statistic 6.517 6.481 7.973 7.240 7.570
✱ Signif. codes: * p<0.10, ** p<0.05, *** p<0.01. Standard errors in parentheses.
OLS estimates (manipulation check NOT PASSED)
Comb.Trans. NoComb.Trans. Mil.Aid Fin.Aid
Democracy 0.460*** (0.127) 0.226* (0.130) 0.271** (0.128) 0.033 (0.131)
Authoritarian 0.406*** (0.113) 0.252** (0.117) 0.346*** (0.115) 0.071 (0.117)
Partisanship 0.329*** (0.109) 0.287** (0.112) 0.209* (0.110) 0.296*** (0.113)
Ideology 0.030 (0.023) -0.003 (0.024) -0.021 (0.024) -0.057** (0.024)
Patriotism 0.087* (0.051) 0.044 (0.053) 0.067 (0.052) -0.099* (0.053)
Culture 0.152** (0.063) 0.116* (0.065) 0.214*** (0.063) 0.113* (0.065)
Constitution 0.360*** (0.103) 0.419*** (0.106) 0.339*** (0.104) 0.288*** (0.106)
Female -0.274*** (0.096) -0.223** (0.098) -0.144 (0.097) -0.061 (0.099)
Age -0.011*** (0.003) -0.006** (0.003) -0.009*** (0.003) 0.000 (0.003)
Income 0.000 (0.000) 0.000 (0.000) 0.000 (0.000) 0.000 (0.000)
Education -0.069 (0.051) -0.113** (0.052) -0.162*** (0.051) -0.119** (0.052)
Observations 597 597 597 597
R-squared 0.137 0.099 0.108 0.073
F-statistic 8.443 5.854 6.456 4.172
✱ Signif. codes: * p<0.10, ** p<0.05, *** p<0.01. Standard errors in parentheses.
OLS estimates (manipulation check PASSED)
Military Comb.Weapon NoComb.Weapon Comb.Ammun. NoComb.Ammun.
Democracy -0.105 (0.140) 0.086 (0.142) 0.114 (0.147) -0.081 (0.142) 0.069 (0.145)
Authoritarian -0.400*** (0.140) -0.363** (0.142) -0.407*** (0.147) -0.544*** (0.142) -0.408*** (0.145)
Partisanship 0.085 (0.105) 0.031 (0.106) 0.069 (0.110) 0.151 (0.106) 0.082 (0.108)
Ideology 0.035 (0.022) 0.015 (0.022) -0.007 (0.023) -0.001 (0.023) -0.013 (0.023)
Patriotism 0.094* (0.049) 0.093* (0.049) 0.075 (0.051) 0.053 (0.049) 0.017 (0.050)
Culture 0.217*** (0.061) 0.282*** (0.062) 0.225*** (0.064) 0.217*** (0.062) 0.222*** (0.063)
Constitution 0.238*** (0.092) 0.267*** (0.093) 0.327*** (0.096) 0.301*** (0.094) 0.280*** (0.095)
Female -0.146* (0.088) -0.377*** (0.089) -0.340*** (0.093) -0.331*** (0.090) -0.367*** (0.092)
Age -0.009*** (0.003) -0.010*** (0.003) -0.009*** (0.003) -0.010*** (0.003) -0.010*** (0.003)
Income 0.000 (0.000) 0.000 (0.000) 0.000 (0.000) 0.000 (0.000) 0.000 (0.000)
Education -0.051 (0.049) -0.075 (0.050) -0.040 (0.051) 0.004 (0.050) 0.010 (0.051)
Observations 610 610 610 610 610
R-squared 0.096 0.147 0.133 0.142 0.132
F-statistic 5.797 9.371 8.361 8.967 8.257
✱ Signif. codes: * p<0.10, ** p<0.05, *** p<0.01. Standard errors in parentheses.
OLS estimates (manipulation check PASSED)
Comb.Trans. NoComb.Trans. Mil.Aid Fin.Aid
Democracy -0.168 (0.141) 0.135 (0.148) 0.271* (0.148) 0.369** (0.160)
Authoritarian -0.598*** (0.141) -0.371** (0.148) -0.246* (0.148) -0.259 (0.160)
Partisanship 0.097 (0.105) 0.098 (0.111) 0.107 (0.111) 0.375*** (0.119)
Ideology -0.009 (0.022) -0.020 (0.023) -0.036 (0.023) -0.049* (0.025)
Patriotism 0.005 (0.049) 0.060 (0.051) 0.062 (0.052) -0.045 (0.056)
Culture 0.205*** (0.061) 0.244*** (0.064) 0.213*** (0.064) 0.183*** (0.069)
Constitution 0.327*** (0.093) 0.294*** (0.097) 0.302*** (0.097) 0.133 (0.105)
Female -0.371*** (0.089) -0.326*** (0.093) -0.265*** (0.094) -0.226** (0.101)
Age -0.009*** (0.003) -0.009*** (0.003) -0.011*** (0.003) -0.006** (0.003)
Income 0.000 (0.000) 0.000 (0.000) -0.000 (0.000) -0.000 (0.000)
Education 0.006 (0.049) 0.006 (0.052) -0.014 (0.052) 0.061 (0.056)
Observations 610 610 610 610
R-squared 0.144 0.127 0.118 0.107
F-statistic 9.162 7.890 7.279 6.491
✱ Signif. codes: * p<0.10, ** p<0.05, *** p<0.01. Standard errors in parentheses.

Figure B2: Odds-ration results by logistic regression estimation (DV: Manipulation check passed (1) or not (0))

logit_mod2 <- glm(
  manipulation_pass ~ 
    psu_rul + ideology + ML1 + culture +
    constitution + female + age + income + education,
  data   = data_ols,
  family = binomial(link = "logit")
)


coef_logit2 <- broom::tidy(logit_mod2) %>%
  filter(term != "(Intercept)") %>%
  mutate(
    OR      = exp(estimate),
    lowerOR = exp(estimate - 1.96 * std.error),
    upperOR = exp(estimate + 1.96 * std.error),
    sig     = p.value < 0.05,
    term    = recode(term,
                     psu_rul      = "Partisanship",
                     ideology     = "Ideology",
                     ML1          = "Patriotism",
                     culture      = "Culture",
                     constitution = "Constitution",
                     female       = "Female",
                     age          = "Age",
                     income       = "Income",
                     education    = "Education")
  ) %>%
  mutate(
    term = factor(
      term,
      levels = c(
        "Education",
        "Income",
        "Age",
        "Female",
        "Constitution",
        "Culture",
        "Patriotism",
        "Ideology",
        "Partisanship"
      )
    )
  )

ggplot(coef_logit2, aes(x = OR, y = term)) +
  geom_vline(xintercept = 1, linetype = "dashed") +
  geom_errorbarh(aes(xmin = lowerOR, xmax = upperOR),
                 height = 0.2,
                 color = ifelse(coef_logit2$sig, "black", "grey60")) +
  geom_point(aes(size = sig),
             color = ifelse(coef_logit2$sig, "black", "grey60")) +
  scale_size_manual(values = c("FALSE" = 1.5, "TRUE" = 3)) +
  theme_bw(base_size = 12) +
  theme(
    axis.title.y    = element_blank(),
    legend.position = "none"
  ) +
  labs(
    x     = "Odds Ratio (95% CI)",
    title = ""
  )