Abstract

Why do citizens tolerate illiberal governance in a self-proclaimed democracy? We investigate the antecedents of support for illiberal governance tactics in the wake of Donald Trump’s reelection. We compare four families of explanations—partisan tradeoffs under polarization, authoritarian predispositions and preference for hierarchy, dark personality traits, and resentment captured by feelings of being devalued (FBD). We also examine populist attitudes as a contested case that may either license or restrain illiberalism. Using an original nationally matched survey of 1,059 US voters fielded in late 2024, we analyze predictors of two outcomes: approval of presidential lawbreaking and support for granting Trump permanent emergency powers. Results show sizable and consistent associations for partisanship, with dark-trait measures exerting significant independent effects, and psychopathy even rivaling a vote cast for Trump in the case of “casual” lawbreaking. Feelings of being devalued and social dominance orientation are also positively associated with illiberal attitudes, while right-wing authoritarianism relates specifically to support for emergency powers. By contrast, we find that populist attitudes–which are often loosely paired with illiberal attitudes in political commentary–are negatively associated with both outcomes, suggesting that anti-elite orientations may constrain rather than fuel illiberalism.

Packages

Below are the packages necessary for the analysis.

# Load all the necessary packages 
library(estimatr)
library(huxtable)
library(car)
library(broom.mixed)
library(modelsummary)
library(ggplot2)
library(gridExtra)
library(dplyr)
library(grid)
library(stargazer)
library(tidyverse)
library(rcartocolor)
library(cluster)
library(factoextra)
library(corrplot)
library(readr)
library(pheatmap)
library(writexl)
library(ggplot2)
library(jtools)
library(haven)
library(readr)
library(readxl)
library(hrbrthemes)
library(viridis)
library(igraph)
library(leaps)
library(lmtest)
library(fmsb)
library(RColorBrewer)
library(scales)
library(patchwork)
library(stargazer)

# Disable scientific notation
options(scipen=999)

Regression models

# Load dataset for Wave 1
df1 <- read_csv("Data/Raw/AIgen_campaign_content_Wave2.csv")
## Rows: 1059 Columns: 380
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr  (17): StartDate, EndDate, IPAddress, RecordedDate, ResponseId, Distribu...
## dbl (344): Status, Progress, Duration__in_seconds_, Finished, LocationLatitu...
## lgl  (19): RecipientLastName, RecipientFirstName, RecipientEmail, ExternalRe...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# Variable definition and recoding
df1 <- df1 %>%
  mutate(
    # keep as is
    trump_lawbreaking_acceptance =  Q39,
    
    # keep as is
    trump_emergency_powers_support =  Q40,
    
    # recode prefer not to say as NA
    gender = ifelse(Q2 == 98, NA, Q2),
    
    # calculate age
    age = 2024 - Q3,
    
    # keep education as is
    education = Q5,
    
    # keep republican as is
    republican = Republicans,
    
    # recode ethnic background into white dummy
    white = ifelse(Q7 == 1, 1, 0),
    
    # recode ideology
    ideology = ifelse(Q24 == 99, NA, Q24),
    
    # keep political interest as is
    political_interest = Q22,
    
    # keep Trump voter as is
    trump_voter = TrumpVoter,
    
    # fbd 
    fbd = rowMeans(across(c(Q20_1, Q20_2, Q20_3)), na.rm = TRUE),
    
    # machiavellianism (averages Q33_1 through Q33_7)
    machiavellianism = rowMeans(across(all_of(paste0("Q33_", 1:7))), na.rm = TRUE),
    
    # narcissism (averages Q34_1 through Q34_7)
    narcissism      = rowMeans(across(all_of(paste0("Q34_", 1:7))), na.rm = TRUE),
    
    #psychopathy (averages Q35_1 through Q35_7)
    psychopathy     = rowMeans(across(all_of(paste0("Q35_", 1:7))), na.rm = TRUE),
    
    # sadism (averages Q36_1 through Q36_7)
    sadism          = rowMeans(across(all_of(paste0("Q36_", 1:7))), na.rm = TRUE), 
    
    # RWA reverse-coded items:
    Q17_1r = 8 - Q17_1,
    Q17_4r = 8 - Q17_4,
    Q17_5r = 8 - Q17_5,
    Q17_7r = 8 - Q17_7,
    
    # RWA index: mean of all 8 (after reversing the 4 items)
    rwa = rowMeans(across(c(Q17_1r, Q17_2, Q17_3, Q17_4r, Q17_5r, Q17_6)), na.rm = TRUE),
    
    # SDO reverse-coded items: 1–7 scale, so use 8 - x
    Q16_3r = 8 - Q16__3,
    Q16_4r = 8 - Q16__4,
    Q16_7r = 8 - Q16__7,
    Q16_8r = 8 - Q16__8,
    
    # SDO index: mean of all 8 items
    sdo = rowMeans(across(c(Q16__1, Q16__2, Q16_3r, Q16_4r, Q16__5, Q16__6, Q16_7r, Q16_8r)), na.rm = TRUE),

    # populist attitudes
    populist_attitudes = rowMeans(across(paste0("Q37_", 1:8)), na.rm = TRUE)
  )

Cronbach’s alpha

# Reliability for multi-item scales
library(psych)

# --- Item sets (matching your questionnaire) ---
FBD_items   <- df1 %>% dplyr::select(Q20_1, Q20_2, Q20_3)

POP_items   <- df1 %>% dplyr::select(dplyr::all_of(paste0("Q37_", 1:8)))          # Akkerman et al. 8 items
RWA_items   <- df1 %>% dplyr::select(dplyr::all_of(paste0("Q17_", 1:6)))          # Bizumic & Duckitt VSA items
SDO_items   <- df1 %>% dplyr::select(dplyr::all_of(c("Q16__1","Q16__2","Q16__3","Q16__4",
                                                     "Q16__5","Q16__6","Q16__7","Q16__8")))  # SDO7(s)

MACH_items  <- df1 %>% dplyr::select(dplyr::all_of(paste0("Q33_", 1:7)))          # SD4 Machiavellianism
NARC_items  <- df1 %>% dplyr::select(dplyr::all_of(paste0("Q34_", 1:7)))          # SD4 Narcissism
PSY_items   <- df1 %>% dplyr::select(dplyr::all_of(paste0("Q35_", 1:7)))          # SD4 Psychopathy
SADISM_items<- df1 %>% dplyr::select(dplyr::all_of(paste0("Q36_", 1:7)))          # SD4 Sadism (if used)

# --- Compute alphas; check.keys lets psych reverse-code as needed ---
a_FBD   <- psych::alpha(FBD_items,   check.keys = TRUE)
a_POP   <- psych::alpha(POP_items,   check.keys = TRUE)
a_RWA   <- psych::alpha(RWA_items,   check.keys = TRUE)
a_SDO   <- psych::alpha(SDO_items,   check.keys = TRUE)

a_MACH  <- psych::alpha(MACH_items,  check.keys = TRUE)
a_NARC  <- psych::alpha(NARC_items,  check.keys = TRUE)
a_PSY   <- psych::alpha(PSY_items,   check.keys = TRUE)
a_SADISM<- psych::alpha(SADISM_items,check.keys = TRUE)

# --- Rounded values for inline reporting ---
alpha_fbd  <- round(a_FBD$total$raw_alpha,  2)
alpha_pop  <- round(a_POP$total$raw_alpha,  2)
alpha_rwa  <- round(a_RWA$total$raw_alpha,  2)
alpha_sdo  <- round(a_SDO$total$raw_alpha,  2)

alpha_mach <- round(a_MACH$total$raw_alpha, 2)
alpha_narc <- round(a_NARC$total$raw_alpha, 2)
alpha_psy  <- round(a_PSY$total$raw_alpha,  2)
alpha_sad  <- round(a_SADISM$total$raw_alpha,2)

# Optional: quick table for the appendix
reliab_tbl <- tibble::tibble(
  scale = c("Feelings of being devalued (FBD)", "Populist attitudes",
            "Right-wing authoritarianism (RWA)", "Social dominance orientation (SDO)",
            "Machiavellianism", "Narcissism", "Psychopathy", "Sadism"),
  items = c(3, 8, 8, 8, 7, 7, 7, 7),
  alpha = c(alpha_fbd, alpha_pop, alpha_rwa, alpha_sdo,
            alpha_mach, alpha_narc, alpha_psy, alpha_sad)
)
knitr::kable(reliab_tbl, digits = 2, caption = "Internal consistency (Cronbach’s α) for all multi-item scales.")
Internal consistency (Cronbach’s α) for all multi-item scales.
scale items alpha
Feelings of being devalued (FBD) 3 0.82
Populist attitudes 8 0.82
Right-wing authoritarianism (RWA) 8 0.58
Social dominance orientation (SDO) 8 0.76
Machiavellianism 7 0.78
Narcissism 7 0.87
Psychopathy 7 0.90
Sadism 7 0.87

Trump lawbreaking

# Run OLS regression
model1 <- lm(trump_lawbreaking_acceptance ~ education + white + ideology + gender +
    political_interest + trump_voter + fbd + populist_attitudes + psychopathy + narcissism + machiavellianism + rwa + sdo , data=df1
)

# Format Regression Table
stargazer(model1, report = "vcsp*", type = "html", star.char = c(".", "*", "**", "***"), star.cutoffs = c(0.1, 0.05, 0.01, 0.001), notes = c(". p<0.1; * p<0.05; ** p<0.01; *** p<0.001"), notes.append = FALSE,  single.row=TRUE, dep.var.labels = c("Acceptance of presidential lawbreaking"), title = "Regression Results (Wave 2)", covariate.labels = c("Education", "White", "Ideology", "Gender", "Political interest", "Trump vote", "Feelings of being devalued", "Populist attitudes", "Psychopathy", "Narcissism", "Machiavellianism", "Right-wing authoritarianism", "Social dominance orientation"))
Regression Results (Wave 2)
Dependent variable:
Acceptance of presidential lawbreaking
Education -0.054 (0.051)
p = 0.296
White -0.097 (0.106)
p = 0.362
Ideology 0.042 (0.020)
p = 0.039*
Gender 0.001 (0.012)
p = 0.953
Political interest -0.030 (0.060)
p = 0.623
Trump vote 0.770 (0.116)
p = 0.000***
Feelings of being devalued 0.116 (0.037)
p = 0.002**
Populist attitudes -0.260 (0.084)
p = 0.003**
Psychopathy 0.570 (0.064)
p = 0.000***
Narcissism 0.324 (0.074)
p = 0.00002***
Machiavellianism 0.164 (0.090)
p = 0.068.
Right-wing authoritarianism 0.029 (0.054)
p = 0.591
Social dominance orientation 0.226 (0.055)
p = 0.00004***
Constant -0.926 (0.436)
p = 0.034*
Observations 1,059
R2 0.336
Adjusted R2 0.328
Residual Std. Error 1.632 (df = 1045)
F Statistic 40.695*** (df = 13; 1045)
Note: . p<0.1; * p<0.05; ** p<0.01; *** p<0.001

Trump emergency powers

# Run OLS regression
model2 <- lm(trump_emergency_powers_support ~ education + white + ideology + gender +
    political_interest + trump_voter + fbd + populist_attitudes + psychopathy + narcissism + machiavellianism + rwa + sdo , data=df1
)

# Format Regression Table
stargazer(model2, report = "vcsp*", type = "html", star.char = c(".", "*", "**", "***"), star.cutoffs = c(0.1, 0.05, 0.01, 0.001), notes = c(". p<0.1; * p<0.05; ** p<0.01; *** p<0.001"), notes.append = FALSE,  single.row=TRUE, dep.var.labels = c("Support for Emergency Powers"), title = "Regression Results (Wave 2)", covariate.labels = c("Education", "White", "Ideology", "Gender", "Political interest", "Trump vote", "Feelings of being devalued", "Populist attitudes", "Psychopathy", "Narcissism", "Machiavellianism", "Right-wing authoritarianism", "Social dominance orientation"))
Regression Results (Wave 2)
Dependent variable:
Support for Emergency Powers
Education -0.185 (0.050)
p = 0.0002***
White -0.110 (0.102)
p = 0.284
Ideology 0.063 (0.020)
p = 0.002**
Gender 0.013 (0.012)
p = 0.249
Political interest 0.064 (0.058)
p = 0.270
Trump vote 1.295 (0.112)
p = 0.000***
Feelings of being devalued 0.126 (0.035)
p = 0.0004***
Populist attitudes -0.175 (0.081)
p = 0.033*
Psychopathy 0.302 (0.062)
p = 0.00001***
Narcissism 0.515 (0.071)
p = 0.000***
Machiavellianism 0.256 (0.087)
p = 0.004**
Right-wing authoritarianism 0.160 (0.052)
p = 0.003**
Social dominance orientation 0.210 (0.053)
p = 0.0001***
Constant -2.182 (0.421)
p = 0.00000***
Observations 1,059
R2 0.429
Adjusted R2 0.422
Residual Std. Error 1.574 (df = 1045)
F Statistic 60.406*** (df = 13; 1045)
Note: . p<0.1; * p<0.05; ** p<0.01; *** p<0.001

Comparing both models

# --- One Stargazer table for both models, written to a .tex file ---
stargazer(
  model1, model2,
  # se = rob_se,                         # <- uncomment to use robust SEs
  type = "latex",
  out  = "Output/regression_table.tex",  # <- this file goes to Overleaf
  title = "Regression Results",
  column.labels = c("Tolerance for lawbreaking", "Support for Trump emergency powers"),
  dep.var.labels.include = FALSE,
  report = "vcsp*",                      # coef, SE, p, and stars
  digits = 3,
  single.row = TRUE,
  star.char = c(".", "*", "**", "***"),
  star.cutoffs = c(0.1, 0.05, 0.01, 0.001),
  covariate.labels = c(
    "Education","White","Ideology","Gender","Political interest","Trump vote",
    "Feelings of being devalued","Populist attitudes",
    "Psychopathy","Narcissism","Machiavellianism",
    "Right-wing authoritarianism","Social dominance orientation"
  ),
  notes = c(". p<0.1; * p<0.05; ** p<0.01; *** p<0.001"),
  notes.append = FALSE
)
% Table created by stargazer v.5.2.3 by Marek Hlavac, Social Policy Institute. E-mail: marek.hlavac at gmail.com % Date and time: Wed, Oct 01, 2025 - 19:09:59

Plotting regression models

# Clean labels for plotting
coef_labels <- c(
  "Education"                    = "education",
  "White"                        = "white",
  "Ideology"                     = "ideology",
  "Gender"                       = "gender",
  "Political interest"           = "political_interest",
  "Trump vote"                   = "trump_voter",
  "Feelings of being devalued"   = "fbd",
  "Populist attitudes"           = "populist_attitudes",
  "Psychopathy"                  = "psychopathy",
  "Narcissism"                   = "narcissism",
  "Machiavellianism"             = "machiavellianism",
  "Right-wing authoritarianism"  = "rwa",
  "Social dominance orientation" = "sdo"
)

# Overlay plot for both models
p_overlay <- plot_summs(
  model1, model2,
  model.names       = c("Tolerance for Trump's lawbreaking", "Support for Trump emergency powers"),
  coefs             = coef_labels,
  scale             = TRUE,       # standardized coefficients
  robust            = "HC2",      # robust CIs
  ci.level          = 0.95,
  plot.distributions = FALSE,
  exclude.intercept = TRUE,
  point.size        = 2.6,
  line.size         = 0.7,
  colors            = c("darkgoldenrod1", "coral")   # two distinct colors
) +
  geom_vline(xintercept = 0, linetype = 2, linewidth = 0.5) +
  labs(x = "Standardized coefficient (β)", y = NULL, title = "Comparing Trump Norm Violation Models") +
  theme_minimal(base_size = 12) +
  theme(
    legend.position = "bottom",
    legend.title = element_blank(),
    panel.grid.minor = element_blank(),
    axis.text.y = element_text(size = 10)
  )

p_overlay

Better plot

library(dplyr)
library(broom)
library(ggplot2)

# --- 1) Make z-scored copies of ALL predictors + BOTH DVs ---
preds_all <- c("education","white","ideology","gender","political_interest",
               "trump_voter","fbd","populist_attitudes","psychopathy",
               "narcissism","machiavellianism","rwa","sdo")

dfz <- df1 %>%
  mutate(
    across(all_of(preds_all), ~ as.numeric(.x), .names = "{.col}") %>%
      { mutate(., across(all_of(preds_all), ~ as.numeric(scale(.x)),
                         .names = "{.col}_z")) } %>%
      mutate(lawbreaking_z = as.numeric(scale(trump_lawbreaking_acceptance)),
             emerpowers_z  = as.numeric(scale(trump_emergency_powers_support)))
  )

# --- 2) Fit models ONLY on z-variables ---
m1z <- lm(lawbreaking_z ~ education_z + white_z + ideology_z + gender_z +
            political_interest_z + trump_voter_z + fbd_z + populist_attitudes_z +
            psychopathy_z + narcissism_z + machiavellianism_z + rwa_z + sdo_z,
          data = dfz)

m2z <- lm(emerpowers_z ~ education_z + white_z + ideology_z + gender_z +
            political_interest_z + trump_voter_z + fbd_z + populist_attitudes_z +
            psychopathy_z + narcissism_z + machiavellianism_z + rwa_z + sdo_z,
          data = dfz)

# --- 3) Tidy + 95%/99% CIs ---
df1_95 <- tidy(m1z, conf.int = TRUE) %>% mutate(Model = "Tolerance for Trump's lawbreaking")
df2_95 <- tidy(m2z, conf.int = TRUE) %>% mutate(Model = "Support for Trump emergency powers")

ci99_m1 <- confint(m1z, level = 0.99) %>% as.data.frame() %>%
  mutate(term = rownames(.), Model = "Tolerance for Trump's lawbreaking")
ci99_m2 <- confint(m2z, level = 0.99) %>% as.data.frame() %>%
  mutate(term = rownames(.), Model = "Support for Trump emergency powers")
names(ci99_m1)[1:2] <- c("conf.low2","conf.high2")
names(ci99_m2)[1:2] <- c("conf.low2","conf.high2")
ci99_df <- bind_rows(ci99_m1, ci99_m2)

coef_df <- bind_rows(df1_95, df2_95) %>%
  left_join(ci99_df, by = c("term","Model")) %>%
  filter(term != "(Intercept)") %>%
  mutate(term = case_when(
    term == "education_z" ~ "Education",
    term == "white_z" ~ "White",
    term == "ideology_z" ~ "Ideology",
    term == "gender_z" ~ "Gender",
    term == "political_interest_z" ~ "Political interest",
    term == "trump_voter_z" ~ "Trump vote",
    term == "fbd_z" ~ "Feelings of being devalued",
    term == "populist_attitudes_z" ~ "Populist attitudes",
    term == "psychopathy_z" ~ "Psychopathy",
    term == "narcissism_z" ~ "Narcissism",
    term == "machiavellianism_z" ~ "Machiavellianism",
    term == "rwa_z" ~ "Right-wing authoritarianism",
    term == "sdo_z" ~ "Social dominance orientation",
    TRUE ~ term
  ))

# Order terms (top→bottom)
order_terms <- c("Education","White","Ideology","Gender","Political interest",
                 "Trump vote","Feelings of being devalued","Populist attitudes",
                 "Psychopathy","Narcissism","Machiavellianism",
                 "Right-wing authoritarianism","Social dominance orientation")
coef_df <- coef_df %>% mutate(term = factor(term, levels = rev(order_terms)))

# vertical offset so points/intervals don’t overlap
offset <- 0.18
coef_df <- coef_df %>%
  mutate(term_id = as.numeric(term),
         y = ifelse(Model == "Support for Trump emergency powers",
                    term_id + offset, term_id - offset))

# --- NEW: faint shading for selected substantively important predictors ---
highlight_terms <- c("Trump vote",
                     "Feelings of being devalued",
                     "Psychopathy",
                     "Narcissism",
                     "Social dominance orientation", "Ideology", "Populist attitudes")

band_df <- coef_df %>%
  distinct(term, term_id) %>%
  filter(term %in% highlight_terms) %>%
  transmute(ymin = term_id - 0.5, ymax = term_id + 0.5)

# --- 4) Plot (with background bands) ---
p_better <- ggplot(coef_df, aes(y = y, x = estimate, shape = Model)) +
  # background bands behind selected rows
  geom_rect(data = band_df,
            aes(xmin = -Inf, xmax = Inf, ymin = ymin, ymax = ymax),
            inherit.aes = FALSE, fill = "grey90", alpha = 0.7) +
  # CIs and points
  geom_errorbarh(aes(xmin = conf.low2, xmax = conf.high2), height = 0,
                 linewidth = 0.4, color = "gray75", alpha = 0.5) +  # 99% CI
  geom_errorbarh(aes(xmin = conf.low, xmax = conf.high), height = 0,
                 linewidth = 0.7, color = "gray25") +  # 95% CI
  geom_point(size = 3, color = "black", fill = "white", stroke = 0.9) +
  geom_vline(xintercept = 0, linetype = "dotted") +
  scale_shape_manual(values = c(
    "Support for Trump emergency powers" = 16,  # solid circle
    "Tolerance for Trump's lawbreaking"  = 21   # circle with border + white fill
  )) +
  scale_y_continuous(
    breaks = seq_along(levels(coef_df$term)),
    labels = levels(coef_df$term),
    expand = expansion(mult = c(0.02, 0.05))
  ) +
  labs(x = "Standardized coefficient (β)", y = NULL,
           caption = "Note: Shaded rows indicate predictors significant at the 95% level in both models."
) +
  theme_minimal(base_size = 14) +
  theme(
    legend.position = "bottom",
    legend.title = element_blank(),
    panel.grid.minor = element_blank(),
    plot.caption = element_text(size = 10, face = "italic", hjust = 0.5)
  )

# save the plot as PNG in the Output folder
ggsave(filename = "Output/better_plot.png",
       plot = p_better,
       width = 8, height = 9.5, dpi = 300)

p_better

Helter-skelter thoughts

CONSIDER ADDING Partisan Propaganda / Normalization Hypothesis
Support for norm violations is greater among respondents with high exposure to right-wing media.

Make sure not to give flank to critiques of pathologizing populist and illiberal voters, or worse, right-wing politics. Avoid all language that suggests “psychological deficits”, “deficiencies,” or “disorders.” Try to stick to accepted terminology around dark traits and dark tetrad. We can say things like support for illiberal tactics correlates with elements of sublicnical forms of psychopathy, narcissism, but don’t go further. As Furedi (2021) says: “The project of representing people’s voting behavior as a personality issue – rather than a matter of political choice – invariably leads to the depoliticization of populist behavior. Of course, we can’t be accused of depoliticizing populist/illiberal behavior in our paper, since we’re tying it to political polarization, partisanship, and we actually find Trump vote to be the strongest predictor. But nonetheless, let’s tread carefully.

Look at Hawkins, Riding and Mudde 2017

Maybe think about delegative democracy as a concept–or maybe speak of endorsement of delegative democracy instead of illiberal attitudes?

Blockwise variance

# --- Make a complete-case dataset across ALL variables used anywhere ---
all_vars <- c(
  # outcomes
  "trump_lawbreaking_acceptance","trump_emergency_powers_support",
  # demographics / controls
  "education","white", "gender","political_interest",
  # partisanship
  "trump_voter", "ideology",
  # authoritarian predispositions
  "rwa","sdo",
  # dark traits
  "machiavellianism","narcissism","psychopathy",
  # affect
  "fbd",
  # populism
  "populist_attitudes"
)

df_cc <- df1 %>% dplyr::select(all_of(all_vars)) %>% na.omit()
nrow(df_cc)  # report common N used in all blockwise models
## [1] 1059
# --- Define the conceptual blocks (vectors of variable names) ---
block_demog  <- c("education","white","gender","political_interest")
block_party  <- c("trump_voter", "ideology")
block_auth   <- c("rwa","sdo")
block_dark   <- c("machiavellianism","narcissism","psychopathy")
block_fbd    <- c("fbd")
block_pop    <- c("populist_attitudes")

blocks_list  <- list(
  "Demographics & ideology" = block_demog,
  "Partisanship"            = block_party,
  "Authoritarian predispositions" = block_auth,
  "Dark traits (SD4)"       = block_dark,
  "Affective resentment (FBD)" = block_fbd,
  "Populist attitudes"      = block_pop
)

# --- Helper: build hierarchical models and compute R2, ΔR2, F-change ---
run_blockwise <- function(outcome, blocks, data) {
  # sequentially add blocks
  models <- list()
  terms_so_far <- character(0)
  rows <- list()
  
  i <- 0
  for (bn in names(blocks)) {
    i <- i + 1
    terms_so_far <- c(terms_so_far, blocks[[bn]])
    fml <- as.formula(paste(outcome, "~", paste(terms_so_far, collapse = " + ")))
    m <- lm(fml, data = data)
    models[[i]] <- m
    
    # Collect stats
    R2  <- summary(m)$r.squared
    k_new <- length(blocks[[bn]])
    
    if (i == 1) {
      rows[[i]] <- tibble::tibble(
        step = i,
        block = bn,
        k_added = k_new,
        R2 = R2,
        delta_R2 = R2,
        F_change = NA_real_,
        df1 = NA_integer_,
        df2 = NA_integer_,
        p_change = NA_real_
      )
    } else {
      # F change test: nested ANOVA between previous and current model
      a <- anova(models[[i-1]], models[[i]])
      rows[[i]] <- tibble::tibble(
        step = i,
        block = bn,
        k_added = k_new,
        R2 = R2,
        delta_R2 = R2 - summary(models[[i-1]])$r.squared,
        F_change = a$F[2],
        df1 = a$Df[2],
        df2 = a$Res.Df[2],
        p_change = a$`Pr(>F)`[2]
      )
    }
  }
  
  out_tbl <- dplyr::bind_rows(rows)
  list(table = out_tbl, models = models)
}

Blockwise results: Acceptance of presidential lawbreaking

bw_law <- run_blockwise("trump_lawbreaking_acceptance", blocks_list, df_cc)

law_tbl <- bw_law$table %>%
  mutate(
    R2        = round(R2, 3),
    delta_R2  = round(delta_R2, 3),
    F_change  = ifelse(is.na(F_change), NA, round(F_change, 2)),
    p_change  = ifelse(is.na(p_change), NA, scales::pvalue(p_change))
  )

knitr::kable(
  law_tbl,
  align = "lccrrrcc",
  caption = "Blockwise variance decomposition for acceptance of presidential lawbreaking",
  col.names = c("Step","Block","k added","R²","ΔR²","F-change","df1","df2","p")
)
Blockwise variance decomposition for acceptance of presidential lawbreaking
Step Block k added ΔR² F-change df1 df2 p
1 Demographics & ideology 4 0.018 0.018 NA NA NA NA
2 Partisanship 2 0.118 0.101 60.00 2 1052 <0.001
3 Authoritarian predispositions 2 0.179 0.061 38.85 2 1050 <0.001
4 Dark traits (SD4) 3 0.326 0.147 75.90 3 1047 <0.001
5 Affective resentment (FBD) 1 0.330 0.005 7.08 1 1046 0.008
6 Populist attitudes 1 0.336 0.006 9.48 1 1045 0.002
ggplot(law_tbl, aes(x = reorder(block, step), y = delta_R2)) +
  geom_col() +
  geom_text(aes(label = sprintf("+%.3f", delta_R2)), vjust = -0.4, size = 3.5) +
  labs(x = NULL, y = expression(Delta*R^2),
       title = "Incremental variance explained by block (Lawbreaking)") +
  theme_minimal(base_size = 12) +
  theme(axis.text.x = element_text(angle = 15, hjust = 1))

Blockwise results: Support for Trump emergency powers

bw_emerg <- run_blockwise("trump_emergency_powers_support", blocks_list, df_cc)

em_tbl <- bw_emerg$table %>%
  mutate(
    R2        = round(R2, 3),
    delta_R2  = round(delta_R2, 3),
    F_change  = ifelse(is.na(F_change), NA, round(F_change, 2)),
    p_change  = ifelse(is.na(p_change), NA, scales::pvalue(p_change))
  )

knitr::kable(
  em_tbl,
  align = "lccrrrcc",
  caption = "Blockwise variance decomposition for support for permanent emergency powers",
  col.names = c("Step","Block","k added","R²","ΔR²","F-change","df1","df2","p")
)
Blockwise variance decomposition for support for permanent emergency powers
Step Block k added ΔR² F-change df1 df2 p
1 Demographics & ideology 4 0.041 0.041 NA NA NA NA
2 Partisanship 2 0.254 0.213 150.37 2 1052 <0.001
3 Authoritarian predispositions 2 0.298 0.043 32.50 2 1050 <0.001
4 Dark traits (SD4) 3 0.421 0.123 74.17 3 1047 <0.001
5 Affective resentment (FBD) 1 0.427 0.006 10.48 1 1046 0.001
6 Populist attitudes 1 0.429 0.003 4.61 1 1045 0.032
ggplot(em_tbl, aes(x = reorder(block, step), y = delta_R2)) +
  geom_col() +
  geom_text(aes(label = sprintf("+%.3f", delta_R2)), vjust = -0.4, size = 3.5) +
  labs(x = NULL, y = expression(Delta*R^2),
       title = "Incremental variance explained by block (Emergency powers)") +
  theme_minimal(base_size = 12) +
  theme(axis.text.x = element_text(angle = 15, hjust = 1))

References

Adorno, Theodor W., Else Frenkel- Brunswik, Daniel J. Levinson, and Nevitt R. Sanford. 1950. The Authoritarian Personality. New York: Harper.

Aichholzer, Julian, and Martina Zandonella. 2016. “Psychological Bases of Support for Radical Right Parties.” Personality and Individual Differences 96: 185– 190.

Akkerman, A., C. Mudde, and A. Zaslove (2014),‘How populist are the people? Measuring populist attitudes in voters’, Comparative Political Studies 47(9): 1324–1353.

Altemeyer, Bob. 1981. Right- Wing Authoritarianism. Winnipeg: University of Manitoba Press.

Altemeyer, Bob. 1988. Enemies of Freedom: Understanding Right- Wing Authoritarianism. San Francisco, CA: Jossey- Bass.

Altemeyer, Bob. 1996. The Authoritarian Specter. Cambridge, MA: Harvard University Press.

Assche, Jasper Van, Kristof Dhont, and Thomas F. Pettigrew. 2019. “The Social-Psychological Bases of Far-Right Support in Europe and the United States.” Journal of Community & Applied Social Psychology 29(5): 385– 401.

Bakker, Bert N., Gijs Schumacher, and Matthijs Rooduijn. 2020. “The Populist Appeal: Personality and Anti-Establishment Communication.” The Journal of Politics. https:// doi.org/ 10.1086/ 710014.

Bakker, Bert N., Matthijs Rooduijn, and Gijs Schumacher. 2016. “The Psychological Roots of Populist Voting: Evidence from the United States, the Netherlands and Germany.” European Journal of Political Research 55(2): 302– 320.

Carey, J., K. Clayton, G. Helmke, B. Nyhan, M. Sanders and S. Stokes (2022),‘Who will defend democracy? Evaluating tradeoffs in candidate support among partisan donors and voters’, Journal of Elections, Public Opinion and Parties 32(1): 230–245.

Çarkoğlu, Ali, and Ezgi Elçi. (2023). “Populist attitudes and challenges towards liberal democracy: An empirical assessment of the Turkish case.” International Political Science Review, 44(5): 729-746.

Cizmar, Anne M., Geoffrey C. Layman, John McTague, Shanna Pearson- Merkowitz, and Michael Spivey. 2014. “Authoritarianism and American Political Behavior from 1952 to 2008.” Political Research Quarterly 67(1): 71– 83.

Claassen, C. (2020),‘Does public support help democracy survive?’, American Journal of Political Science 64(1): 118–134.

Cohen, Mollie J., and Amy Erica Smith. 2016. “Do Authoritarians Vote for Authoritarians? Evidence from Latin America.” Research and Politics 3(4): 1– 8.

Conway, Lucian Gideon, and James D. McFarland. 2019. “Do Right- wing and Left- wing Authoritarianism Predict Election Outcomes?: Support for Obama and Trump across Two United States Presidential Elections.” Personality and Individual Differences 138: 84– 87.

Crowson, Howard Michael, and Joyce A. Brandes. 2017. “Differentiating Between Donald Trump and Hillary Clinton Voters Using Facets of Right- Wing Authoritarianism and Social- Dominance Orientation: A Brief Report.” Psychological Reports 120(3): 364– 373.

Donovan, Todd. (2019). “Authoritarian attitudes and support for radical right populists,” Journal of Elections, Public Opinion and Parties, 29:4: 448-464. DOI: 10.1080/17457289.2019.1666270

Duckitt, John. 2009. “Authoritarianism and Dogmatism.” In Handbook of Individual Differences in Social Behavior, edited by Mark R. Leary and Rick H. Hoyle, 298– 317. New York: Guildford Press.

Feldman, Stanley. 2003. “Enforcing Social Conformity: A Theory of Authoritarianism.” Political Psychology 24(1): 41– 74.

Feldman, Stanley. 2020. “Authoritarianism, Threat, and Intolerance.” In At the Forefront of Political Psychology: Essays in Honor of John L. Sullivan, edited by Eugene Borgida, Christopher Federico, and Joanne Miller, 35– 54. New York: Routledge.

Frederiksen, K.V.S. (2022),‘When democratic experience distorts democracy: citizen reactions to undemocratic incumbent behavior,’ European Journal of Political Research 61(1): 281–292.

Furedi, F. (2021), “The Psychological Construction of the Illiberal Subject,” in The Routledge Handbook of Illiberalism (1st ed), New York: Routledge.

Graham, M.H. and M.W. Svolik (2020),‘Democracy in America? Partisanship, polarization, and the robustness of support for democracy in the United States’, American Political Science Review 114(2): 392–409.

Hetherington, Marc J., and Elizabeth Suhay. 2011. “Authoritarianism, Threat, and Americans’ Support for the War on Terror.” American Journal of Political Science 55(3): 546– 560.

Inglehart, R. and P. Norris (2017),‘Trump and the populist authoritarian parties: the silent revolution in reverse’, Perspectives on Politics 15(2): 443–454.

Knuckey, Jonathan, and Komysha Hassan. 2020. “Authoritarianism and Support for Trump in the 2016 Presidential Election.” The Social Science Journal. https:// doi.org/ 10.1016/j.soscij.2019.06.008.

Kohn, Melvin L. 1977. Class and Conformity: A Study in Values. Chicago, IL: University of Chicago Press.

Lewandowsky, M. and M. Jankowski. (2023). Sympathy for the devil? Voter support for illiberal politicians. European Political Science Review 15: 39-56.

Mudde, C. (2021), Populism in Europe: an illiberal democratic response to undemocratic liberalism (the government and opposition/leonard schapiro lecture 2019)’, Government and Opposition 56(4): 577–597.

Müller, J.-W. (2016), What is Populism? Philadelphia: Penn Press.

Nießen, D., I. Schmidt, C. Beierlein and C. Lechner (2020),‘An English-language adaptation of the authoritarianism short scale (ksa−3)’, Retrieved from https://zis.gesis.org/skala/Nießen-Schmidt-Beierlein-Lechner-Authoritarianism-Short-Scale-(KSA−3

Norris, P. and R. Inglehart (2019), Cultural Backlash: Trump, Brexit and Authoritarian Populism, Cambridge: Cambridge University Press.

Ray, J.J. (1976),‘Do authoritarians hold authoritarian attitudes?’, Human Relations 29(4): 307–325.

Rodrik, D. (2021),‘Why does globalization fuel populism? Economics, culture, and the rise of right-wing populism’, Annual Review of Economics 13: 133–170.

Rooduijn, M. (2018),‘What unites the voter bases of populist parties? Comparing the electorates of 15 populist parties’, European Political Science Review 10(3): 351–368.

Stenner, Karen. 2005. The Authoritarian Dynamic. New York: Cambridge University Press.

Svolik, M.W. (2020),‘When polarization trumps civic virtue: partisan conflict and the subversion of democracy by incumbents’, Quarterly Journal of Political Science 15(1): 3–31.

Touchton, M., C. Klofstad, and J. Uscinski (2020),‘Does partisanship promote anti-democratic impulses? Evidence from a survey experiment’, Journal of Elections, Public Opinion and Parties (online first) doi: 10.1080/17457289.2020.1844218.

Urbinati, N. (2019), Me the People: How Populism Transforms Democracy, Cambridge: Harvard University Press.

Vasilopoulos, Pavlos, and Romain Lachat. 2018. “Authoritarianism and Political Choice in France.” Acta Politica 53(4): 612– 634.

Vasilopoulos, Pavlos, George E. Marcus, Nicholas A. Valentino, and Martial Foucault. 2019. “Fear, Anger, and Voting for the Far Right: Evidence from the November 13, 2015 Paris Terror Attacks.” Political Psychology 40(4): 679– 704.

Womick, Jake, Tobias Rothmund, Flavio Azevedo, Laura A. King, and John T. Jost. 2019. “Group- Based Dominance and Authoritarian Aggression Predict Support for Donald Trump in the 2016 U.S. Presidential Election.” Social Psychological and Personality Science 10(5): 643– 652.

Zakaria, Fareed. 1997. “The Rise of Illiberal Democracy.” Foreign Affairs 76(6): 22– 23.

Gotta read

Keenan O. & de Zavala A.G. Collective narcissism and weakening of American democracy. Anal Soc Issues Public Policy. (2021); 21: 237–258. https://doi.org/10.1111/asap.12274

Marchlewska, M., Cichocka, A., Furman, A. and Cislak, A. (2022), Who respects the will of the people? Support for democracy is linked to high secure national identity but low national narcissism. Br J Soc Psychol, 61: 599-621. https://doi.org/10.1111/bjso.12499

Lantos D, Forgas JP. The role of collective narcissism in populist attitudes and the collapse of democracy in Hungary. J Theo Soc Psychol. 2021; 5: 65–78. https://doi.org/10.1002/jts5.80

Marchlewska, M., Castellanos, K.A., Lewczuk, K., Kofta, M. and Cichocka, A. (2019), My way or the highway: High narcissism and low self-esteem predict decreased support for democracy. Br. J. Soc. Psychol., 58: 591-608. https://doi.org/10.1111/bjso.12290

Cichocka, A., Marchlewska, M. and Cislak, A. (2024), Self-Worth and Politics: The Distinctive Roles of Self-Esteem and Narcissism. Political Psychology, 45: 43-85. https://doi.org/10.1111/pops.12897

de Oliveira Santos, D., Jost, J.T. Liberal-conservative asymmetries in anti-democratic tendencies are partly explained by psychological differences in a nationally representative U.S. sample. Commun Psychol 2, 61 (2024). https://doi.org/10.1038/s44271-024-00096-3

Tilley, J., Hobolt, S. Narcissism and Affective Polarization. Polit Behav 47, 599–618 (2025). https://doi.org/10.1007/s11109-024-09963-5

Mayer, S. J., Berning, C. C., & Johann, D. (2020). The Two Dimensions of Narcissistic Personality and Support for the Radical Right: The Role of Right–Wing Authoritarianism, Social Dominance Orientation and Anti–Immigrant Sentiment. European Journal of Personality, 34(1), 60-76. https://doi.org/10.1002/per.2228 (Original work published 2020)

Neumann, Craig S., and Darlene A. Ngo. (2025). Malevolent vs. benevolent dispositions and conservative political ideology in the Trump era. Journal of Research in Personality 118: 104638. https://www.sciencedirect.com/science/article/pii/S0092656625000704?casa_token=kTUuHAK3g6QAAAAA:r9djp-Sm6yjYtrKS3pgD40EZ7cyYBpawjD95B172mSRYKrsFWm1TGIpKXpmGS8VTnGmCcE_UsAs

Malka, A., Federico, C. M., Costello, T. H., & Panish, A. R. (2025). Polarized Attitudes and Anti-Democratic Orientation: Robust Evidence for Paradoxical Relationships Among American Partisans. Political Studies, 0(0). https://doi.org/10.1177/00323217251359156

Preston, Olivia C. and Joye C. Anestis. (2018). Psychopathic traits and politics: Examining affiliation, support of political issues and the role of empathy. Personality and Individual Differences, 131: 142-148. https://www.sciencedirect.com/science/article/pii/S0191886918302332?casa_token=yJb3Dy_9QBQAAAAA:H0xm_QDT9dnfgVhI0XohBiJgH3tS6ZSriIBJrQBF09z5CPYoTdOtJKm9jgcTTlO4zOqS1_5ZUM4

Jonason PK, Żemojtel-Piotrowska M, Piotrowski J, et al. Country-level correlates of the Dark Triad traits in 49 countries. J Pers. 2020; 88: 1252–1267. https://doi.org/10.1111/jopy.12569

Nai, Alessandro, and Elizabeth L. Young. (2024). They choose violence. Dark personality traits drive support for politically motivated violence in five democracy. Personality and Individual Differences, 230: 112794. https://www.sciencedirect.com/science/article/pii/S019188692400254X

Galais, Carol, and Guillem Rico. (2021). An unjustified bad reputation? The Dark Triad and support for populism. Electoral Studies, 72: 102357. https://www.sciencedirect.com/science/article/pii/S0261379421000767

Gøtzsche-Astrup, Oluf. (2021). Dark triad, partisanship and violent intentions in the United States. Personality and Individual Differences, 173: 110633. 2

Duspara, Boris, and Tobias Greitemeyer. (2017). The impact of dark tetrad traits on political orientation and extremism: an analysis in the course of a presidential election. Heliyon, 3(10): e00425. https://www.cell.com/heliyon/fulltext/S2405-8440(17)31688-2

Hofstetter, Nathalie, and Maximiliamn Filsinger. (2024). A justified bad reputation after all? Dark personality traits and populist attitudes in comparitive perspective. Electoral Studies, 87: 102728. https://www.sciencedirect.com/science/article/pii/S0261379423001506

Furnham, A., Richards, S.C. and Paulhus, D.L. (2013), The Dark Triad of Personality: A 10 Year Review. Social and Personality Psychology Compass, 7: 199-216. https://doi.org/10.1111/spc3.12018

Bird, Ryan T. et al. (2022). The dark authoritarians: Profiling the personality, emotional style, and authoritarian attitudes of the major American parties. Personality and Individual differences, 186(B): 111298. https://www.sciencedirect.com/science/article/pii/S0191886921006772?casa_token=qxThdX-ylwwAAAAA:wr38wb4rWJL3Is_pVS4RXcpcTKj9NuUYNX87XAG_SW6GgGooTeSULGsY1W1tgmk2s8FuCIq2Lhw