Exposure to Zero-Sum Political Polarization on Social Media and Their Impact on Mental Health Among Undergraduates

Politically Polarizing Social Media Content and Mental Health

Author
Affiliation

Nicole Aybar, Brianna Burton, Gregory Hurford, Ariana Mikler, Kurt Roben, Ryan Sood, & Shane McCarty, PhD

Published

November 15, 2025

Abstract

“This study examines how exposure to polarizing social media content, particularly promoting zero-sum beliefs, affects the mental health of undergraduate students. Zero-sum beliefs are the perception that one group’s gain inherently results in another’s loss. Gains have been linked to heightened political intergroup conflict and increased polarization (Roberts, 2022; Davidai, 2023). A mixed-methods survey was designed to assess participants’ engagements with politically polarizing zero-sum media and their corresponding emotional and psychological responses. Undergraduate students of 18 or older were recruited through campus tabling, poster advertisements, and email outreach, with an expected sample size of approximately 300 participants. Given the current sociopolitical climate, understanding how zero-sum thinking influences mental health is essential. Political polarization not only undermines constructive democracy but may also contribute to increased stress, anxiety, and emotional distress among individuals. Findings from this study aim to clarify the psychological effects of exposure to zero-sum social media content and to inform future interventions that promote healthier online engagements and reduce the mental health burden associated with political polarization. The study seeks to identify whether exposure to zero-sum messaging contributes to measurable declines in the mental health of undergraduates.”

Keywords

Zero-sum Beliefs, Political Polarization, Mental Health, Mental Distress, Social Media

1 Results

1.1 Quantitative Findings

everything you did below

1.2 Qualitative Findings

insert Brianna

2 Discussion

2.1 Future work

pilot testing videos - ratings of minor vs. extreme categorization

3 Import

Loading R Packages

library(readxl)
library(dplyr)

Attaching package: 'dplyr'
The following objects are masked from 'package:stats':

    filter, lag
The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union
library(ggplot2)
library(stats)
library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ forcats   1.0.1     ✔ stringr   1.5.2
✔ lubridate 1.9.4     ✔ tibble    3.3.0
✔ purrr     1.1.0     ✔ tidyr     1.3.1
✔ readr     2.1.5     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(psych)

Attaching package: 'psych'

The following objects are masked from 'package:ggplot2':

    %+%, alpha
library(knitr)
library(tibble)
library(tidyr)
library(scales)

Attaching package: 'scales'

The following objects are masked from 'package:psych':

    alpha, rescale

The following object is masked from 'package:purrr':

    discard

The following object is masked from 'package:readr':

    col_factor
library(english)

Attaching package: 'english'

The following object is masked from 'package:scales':

    ordinal
library(stringr)
library(patchwork)
library(corrplot)
corrplot 0.95 loaded
library(RColorBrewer)
library(stats)

# source: The FRI Playbook (McCarty, 2025)
# explanation: loads different libraries to use for data analysis/cleaning

Importing Data

library(readxl)
alldata <- read_excel(
  "11.06.2025.Intervention.Team3.Clean.xlsx",
  col_names = TRUE)

alldata[alldata == -99] <- NA
alldata[alldata == -50] <- NA

# source: The FRI Playbook (McCarty, 2025)
# explanation: alldata with values as -99 or -50 will count as missing data and will therefore not be included in the analyses

Variable Selection

library(dplyr)
selecteddata <- alldata %>%
  select(ZSPRE_IMM, ZSPRE_HEALTH, ZSPRE_WOMEN1, ZSPRE_WOMEN2, ZSPRE_ECONOMY, ZSPRE_DEI1, ZSPRE_DEI2, ZSPRE_ENVIRO1, ZSPRE_ENVIRO2, ZSPOST_IMMI, ZSPOST_HEALTH, ZSPOST_WOMEN1, ZSPOST_WOMEN2, ZSPOST_ECONOMY, ZSPOST_DEI1, ZSPOST_DEI2, ZSPOST_ENVIRO1, ZSPOST_ENVIRO2, PRE_HOPE, PRE_ANXIETY, POST_HOPE, POST_ANXIETY, CONDITION, POL_IMM_ALIGN, POL_HEALTHC_ALIGN, POL_WOMEN_ALIGN, POL_ECONOMY_ALIGN, POL_DEI_ALIGN, POL_ENVI_ALIGN, LEAN_IMM_ALIGN, LEAN_HEALTHC_ALIGN, LEAN_WOMEN_ALIGN, LEAN_ECONOMY_ALIGN, LEAN_DEI_ALIGN, LEAN_ENVIRO_ALIGN, POL_IMM_ENGAGE, POL_HEALTHC_ENGAGE, POL_WOMEN_ENGAGE, POL_ECONOMY_ENGAGE, POL_DEI_ENGAGE, POL_ENVI_ENGAGE, LEAN_IMM_ENGAGE, LEAN_HEALTHC_ENGAGE, LEAN_WOMEN_ENGAGE, LEAN_ECONOMY_ENGAGE, LEAN_DEI_ENGAGE, LEAN_ENVIRO_ENGAGE, AGE) %>% filter (AGE > 17, AGE < 37)

# source: R for Data Science - Data Transformation (Wickham et al., 2023)
# explanation: Selects variables to be used in the data analyses. Filter() cleans the data so that responses less than or equal to 17 years old are not included in the anlayses

4 Transform

Zero Sum Belief Composites

library(psych)
zerosum_keys <- list(
  PREZEROSUM = c("ZSPRE_IMM", "ZSPRE_HEALTH", "ZSPRE_WOMEN1", "ZSPRE_WOMEN2", "ZSPRE_ECONOMY", "ZSPRE_DEI1", "ZSPRE_DEI2", "ZSPRE_ENVIRO1", "ZSPRE_ENVIRO2"),
  POSTZEROSUM = c("ZSPOST_IMMI", "ZSPOST_HEALTH", "ZSPOST_WOMEN1", "ZSPOST_WOMEN2", "ZSPOST_ECONOMY", "ZSPOST_DEI1", "ZSPOST_DEI2", "ZSPOST_ENVIRO1", "ZSPOST_ENVIRO2")
)

# source: The FRI Playbook (McCarty, 2025)
# explanation: a list called zerosum_keys is created. This tells R which survey questions belong to which composite score (PREZEROSUM vs POSTZEROSUM)
zerosum_scores <- scoreItems(zerosum_keys, selecteddata)
composite_scores <- zerosum_scores$scores

selecteddata$PREZEROSUM <- composite_scores[, "PREZEROSUM"]
selecteddata$POSTZEROSUM <- composite_scores[, "POSTZEROSUM"]

# source: The FRI Playbook (McCarty, 2025)
# explanation: Extracts the scores from the PREZEROSUM and POSTZEROSUM lists and adds it to the dataframe being used, which is called "selecteddata" 
condition1_selecteddata <- selecteddata %>%
  filter(CONDITION == 1)

# source: The FRI Playbook (McCarty, 2025)
# expanation: creates a new dataset called condition1_selecteddata by taking the existing dataset (selecteddata) and only keeping the rows where CONDITION = 1 

Women’s Rights Composites

library(psych)
women_keys <- list(
  PREZSWOMEN = c("ZSPRE_WOMEN1", "ZSPRE_WOMEN2"),
  POSTZSWOMEN = c("ZSPOST_WOMEN1", "ZSPOST_WOMEN2")
)

# source: The FRI Playbook (McCarty, 2025)
# explanation: a list called women_keys is created. This tells R which survey questions belong to which composite score (PREZSWOMEN vs POSTZSWOMEN)
women_scores <- scoreItems(women_keys, selecteddata)
composite_scores_women <- women_scores$scores

selecteddata$PREZSWOMEN <- composite_scores_women[, "PREZSWOMEN"]
selecteddata$POSTZSWOMEN <- composite_scores_women[, "POSTZSWOMEN"]

# source: The FRI Playbook (McCarty, 2025)
# explanation: Extracts the scores from the PREZSWOMEN and POSTZSWOMEN lists and adds it to the dataframe being used, which is called "selecteddata" 
condition2_selecteddata <- selecteddata %>%
  filter(CONDITION == 1)

# source: The FRI Playbook (McCarty, 2025)
# expanation: creates a new dataset called condition2_selecteddata by taking the existing dataset (selecteddata) and only keeping the rows where CONDITION = 1 

DEI Composites

library(psych)
DEI_keys <- list(
  PREZSDEI = c("ZSPRE_DEI1", "ZSPRE_DEI2"),
  POSTZSDEI = c("ZSPOST_DEI1", "ZSPOST_DEI1")
)

# source: The FRI Playbook (McCarty, 2025)
# explanation: a list called DEI_keys is created. This tells R which survey questions belong to which composite score (PREZSDEI vs POSTZSDEI)
DEI_scores <- scoreItems(DEI_keys, selecteddata)
composite_scores_DEI <- DEI_scores$scores

selecteddata$PREZSDEI <- composite_scores_DEI[, "PREZSDEI"]
selecteddata$POSTZSDEI <- composite_scores_DEI[, "POSTZSDEI"]

# source: The FRI Playbook (McCarty, 2025)
# explanation: Extracts the scores from the PREZSDEI and POSTZSDEI lists and adds it to the dataframe being used, which is called "selecteddata" 
condition3_selecteddata <- selecteddata %>%
  filter(CONDITION == 1)

# source: The FRI Playbook (McCarty, 2025)
# expanation: creates a new dataset called condition3_selecteddata by taking the existing dataset (selecteddata) and only keeping the rows where CONDITION = 1 

Numeric Conversion

library(dplyr)

# Convert all ENGAGE columns to numeric using dplyr
selecteddata <- selecteddata %>%
 mutate(across(ends_with("_ENGAGE"), ~ as.numeric(as.character(.))))
Warning: There were 6 warnings in `mutate()`.
The first warning was:
ℹ In argument: `across(ends_with("_ENGAGE"), ~as.numeric(as.character(.)))`.
Caused by warning:
! NAs introduced by coercion
ℹ Run `dplyr::last_dplyr_warnings()` to see the 5 remaining warnings.
# Verify conversion
cat("Checking ENGAGE column types:\n")
Checking ENGAGE column types:
selecteddata %>% 
  select(ends_with("_ENGAGE")) %>% 
  sapply(class) %>% 
  print()
     POL_IMM_ENGAGE  POL_HEALTHC_ENGAGE    POL_WOMEN_ENGAGE  POL_ECONOMY_ENGAGE 
          "numeric"           "numeric"           "numeric"           "numeric" 
     POL_DEI_ENGAGE     POL_ENVI_ENGAGE     LEAN_IMM_ENGAGE LEAN_HEALTHC_ENGAGE 
          "numeric"           "numeric"           "numeric"           "numeric" 
  LEAN_WOMEN_ENGAGE LEAN_ECONOMY_ENGAGE     LEAN_DEI_ENGAGE  LEAN_ENVIRO_ENGAGE 
          "numeric"           "numeric"           "numeric"           "numeric" 
# source: Team 2 code 
# explanation: converts variables into numeric data

Environment Composites

library(psych)
enviro_keys <- list(
  PREZSENVIRO = c("ZSPRE_ENVIRO1", "ZSPRE_ENVIRO2"),
  POSTZSENVIRO = c("ZSPOST_ENVIRO1", "ZSPOST_ENVIRO1")
)

# source: The FRI Playbook (McCarty, 2025)
# explanation: a list called enviro_keys is created. This tells R which survey questions belong to which composite score (PREZSENVIRO vs POSTZSENVIRO)
enviro_scores <- scoreItems(enviro_keys, selecteddata)
Warning in sqrt(y[i] * y[j]): NaNs produced
composite_scores_enviro <- enviro_scores$scores

selecteddata$PREZSENVIRO <- composite_scores_enviro[, "PREZSENVIRO"]
selecteddata$POSTZSENVIRO <- composite_scores_enviro[, "POSTZSENVIRO"]

# source: The FRI Playbook (McCarty, 2025)
# explanation: Extracts the scores from the PREZSENVIRO and POSTZSENVIRO lists and adds it to the dataframe being used, which is called "selecteddata"
condition5_selecteddata <- selecteddata %>%
  filter(CONDITION == 1)

# source: The FRI Playbook (McCarty, 2025)
# expanation: creates a new dataset called condition5_selecteddata by taking the existing dataset (selecteddata) and only keeping the rows where CONDITION = 1 

ALIGN Composites

library(psych)
ALIGN_keys <- list(
  POLARALIGN = c("POL_IMM_ALIGN", "POL_HEALTHC_ALIGN", "POL_WOMEN_ALIGN", "POL_ECONOMY_ALIGN", "POL_DEI_ALIGN", "POL_ENVI_ALIGN"),
  LEANALIGN = c("LEAN_IMM_ALIGN", "LEAN_HEALTHC_ALIGN", "LEAN_WOMEN_ALIGN", "LEAN_ECONOMY_ALIGN", "LEAN_DEI_ALIGN", "LEAN_ENVIRO_ALIGN")
)

# source: The FRI Playbook (McCarty, 2025)
# explanation: a list called ALIGN_keys is created. This tells R which survey questions belong to which composite score (POLARALIGN vs LEANALIGN)
ALIGN_scores <- scoreItems(ALIGN_keys, selecteddata)
Warning in sqrt(Q/n.subjects): NaNs produced
composite_scores_ALIGN <- ALIGN_scores$scores

selecteddata$POLARALIGN <- composite_scores_ALIGN[, "POLARALIGN"]
selecteddata$LEANALIGN <- composite_scores_ALIGN[, "LEANALIGN"]

ALIGN_vars <- c("POLARALIGN", "LEANALIGN")
# source: The FRI Playbook (McCarty, 2025)
# explanation: Extracts the scores from the POLARALIGN and LEANALIGN lists and adds it to the dataframe being used, which is called "selecteddata"

Engagement Composites

library(psych)
engagement_keys <- list(
  POLARENGAGEMENT = c("POL_IMM_ENGAGE", "POL_HEALTHC_ENGAGE", "POL_WOMEN_ENGAGE", "POL_ECONOMY_ENGAGE", "POL_DEI_ENGAGE", "POL_ENVI_ENGAGE"),
  LEANENGAGEMENT = c("LEAN_IMM_ENGAGE", "LEAN_HEALTHC_ENGAGE", "LEAN_WOMEN_ENGAGE", "LEAN_ECONOMY_ENGAGE", "LEAN_DEI_ENGAGE", "LEAN_ENVIRO_ENGAGE")
)

# source: The FRI Playbook (McCarty, 2025)
# explanation: a list called engagement_keys is created. This tells R which survey questions belong to which composite score (POLARENGAGEMENT vs LEANENGAGEMENT)
library(psych)
engagement_scores <- psych::scoreItems(engagement_keys, selecteddata, missing = TRUE, impute = "mean")
composite_scores_engagement <- engagement_scores$scores

selecteddata$POLARENGAGEMENT <- composite_scores_engagement[, "POLARENGAGEMENT"]
selecteddata$LEANENGAGEMENT <- composite_scores_engagement[, "LEANENGAGEMENT"]

# The FRI Playbook (McCarty, 2025)
# explanation: Extracts the scores from the POLARENGAGEMENT and LEANENGAGEMENT lists and adds it to the dataframe being used, which is called "selecteddata"

Numeric Conversions

library(dplyr)

# Convert all POST ZERO SUM columns to numeric using dplyr
selecteddata <- selecteddata %>%
 mutate(across(starts_with("POST"), ~ as.numeric(as.character(.))))

# Verify conversion
cat("Checking POST ZERO SUM column types:\n")
Checking POST ZERO SUM column types:
selecteddata %>% 
  select(starts_with("POST")) %>% 
  sapply(class) %>% 
  print()
   POST_HOPE POST_ANXIETY  POSTZEROSUM  POSTZSWOMEN    POSTZSDEI POSTZSENVIRO 
   "numeric"    "numeric"    "numeric"    "numeric"    "numeric"    "numeric" 
# source: Team 2 code 
# explanation: converts variables into numeric data
library(dplyr)

# Convert all PRE ZERO SUM columns to numeric using dplyr
selecteddata <- selecteddata %>%
 mutate(across(starts_with("PRE"), ~ as.numeric(as.character(.))))

# Verify conversion
cat("Checking PRE ZERO SUM column types:\n")
Checking PRE ZERO SUM column types:
selecteddata %>% 
  select(starts_with("PRE")) %>% 
  sapply(class) %>% 
  print()
   PRE_HOPE PRE_ANXIETY  PREZEROSUM  PREZSWOMEN    PREZSDEI PREZSENVIRO 
  "numeric"   "numeric"   "numeric"   "numeric"   "numeric"   "numeric" 
# source: Team 2 code 
# explanation: converts variables into numeric data
library(dplyr)

# Convert all ALIGN columns to numeric using dplyr
selecteddata <- selecteddata %>%
 mutate(across(ends_with("_ALIGN"), ~ as.numeric(as.character(.))))

# Verify conversion
cat("Checking ALIGN column types:\n")
Checking ALIGN column types:
selecteddata %>% 
  select(ends_with("_ALIGN")) %>% 
  sapply(class) %>% 
  print()
     POL_IMM_ALIGN  POL_HEALTHC_ALIGN    POL_WOMEN_ALIGN  POL_ECONOMY_ALIGN 
         "numeric"          "numeric"          "numeric"          "numeric" 
     POL_DEI_ALIGN     POL_ENVI_ALIGN     LEAN_IMM_ALIGN LEAN_HEALTHC_ALIGN 
         "numeric"          "numeric"          "numeric"          "numeric" 
  LEAN_WOMEN_ALIGN LEAN_ECONOMY_ALIGN     LEAN_DEI_ALIGN  LEAN_ENVIRO_ALIGN 
         "numeric"          "numeric"          "numeric"          "numeric" 
# source: Team 2 code 
# explanation: converts variables into numeric data

5 Visualize

Reliability Analysis

zerosum_scores
Call: scoreItems(keys = zerosum_keys, items = selecteddata)

(Unstandardized) Alpha:
      PREZEROSUM POSTZEROSUM
alpha       0.65        0.59

Standard errors of unstandardized Alpha:
      PREZEROSUM POSTZEROSUM
ASE        0.072       0.081

Average item correlation:
          PREZEROSUM POSTZEROSUM
average.r       0.17        0.14

Median item correlation:
 PREZEROSUM POSTZEROSUM 
       0.31        0.25 

 Guttman 6* reliability: 
         PREZEROSUM POSTZEROSUM
Lambda.6       0.84        0.82

Signal/Noise based upon av.r : 
             PREZEROSUM POSTZEROSUM
Signal/Noise        1.9         1.4

Scale intercorrelations corrected for attenuation 
 raw correlations below the diagonal, alpha on the diagonal 
 corrected correlations above the diagonal:
            PREZEROSUM POSTZEROSUM
PREZEROSUM        0.65        1.05
POSTZEROSUM       0.65        0.59

 Average adjusted correlations within and between scales (MIMS)
            PREZE POSTZ
PREZEROSUM  0.17       
POSTZEROSUM 0.24  0.14 

 Average adjusted item x scale correlations within and between scales (MIMT)
            PREZE POSTZ
PREZEROSUM  0.55       
POSTZEROSUM 0.36  0.53 

 In order to see the item by scale loadings and frequency counts of the data
 print with the short option = FALSE
# source: The FRI Playbook (McCarty, 2025)
# explanation: Views reliability statistics to check consistency in measuring a construct. the difference between alpha values shows us hows that less participants are self-reporting the same values post intervention vs pre intervention

Zero-sum Beliefs Histogram

p1 <- ggplot(selecteddata, aes(x = PREZEROSUM)) + 
  geom_histogram(binwidth = 1, fill = "blue", color = "black") + 
  labs(title = "ZEROSUM Pre-Intervention", x = "ZEROSUM Score", y = "Count") + theme_minimal()

p2 <- ggplot(selecteddata, aes(x = POSTZEROSUM)) + 
  geom_histogram(binwidth = 1, fill = "red", color = "black") + 
  labs(title = "ZEROSUM Post-Intervention", x = "ZEROSUM Score", y = "Count") + theme_minimal()

p1 + p2

# source: R for Data Science - Data Visualization (Wickham et al., 2023)
# explanation: creates two histograms to display the distrubution of participants' zerosum scores pre- and post-intervention.

Hope Histogram

p3 <- ggplot(selecteddata, aes(x = PRE_HOPE)) + 
  geom_histogram(binwidth = 1, fill = "blue", color = "black") + 
  labs(title = "HOPE Pre-Intervention", x = "HOPE Score", y = "Count") + theme_minimal()

p4 <- ggplot(selecteddata, aes(x = POST_HOPE)) + 
  geom_histogram(binwidth = 1, fill = "red", color = "black") + 
  labs(title = "HOPE Post-Intervention", x = "HOPE Score", y = "Count") + theme_minimal()

p3 + p4
Warning: Removed 4 rows containing non-finite outside the scale range
(`stat_bin()`).

# source: R for Data Science - Data Visualization (Wickham et al., 2023)
# explanation: creates two histograms to display the distrubution of participants' hope scores pre- and post-intervention.

Anxiety Histogram

p5 <- ggplot(selecteddata, aes(x = PRE_ANXIETY)) + 
  geom_histogram(binwidth = 1, fill = "blue", color = "black") + 
  labs(title = "ANXIETY Pre-Intervention", x = "ANXIETY Score", y = "Count") + theme_minimal()

p6 <- ggplot(selecteddata, aes(x = POST_ANXIETY)) + 
  geom_histogram(binwidth = 1, fill = "red", color = "black") + 
  labs(title = "ANXIETY Post-Intervention", x = "ANXIETY Score", y = "Count") + theme_minimal()

p5 + p6
Warning: Removed 4 rows containing non-finite outside the scale range
(`stat_bin()`).

# source: R for Data Science - Data Visualization (Wickham et al., 2023)
# explanation: creates two histograms to display the distrubution of participants' anxiety scores pre- and post-intervention.

6 Model: Zero-sum Paired Samples Wilcoxon Test

Impact of zero-sum videos: pre- vs. post-intervention

# Create long data with participant ID
paired_data_long <- condition1_selecteddata %>%
  select(POSTZEROSUM, PREZEROSUM) %>%
  filter(!is.na(POSTZEROSUM) & !is.na(PREZEROSUM)) %>% # Remove missing pairs
  mutate(ID = row_number()) %>%
  pivot_longer(cols = c(PREZEROSUM, POSTZEROSUM), 
               names_to = "Composite", 
               values_to = "Score") %>%
  mutate(Composite = factor(Composite, levels = c("PREZEROSUM", "POSTZEROSUM"))) # changes the order so that PREZEROSUM is shown before POSTZEROSUM

# Plot: boxplot + paired lines
zero_sum_figure <- ggplot(paired_data_long, aes(x = Composite, y = Score, group = ID)) +
  geom_boxplot(aes(group = Composite), width = 0.5, alpha = 0.3, fill = "white", outlier.shape = NA) +
  geom_line(color = "gray70", alpha = 0.6) +  
  geom_point(data = paired_data_long %>% 
             filter(Composite == "POSTZEROSUM"), 
             shape = 16, size = 3, color = "#3779ba") +
  geom_point(data = paired_data_long %>% 
             filter(Composite == "PREZEROSUM"),
             shape = 17, size = 3, color = "#c8d9f8") +   
  labs(title = "Pre vs. Post Intervention with Zero-sum Videos",
       x = "Intervention Period", y = "Score") +
  theme_minimal()

zero_sum_figure

Boxplots of participants pre- and post-intervention zero-sum beliefs with gray lines connecting each participant's pre- and post-scores. Individual pre-zero-sum beliefs are indicated using a red triangle, and post-zero-sum beliefs are indicated using a blue circle.

figure 1. Paired pre- and post-intervention zero-sum beliefs of participants. Boxplots show overall distributions with lines connecting participants scores before and after the intervention.
ggsave("Paired Samples: Pre vs. Post Intervention with Zero-sum Videos.png", plot = zero_sum_figure)
Saving 8 x 4 in image
# source: Zero-sum social identity, not zero-sum economic beliefs, explain voting preference in 2024 U.S. presidential election (McCarty et al., 2025)
# explanation: Compares participants' zero-sum beliefs scores before and after watching intervention videos by visualizing paired differences.
wilcox.test(condition1_selecteddata$PREZEROSUM, condition1_selecteddata$POSTZEROSUM, paired = TRUE, alternative = "two.sided")
Warning in wilcox.test.default(condition1_selecteddata$PREZEROSUM,
condition1_selecteddata$POSTZEROSUM, : cannot compute exact p-value with ties
Warning in wilcox.test.default(condition1_selecteddata$PREZEROSUM,
condition1_selecteddata$POSTZEROSUM, : cannot compute exact p-value with zeroes

    Wilcoxon signed rank test with continuity correction

data:  condition1_selecteddata$PREZEROSUM and condition1_selecteddata$POSTZEROSUM
V = 480, p-value = 0.006717
alternative hypothesis: true location shift is not equal to 0
# source: Paired Samples Wilcoxon Test in R (STHDA, n.d.)
# explanation: Performs a paired-samples WIlcoxon test to compare participants' zero-sum scores pre- and post-intervention. p = 0.006717, indicating statistical significance. 

Impact of zero-sum immigration videos: pre- vs. post-intervention

# Create long data with participant ID
paired_data_long <- condition1_selecteddata %>%
  select(ZSPRE_IMM, ZSPOST_IMMI) %>%
  filter(!is.na(ZSPRE_IMM) & !is.na(ZSPOST_IMMI)) %>% # Remove missing pairs
  mutate(ID = row_number()) %>%
  pivot_longer(cols = c(ZSPOST_IMMI, ZSPRE_IMM), 
               names_to = "Composite", 
               values_to = "Score") %>%
  mutate(Composite = factor(Composite, levels = c("ZSPRE_IMM", "ZSPOST_IMMI"))) # changes the order so that PREZEROSUM is shown before POSTZEROSUM

# Plot: boxplot + paired lines
immigration_figure <- ggplot(paired_data_long, aes(x = Composite, y = Score, group = ID)) +
  geom_boxplot(aes(group = Composite), width = 0.5, alpha = 0.3, fill = "white", outlier.shape = NA) +
  geom_line(color = "gray70", alpha = 0.6) +  
  geom_point(data = paired_data_long %>% 
             filter(Composite == "ZSPRE_IMM"), 
             shape = 16, size = 3, color = "blue") +
  geom_point(data = paired_data_long %>% 
             filter(Composite == "ZSPOST_IMMI"),
             shape = 17, size = 3, color = "red") +   
  labs(title = "Pre vs. Post Intervention with Zero-sum Immigration Videos",
       x = "Intervention Period", y = "Score") +
  theme_minimal()

immigration_figure

Boxplots of participants pre- and post-intervention immigration zero-sum beliefs with gray lines connecting each participant's pre- and post-scores. Individual pre-zero-sum immigration beliefs are indicated using a blue circle, and post-zero-sum immigration beliefs are indicated using a red triangle.

figure 2. Paired pre- and post-intervention immigration zero-sum beliefs of participants. Boxplots show overall distributions with lines connecting participants scores before and after the intervention.
ggsave("Pre vs. Post Intervention with Zero-sum Immigration Videos.png", plot = immigration_figure)
Saving 8 x 4 in image
# source: Zero-sum social identity, not zero-sum economic beliefs, explain voting preference in 2024 U.S. presidential election (McCarty et al., 2025)
# explanation: Compares participants' immigration zero-sum beliefs scores before and after watching intervention videos by visualizing paired differences.
wilcox.test(condition1_selecteddata$ZSPRE_IMM, condition1_selecteddata$ZSPOST_IMMI, paired = TRUE, alternative = "two.sided")
Warning in wilcox.test.default(condition1_selecteddata$ZSPRE_IMM,
condition1_selecteddata$ZSPOST_IMMI, : cannot compute exact p-value with ties
Warning in wilcox.test.default(condition1_selecteddata$ZSPRE_IMM,
condition1_selecteddata$ZSPOST_IMMI, : cannot compute exact p-value with zeroes

    Wilcoxon signed rank test with continuity correction

data:  condition1_selecteddata$ZSPRE_IMM and condition1_selecteddata$ZSPOST_IMMI
V = 37, p-value = 0.3464
alternative hypothesis: true location shift is not equal to 0
# source: Paired Samples Wilcoxon Test in R (STHDA, n.d.)
# explanation: Performs a paired-samples Wilcoxon test to compare participants' zero-sum scores pre- and post-intervention. p = 0.3464, indicating no statistical significance. 

Impact of zero-sum healthcare videos: pre- vs. post-intervention

# Create long data with participant ID
paired_data_long <- condition1_selecteddata %>%
  select(ZSPRE_HEALTH, ZSPOST_HEALTH) %>%
  filter(!is.na(ZSPRE_HEALTH) & !is.na(ZSPOST_HEALTH)) %>% # Remove missing pairs
  mutate(ID = row_number()) %>%
  pivot_longer(cols = c(ZSPOST_HEALTH, ZSPRE_HEALTH), 
               names_to = "Composite", 
               values_to = "Score") %>%
  mutate(Composite = factor(Composite, levels = c("ZSPRE_HEALTH", "ZSPOST_HEALTH"))) # changes the order so that PREZEROSUM is shown before POSTZEROSUM

# Plot: boxplot + paired lines
healthcare_figure <- ggplot(paired_data_long, aes(x = Composite, y = Score, group = ID)) +
  geom_boxplot(aes(group = Composite), width = 0.5, alpha = 0.3, fill = "white", outlier.shape = NA) +
  geom_line(color = "gray70", alpha = 0.6) +  
  geom_point(data = paired_data_long %>% 
             filter(Composite == "ZSPRE_HEALTH"), 
             shape = 16, size = 3, color = "blue") +
  geom_point(data = paired_data_long %>% 
             filter(Composite == "ZSPOST_HEALTH"),
             shape = 17, size = 3, color = "red") +   
  labs(title = "Pre vs. Post Intervention with Zero-sum Healthcare Videos",
       x = "Intervention Period", y = "Score") +
  theme_minimal()

healthcare_figure

Boxplots of participants pre- and post-intervention healthcare zero-sum beliefs with gray lines connecting each participant's pre- and post-scores. Individual pre-zero-sum healthcare beliefs are indicated using a blue circle, and post-zero-sum healthcare beliefs are indicated using a red triangle.

figure 3. Paired pre- and post-intervention healthcare zero-sum beliefs of participants. Boxplots show overall distributions with lines connecting participants scores before and after the intervention.
ggsave("Pre vs. Post Intervention with Zero-sum Healthcare Videos.png", plot = healthcare_figure)
Saving 8 x 4 in image
# source: Zero-sum social identity, not zero-sum economic beliefs, explain voting preference in 2024 U.S. presidential election (McCarty et al., 2025)
# explanation: Compares participants' healthcare zero-sum beliefs scores before and after watching intervention videos by visualizing paired differences.
wilcox.test(condition1_selecteddata$ZSPRE_HEALTH, condition1_selecteddata$ZSPOST_HEALTH, paired = TRUE, alternative = "two.sided")
Warning in wilcox.test.default(condition1_selecteddata$ZSPRE_HEALTH,
condition1_selecteddata$ZSPOST_HEALTH, : cannot compute exact p-value with ties
Warning in wilcox.test.default(condition1_selecteddata$ZSPRE_HEALTH,
condition1_selecteddata$ZSPOST_HEALTH, : cannot compute exact p-value with
zeroes

    Wilcoxon signed rank test with continuity correction

data:  condition1_selecteddata$ZSPRE_HEALTH and condition1_selecteddata$ZSPOST_HEALTH
V = 56, p-value = 0.166
alternative hypothesis: true location shift is not equal to 0
# source: Paired Samples Wilcoxon Test in R (STHDA, n.d.)
# explanation: Performs a paired-samples Wilcoxon test to compare participants' zero-sum scores pre- and post-intervention. p = 0.166, indicating no statistical significance. 

Impact of zero-sum women’s rights videos: pre- vs. post-intervention

# source: Zero-sum social identity, not zero-sum economic beliefs, explain voting preference in 2024 U.S. presidential election (McCarty et al., 2025)
# explanation: Compares participants' women's rights zero-sum beliefs scores before and after watching intervention videos by visualizing paired differences.
# Create long data with participant ID
paired_data_long <- condition1_selecteddata %>%
  select(ZSPRE_WOMEN1, ZSPOST_WOMEN1) %>%
  filter(!is.na(ZSPRE_WOMEN1) & !is.na(ZSPOST_WOMEN1)) %>% # Remove missing pairs
  mutate(ID = row_number()) %>%
  pivot_longer(cols = c(ZSPRE_WOMEN1, ZSPOST_WOMEN1), 
               names_to = "Composite", 
               values_to = "Score") %>%
  mutate(Composite = factor(Composite, levels = c("ZSPRE_WOMEN1", "ZSPOST_WOMEN1"))) # changes the order so that PREZEROSUM is shown before POSTZEROSUM

# Plot: boxplot + paired lines
women_figure <- ggplot(paired_data_long, aes(x = Composite, y = Score, group = ID)) +
  geom_boxplot(aes(group = Composite), width = 0.5, alpha = 0.3, fill = "white", outlier.shape = NA) +
  geom_line(color = "gray70", alpha = 0.6) +  
  geom_point(data = paired_data_long %>% 
             filter(Composite == "ZSPRE_WOMEN1"), 
             shape = 16, size = 3, color = "blue") +
  geom_point(data = paired_data_long %>% 
             filter(Composite == "ZSPOST_WOMEN1"),
             shape = 17, size = 3, color = "red") +   
  labs(title = "Pre vs. Post Intervention with Zero-sum Women's Rights Videos",
       x = "Intervention Period", y = "Score") +
  theme_minimal()

women_figure

Boxplots of participants pre- and post-intervention women's rights zero-sum beliefs with gray lines connecting each participant's pre- and post-scores. Individual pre-zero-sum women's rights beliefs are indicated using a blue circle, and post-zero-sum women's rights beliefs are indicated using a red triangle.

figure 4. Paired pre- and post-intervention women’s rights zero-sum beliefs of participants. Boxplots show overall distributions with lines connecting participants scores before and after the intervention.
ggsave("Pre vs. Post Intervention with Zero-sum Women's Rights Videos.png", plot = women_figure)
Saving 8 x 4 in image
# source: Zero-sum social identity, not zero-sum economic beliefs, explain voting preference in 2024 U.S. presidential election (McCarty et al., 2025)
# explanation: Compares participants' women's rights zero-sum beliefs scores before and after watching intervention videos by visualizing paired differences.
wilcox.test(condition1_selecteddata$ZSPRE_WOMEN1, condition1_selecteddata$ZSPOST_WOMEN1, paired = TRUE, alternative = "two.sided")
Warning in wilcox.test.default(condition1_selecteddata$ZSPRE_WOMEN1,
condition1_selecteddata$ZSPOST_WOMEN1, : cannot compute exact p-value with ties
Warning in wilcox.test.default(condition1_selecteddata$ZSPRE_WOMEN1,
condition1_selecteddata$ZSPOST_WOMEN1, : cannot compute exact p-value with
zeroes

    Wilcoxon signed rank test with continuity correction

data:  condition1_selecteddata$ZSPRE_WOMEN1 and condition1_selecteddata$ZSPOST_WOMEN1
V = 20, p-value = 0.8211
alternative hypothesis: true location shift is not equal to 0
# source: Paired Samples Wilcoxon Test in R (STHDA, n.d.)
# explanation: Performs a paired-samples Wilcoxon test to compare participants' zero-sum scores pre- and post-intervention. p = 0.6943, indicating no statistical significance. 
# Create long data with participant ID
paired_data_long <- condition1_selecteddata %>%
  select(ZSPRE_WOMEN2, ZSPOST_WOMEN2) %>%
  filter(!is.na(ZSPRE_WOMEN2) & !is.na(ZSPOST_WOMEN2)) %>% # Remove missing pairs
  mutate(ID = row_number()) %>%
  pivot_longer(cols = c(ZSPRE_WOMEN2, ZSPOST_WOMEN2), 
               names_to = "Composite", 
               values_to = "Score") %>%
  mutate(Composite = factor(Composite, levels = c("ZSPRE_WOMEN2", "ZSPOST_WOMEN2"))) # changes the order so that PREZEROSUM is shown before POSTZEROSUM

# Plot: boxplot + paired lines
women_figure <- ggplot(paired_data_long, aes(x = Composite, y = Score, group = ID)) +
  geom_boxplot(aes(group = Composite), width = 0.5, alpha = 0.3, fill = "white", outlier.shape = NA) +
  geom_line(color = "gray70", alpha = 0.6) +  
  geom_point(data = paired_data_long %>% 
             filter(Composite == "ZSPRE_WOMEN2"), 
             shape = 16, size = 3, color = "blue") +
  geom_point(data = paired_data_long %>% 
             filter(Composite == "ZSPOST_WOMEN2"),
             shape = 17, size = 3, color = "red") +   
  labs(title = "Pre vs. Post Intervention with Zero-sum Women's Rights Videos 2",
       x = "Intervention Period", y = "Score") +
  theme_minimal()

women_figure

Boxplots of participants pre- and post-intervention women's rights zero-sum beliefs with gray lines connecting each participant's pre- and post-scores. Individual pre-zero-sum women's rights beliefs are indicated using a blue circle, and post-zero-sum women's rights beliefs are indicated using a red triangle.

figure 4. Paired pre- and post-intervention women’s rights zero-sum beliefs of participants. Boxplots show overall distributions with lines connecting participants scores before and after the intervention.
ggsave("Pre vs. Post Intervention with Zero-sum Women's Rights Videos 2.png", plot = women_figure)
Saving 8 x 4 in image
# source: Zero-sum social identity, not zero-sum economic beliefs, explain voting preference in 2024 U.S. presidential election (McCarty et al., 2025)
# explanation: Compares participants' women's rights zero-sum beliefs scores before and after watching intervention videos by visualizing paired differences.
wilcox.test(condition1_selecteddata$ZSPRE_WOMEN2, condition1_selecteddata$ZSPOST_WOMEN2, paired = TRUE, alternative = "two.sided")
Warning in wilcox.test.default(condition1_selecteddata$ZSPRE_WOMEN2,
condition1_selecteddata$ZSPOST_WOMEN2, : cannot compute exact p-value with ties
Warning in wilcox.test.default(condition1_selecteddata$ZSPRE_WOMEN2,
condition1_selecteddata$ZSPOST_WOMEN2, : cannot compute exact p-value with
zeroes

    Wilcoxon signed rank test with continuity correction

data:  condition1_selecteddata$ZSPRE_WOMEN2 and condition1_selecteddata$ZSPOST_WOMEN2
V = 14.5, p-value = 0.66
alternative hypothesis: true location shift is not equal to 0
# source: Paired Samples Wilcoxon Test in R (STHDA, n.d.)
# explanation: Performs a paired-samples Wilcoxon test to compare participants' zero-sum scores pre- and post-intervention. p = 0.6943, indicating no statistical significance. 

Impact of zero-sum economy videos: pre- vs. post-intervention

# Create long data with participant ID
paired_data_long <- condition1_selecteddata %>%
  select(ZSPRE_ECONOMY, ZSPOST_ECONOMY) %>%
  filter(!is.na(ZSPRE_ECONOMY) & !is.na(ZSPOST_ECONOMY)) %>% # Remove missing pairs
  mutate(ID = row_number()) %>%
  pivot_longer(cols = c(ZSPRE_ECONOMY, ZSPOST_ECONOMY), 
               names_to = "Composite", 
               values_to = "Score") %>%
  mutate(Composite = factor(Composite, levels = c("ZSPRE_ECONOMY", "ZSPOST_ECONOMY"))) # changes the order so that PREZEROSUM is shown before POSTZEROSUM

# Plot: boxplot + paired lines
economy_figure <- ggplot(paired_data_long, aes(x = Composite, y = Score, group = ID)) +
  geom_boxplot(aes(group = Composite), width = 0.5, alpha = 0.3, fill = "white", outlier.shape = NA) +
  geom_line(color = "gray70", alpha = 0.6) +  
  geom_point(data = paired_data_long %>% 
             filter(Composite == "ZSPRE_ECONOMY"), 
             shape = 16, size = 3, color = "blue") +
  geom_point(data = paired_data_long %>% 
             filter(Composite == "ZSPOST_ECONOMY"),
             shape = 17, size = 3, color = "red") +   
  labs(title = "Pre vs. Post Intervention with Zero-sum Economy Videos",
       x = "Intervention Period", y = "Score") +
  theme_minimal()

economy_figure

Boxplots of participants pre- and post-intervention economy zero-sum beliefs with gray lines connecting each participant's pre- and post-scores. Individual pre-zero-sum economy beliefs are indicated using a blue circle, and post-zero-sum economy beliefs are indicated using a red triangle.

figure 5. Paired pre- and post-intervention economy zero-sum beliefs of participants. Boxplots show overall distributions with lines connecting participants scores before and after the intervention.
ggsave("Pre vs. Post Intervention with Zero-sum Economy Videos.png", plot = economy_figure)
Saving 8 x 4 in image
# source: Zero-sum social identity, not zero-sum economic beliefs, explain voting preference in 2024 U.S. presidential election (McCarty et al., 2025)
# explanation: Compares participants' economy zero-sum beliefs scores before and after watching intervention videos by visualizing paired differences.
wilcox.test(condition1_selecteddata$ZSPRE_ECONOMY, condition1_selecteddata$ZSPOST_ECONOMY, paired = TRUE, alternative = "two.sided")
Warning in wilcox.test.default(condition1_selecteddata$ZSPRE_ECONOMY,
condition1_selecteddata$ZSPOST_ECONOMY, : cannot compute exact p-value with
ties
Warning in wilcox.test.default(condition1_selecteddata$ZSPRE_ECONOMY,
condition1_selecteddata$ZSPOST_ECONOMY, : cannot compute exact p-value with
zeroes

    Wilcoxon signed rank test with continuity correction

data:  condition1_selecteddata$ZSPRE_ECONOMY and condition1_selecteddata$ZSPOST_ECONOMY
V = 164.5, p-value = 0.002785
alternative hypothesis: true location shift is not equal to 0
# source: Paired Samples Wilcoxon Test in R (STHDA, n.d.)
# explanation: Performs a paired-samples Wilcoxon test to compare participants' zero-sum scores pre- and post-intervention. p = 0.02785, indicating statistical significance. 

Impact of zero-sum DEI videos: pre- vs. post-intervention

# Create long data with participant ID
paired_data_long <- condition1_selecteddata %>%
  select(ZSPRE_DEI1, ZSPOST_DEI1) %>%
  filter(!is.na(ZSPRE_DEI1) & !is.na(ZSPOST_DEI1)) %>% # Remove missing pairs
  mutate(ID = row_number()) %>%
  pivot_longer(cols = c(ZSPRE_DEI1, ZSPOST_DEI1), 
               names_to = "Composite", 
               values_to = "Score") %>%
  mutate(Composite = factor(Composite, levels = c("ZSPRE_DEI1", "ZSPOST_DEI1"))) # changes the order so that PREZEROSUM is shown before POSTZEROSUM

# Plot: boxplot + paired lines
dei_figure <- ggplot(paired_data_long, aes(x = Composite, y = Score, group = ID)) +
  geom_boxplot(aes(group = Composite), width = 0.5, alpha = 0.3, fill = "white", outlier.shape = NA) +
  geom_line(color = "gray70", alpha = 0.6) +  
  geom_point(data = paired_data_long %>% 
             filter(Composite == "ZSPRE_DEI1"), 
             shape = 16, size = 3, color = "#d9d2e9ff") +
  geom_point(data = paired_data_long %>% 
             filter(Composite == "ZSPOST_DEI1"),
             shape = 17, size = 3, color = "#aa98d3ff") +   
  labs(title = "Pre vs. Post Intervention with Zero-sum DEI Videos",
       x = "Intervention Period", y = "Score") +
  theme_minimal()

dei_figure

Boxplots of participants pre- and post-intervention DEI zero-sum beliefs with gray lines connecting each participant's pre- and post-scores. Individual pre-zero-sum DEI beliefs are indicated using a blue circle, and post-zero-sum DEI beliefs are indicated using a red triangle.

figure 6. Paired pre- and post-intervention DEI zero-sum beliefs of participants. Boxplots show overall distributions with lines connecting participants scores before and after the intervention.
ggsave("Pre vs. Post Intervention with Zero-sum DEI Videos.png", plot = dei_figure)
Saving 8 x 4 in image
# source: Zero-sum social identity, not zero-sum economic beliefs, explain voting preference in 2024 U.S. presidential election (McCarty et al., 2025)
# explanation: Compares participants' economy zero-sum beliefs scores before and after watching intervention videos by visualizing paired differences.
wilcox.test(condition1_selecteddata$ZSPRE_DEI1, condition1_selecteddata$ZSPOST_DEI1, paired = TRUE, alternative = "two.sided")
Warning in wilcox.test.default(condition1_selecteddata$ZSPRE_DEI1,
condition1_selecteddata$ZSPOST_DEI1, : cannot compute exact p-value with ties
Warning in wilcox.test.default(condition1_selecteddata$ZSPRE_DEI1,
condition1_selecteddata$ZSPOST_DEI1, : cannot compute exact p-value with zeroes

    Wilcoxon signed rank test with continuity correction

data:  condition1_selecteddata$ZSPRE_DEI1 and condition1_selecteddata$ZSPOST_DEI1
V = 85.5, p-value = 0.02768
alternative hypothesis: true location shift is not equal to 0
# source: Paired Samples Wilcoxon Test in R (STHDA, n.d.)
# explanation: Performs a paired-samples Wilcoxon test to compare participants' zero-sum scores pre- and post-intervention. p = 0.02785, indicating statistical significance.
# Create long data with participant ID
paired_data_long <- condition1_selecteddata %>%
  select(ZSPRE_DEI2, ZSPOST_DEI2) %>%
  filter(!is.na(ZSPRE_DEI2) & !is.na(ZSPOST_DEI2)) %>% # Remove missing pairs
  mutate(ID = row_number()) %>%
  pivot_longer(cols = c(ZSPRE_DEI2, ZSPOST_DEI2), 
               names_to = "Composite", 
               values_to = "Score") %>%
  mutate(Composite = factor(Composite, levels = c("ZSPRE_DEI2", "ZSPOST_DEI2"))) # changes the order so that PREZEROSUM is shown before POSTZEROSUM

# Plot: boxplot + paired lines
dei_figure <- ggplot(paired_data_long, aes(x = Composite, y = Score, group = ID)) +
  geom_boxplot(aes(group = Composite), width = 0.5, alpha = 0.3, fill = "white", outlier.shape = NA) +
  geom_line(color = "gray70", alpha = 0.6) +  
  geom_point(data = paired_data_long %>% 
             filter(Composite == "ZSPRE_DEI2"), 
             shape = 16, size = 3, color = "blue") +
  geom_point(data = paired_data_long %>% 
             filter(Composite == "ZSPOST_DEI2"),
             shape = 17, size = 3, color = "red") +   
  labs(title = "Pre vs. Post Intervention with Zero-sum DEI Videos 2",
       x = "Intervention Period", y = "Score") +
  theme_minimal()

dei_figure

Boxplots of participants pre- and post-intervention DEI zero-sum beliefs with gray lines connecting each participant's pre- and post-scores. Individual pre-zero-sum DEI beliefs are indicated using a blue circle, and post-zero-sum DEI beliefs are indicated using a red triangle.

figure 6. Paired pre- and post-intervention DEI zero-sum beliefs of participants. Boxplots show overall distributions with lines connecting participants scores before and after the intervention.
ggsave("Pre vs. Post Intervention with Zero-sum DEI Videos 2.png", plot = dei_figure)
Saving 8 x 4 in image
# source: Zero-sum social identity, not zero-sum economic beliefs, explain voting preference in 2024 U.S. presidential election (McCarty et al., 2025)
# explanation: Compares participants' economy zero-sum beliefs scores before and after watching intervention videos by visualizing paired differences.
wilcox.test(condition1_selecteddata$ZSPRE_DEI2, condition1_selecteddata$ZSPOST_DEI2, paired = TRUE, alternative = "two.sided")
Warning in wilcox.test.default(condition1_selecteddata$ZSPRE_DEI2,
condition1_selecteddata$ZSPOST_DEI2, : cannot compute exact p-value with ties
Warning in wilcox.test.default(condition1_selecteddata$ZSPRE_DEI2,
condition1_selecteddata$ZSPOST_DEI2, : cannot compute exact p-value with zeroes

    Wilcoxon signed rank test with continuity correction

data:  condition1_selecteddata$ZSPRE_DEI2 and condition1_selecteddata$ZSPOST_DEI2
V = 3.5, p-value = 0.1294
alternative hypothesis: true location shift is not equal to 0
# source: Paired Samples Wilcoxon Test in R (STHDA, n.d.)
# explanation: Performs a paired-samples Wilcoxon test to compare participants' zero-sum scores pre- and post-intervention. p = 0.02785, indicating statistical significance.

Impact of zero-sum environment videos: pre- vs. post-intervention

# Create long data with participant ID
paired_data_long<- condition1_selecteddata %>%
  select(ZSPRE_ENVIRO1, ZSPOST_ENVIRO1) %>%
  filter(!is.na(ZSPRE_ENVIRO1) & !is.na(ZSPOST_ENVIRO1)) %>% # Remove missing pairs
  mutate(ID = row_number()) %>%
  pivot_longer(cols = c(ZSPRE_ENVIRO1, ZSPOST_ENVIRO1), 
               names_to = "Composite", 
               values_to = "Score") %>%
  mutate(Composite = factor(Composite, levels = c("ZSPRE_ENVIRO1", "ZSPOST_ENVIRO1"))) # changes the order so that PREZEROSUM is shown before POSTZEROSUM

# Plot: boxplot + paired lines
environment_figure <- ggplot(paired_data_long, aes(x = Composite, y = Score, group = ID)) +
  geom_boxplot(aes(group = Composite), width = 0.5, alpha = 0.3, fill = "white", outlier.shape = NA) +
  geom_line(color = "gray70", alpha = 0.6) +  
  geom_point(data = paired_data_long %>% 
             filter(Composite == "ZSPRE_ENVIRO1"), 
             shape = 16, size = 3, color = "blue") +
  geom_point(data = paired_data_long %>% 
             filter(Composite == "ZSPOST_ENVIRO1"),
             shape = 17, size = 3, color = "red") +   
  labs(title = "Pre vs. Post Intervention with Zero-sum Environment Videos",
       x = "Intervention Period", y = "Score") +
  theme_minimal()

environment_figure

Boxplots of participants pre- and post-intervention environment zero-sum beliefs with gray lines connecting each participant's pre- and post-scores. Individual pre-zero-sum environment beliefs are indicated using a blue circle, and post-zero-sum environment beliefs are indicated using a red triangle.

figure 7. Paired pre- and post-intervention environment zero-sum beliefs of participants. Boxplots show overall distributions with lines connecting participants scores before and after the intervention.
ggsave("Pre vs. Post Intervention with Zero-sum Environment Videos.png", plot = environment_figure)
Saving 8 x 4 in image
# source: Zero-sum social identity, not zero-sum economic beliefs, explain voting preference in 2024 U.S. presidential election (McCarty et al., 2025)
# explanation: Compares participants' environment zero-sum beliefs scores before and after watching intervention videos by visualizing paired differences.
wilcox.test(condition1_selecteddata$ZSPRE_ENVIRO1, condition1_selecteddata$ZSPOST_ENVIRO1, paired = TRUE, alternative = "two.sided")
Warning in wilcox.test.default(condition1_selecteddata$ZSPRE_ENVIRO1,
condition1_selecteddata$ZSPOST_ENVIRO1, : cannot compute exact p-value with
ties
Warning in wilcox.test.default(condition1_selecteddata$ZSPRE_ENVIRO1,
condition1_selecteddata$ZSPOST_ENVIRO1, : cannot compute exact p-value with
zeroes

    Wilcoxon signed rank test with continuity correction

data:  condition1_selecteddata$ZSPRE_ENVIRO1 and condition1_selecteddata$ZSPOST_ENVIRO1
V = 27.5, p-value = 0.3557
alternative hypothesis: true location shift is not equal to 0
# source: Paired Samples Wilcoxon Test in R (STHDA, n.d.)
# explanation: Performs a paired-samples Wilcoxon test to compare participants' zero-sum scores pre- and post-intervention. p = 0.3557, indicating no statistical significance.
# Create long data with participant ID
paired_data_long<- condition1_selecteddata %>%
  select(ZSPRE_ENVIRO2, ZSPOST_ENVIRO2) %>%
  filter(!is.na(ZSPRE_ENVIRO2) & !is.na(ZSPOST_ENVIRO2)) %>% # Remove missing pairs
  mutate(ID = row_number()) %>%
  pivot_longer(cols = c(ZSPRE_ENVIRO2, ZSPOST_ENVIRO2), 
               names_to = "Composite", 
               values_to = "Score") %>%
  mutate(Composite = factor(Composite, levels = c("ZSPRE_ENVIRO2", "ZSPOST_ENVIRO2"))) # changes the order so that PREZEROSUM is shown before POSTZEROSUM

# Plot: boxplot + paired lines
environment_figure <- ggplot(paired_data_long, aes(x = Composite, y = Score, group = ID)) +
  geom_boxplot(aes(group = Composite), width = 0.5, alpha = 0.3, fill = "white", outlier.shape = NA) +
  geom_line(color = "gray70", alpha = 0.6) +  
  geom_point(data = paired_data_long %>% 
             filter(Composite == "ZSPRE_ENVIRO2"), 
             shape = 16, size = 3, color = "blue") +
  geom_point(data = paired_data_long %>% 
             filter(Composite == "ZSPOST_ENVIRO2"),
             shape = 17, size = 3, color = "red") +   
  labs(title = "Pre vs. Post Intervention with Zero-sum Environment Videos 2",
       x = "Intervention Period", y = "Score") +
  theme_minimal()

environment_figure

Boxplots of participants pre- and post-intervention environment zero-sum beliefs with gray lines connecting each participant's pre- and post-scores. Individual pre-zero-sum environment beliefs are indicated using a blue circle, and post-zero-sum environment beliefs are indicated using a red triangle.

figure 8. Paired pre- and post-intervention environment zero-sum beliefs of participants. Boxplots show overall distributions with lines connecting participants scores before and after the intervention.
ggsave("Pre vs. Post Intervention with Zero-sum Environment Videos 2.png", plot = environment_figure)
Saving 8 x 4 in image
# source: Zero-sum social identity, not zero-sum economic beliefs, explain voting preference in 2024 U.S. presidential election (McCarty et al., 2025)
# explanation: Compares participants' environment zero-sum beliefs scores before and after watching intervention videos by visualizing paired differences.
wilcox.test(condition1_selecteddata$ZSPRE_ENVIRO2, condition1_selecteddata$ZSPOST_ENVIRO2, paired = TRUE, alternative = "two.sided")
Warning in wilcox.test.default(condition1_selecteddata$ZSPRE_ENVIRO2,
condition1_selecteddata$ZSPOST_ENVIRO2, : cannot compute exact p-value with
ties
Warning in wilcox.test.default(condition1_selecteddata$ZSPRE_ENVIRO2,
condition1_selecteddata$ZSPOST_ENVIRO2, : cannot compute exact p-value with
zeroes

    Wilcoxon signed rank test with continuity correction

data:  condition1_selecteddata$ZSPRE_ENVIRO2 and condition1_selecteddata$ZSPOST_ENVIRO2
V = 78, p-value = 0.961
alternative hypothesis: true location shift is not equal to 0
# source: Paired Samples Wilcoxon Test in R (STHDA, n.d.)
# explanation: Performs a paired-samples Wilcoxon test to compare participants' zero-sum scores pre- and post-intervention. p = 0.961, indicating no statistical significance.

7 Model: Hope and Anxiety Paired Samples Wilcoxon Test

Hope scores: pre- vs. post-intervention

long_data <- condition1_selecteddata %>%
  select(PRE_HOPE, POST_HOPE) %>%
  pivot_longer(cols = c(PRE_HOPE, POST_HOPE),
              names_to = "Intervention_Period",
              values_to = "Hope_Score") %>%
  mutate(Intervention_Period = factor(Intervention_Period, levels = c("PRE_HOPE", "POST_HOPE"))) # changes the order so that PREZEROSUM is shown before POSTZEROSUM

# creates boxplots 
hope_figure <- ggplot(long_data, aes(x = Intervention_Period, y = Hope_Score, fill = Intervention_Period)) +
  geom_boxplot(width = 0.5, alpha = 0.7) +
  labs(title = "Pre vs Post Intervention Hope Levels", 
       x = "Intervention Period",
       y = "Hope Score") +
  scale_y_continuous(limits = c(1, 7), breaks = 1:7) +
  scale_fill_manual(values = c("PRE_HOPE" = "red", "POST_HOPE" = "blue")) +
  theme_minimal() + 
  theme(legend.position = "none")

hope_figure
Warning: Removed 4 rows containing non-finite outside the scale range
(`stat_boxplot()`).

Two boxplots comparing participants' hope scores before and after the intervention. The boxplot on the left (PRE_HOPE) shows pre-intervention hope levels in red, and the boxplot on the right (POST_HOPE) shows post-intervention hope levels in blue

figure 8. Paired pre- and post-intervention hope scores of participants. Boxplots show overall distributions.
ggsave("Pre vs Post Intervention Hope Levels.png", plot = hope_figure)
Saving 8 x 4 in image
Warning: Removed 4 rows containing non-finite outside the scale range
(`stat_boxplot()`).
# source: Zero-sum social identity, not zero-sum economic beliefs, explain voting preference in 2024 U.S. presidential election (McCarty et al., 2025); Create Your Own Discrete Scale (ggplot2, n.d.)
# explanation: Compares participants' hope scores before and after watching intervention videos by visualizing paired differences.
wilcox.test(condition1_selecteddata$PRE_HOPE, condition1_selecteddata$POST_HOPE, paired = TRUE, alternative = "two.sided")
Warning in wilcox.test.default(condition1_selecteddata$PRE_HOPE,
condition1_selecteddata$POST_HOPE, : cannot compute exact p-value with ties
Warning in wilcox.test.default(condition1_selecteddata$PRE_HOPE,
condition1_selecteddata$POST_HOPE, : cannot compute exact p-value with zeroes

    Wilcoxon signed rank test with continuity correction

data:  condition1_selecteddata$PRE_HOPE and condition1_selecteddata$POST_HOPE
V = 38.5, p-value = 0.2273
alternative hypothesis: true location shift is not equal to 0
# source: Paired Samples Wilcoxon Test in R (STHDA, n.d.)
# explanation: Performs a paired-samples Wilcoxon test to compare participants' hope scores pre- and post-intervention. p = 0.2273, indicating no statistical significance.

Anxiety scores: pre- vs. post-intervention

long_data <- condition1_selecteddata %>%
  select(PRE_ANXIETY, POST_ANXIETY) %>%
  pivot_longer(cols = c(PRE_ANXIETY, POST_ANXIETY),
              names_to = "Intervention_Period",
              values_to = "Anxiety_Score") %>%
  mutate(Intervention_Period = factor(Intervention_Period, levels = c("PRE_ANXIETY", "POST_ANXIETY"))) # changes the order so that PREZEROSUM is shown before POSTZEROSUM

# creates boxplots 
anxiety_figure <- ggplot(long_data, aes(x = Intervention_Period, y = Anxiety_Score, fill = Intervention_Period)) +
  geom_boxplot(width = 0.5, alpha = 0.7) +
  labs(title = "Pre vs Post Intervention Anxiety Levels", 
       x = "Intervention Period",
       y = "Anxiety Score") +
  scale_y_continuous(limits = c(1, 7), breaks = 1:7) +
   scale_fill_manual(values = c("PRE_ANXIETY" = "red", "POST_ANXIETY" = "blue")) +
  theme_minimal() + 
  theme(legend.position = "none")

anxiety_figure
Warning: Removed 4 rows containing non-finite outside the scale range
(`stat_boxplot()`).

Two boxplots comparing participants' anxiety scores before and after the intervention. The boxplot on the left (PRE_ANXIETY) shows pre-intervention anxiety levels in red, and the boxplot on the right (POST_ANXIETY) shows post-intervention anxiety levels in blue

figure 9. Paired pre- and post-intervention anxiety scores of participants. Boxplots show overall distributions.
ggsave("Pre vs Post Intervention Anxiety Levels.png", plot = anxiety_figure)
Saving 8 x 4 in image
Warning: Removed 4 rows containing non-finite outside the scale range
(`stat_boxplot()`).
# source: Zero-sum social identity, not zero-sum economic beliefs, explain voting preference in 2024 U.S. presidential election (McCarty et al., 2025); Create Your Own Discrete Scale (ggplot2, n.d.)
# explanation: Compares participants' hope scores before and after watching intervention videos by visualizing paired differences.
wilcox.test(condition1_selecteddata$PRE_ANXIETY, condition1_selecteddata$POST_ANXIETY, paired = TRUE, alternative = "two.sided")
Warning in wilcox.test.default(condition1_selecteddata$PRE_ANXIETY,
condition1_selecteddata$POST_ANXIETY, : cannot compute exact p-value with ties
Warning in wilcox.test.default(condition1_selecteddata$PRE_ANXIETY,
condition1_selecteddata$POST_ANXIETY, : cannot compute exact p-value with
zeroes

    Wilcoxon signed rank test with continuity correction

data:  condition1_selecteddata$PRE_ANXIETY and condition1_selecteddata$POST_ANXIETY
V = 7, p-value = 0.484
alternative hypothesis: true location shift is not equal to 0
# source: Paired Samples Wilcoxon Test in R (STHDA, n.d.)
# explanation: Performs a paired-samples Wilcoxon test to compare participants' anxiety scores pre- and post-intervention. p = 0.484, indicating no statistical significance.

8 Model: Linear Regression Spearman Correlation

Polarizing content: alignment vs engagement

polar_align_engage <- ggplot(selecteddata, aes(x = POLARALIGN, y = POLARENGAGEMENT)) +
  geom_point(alpha = 0.6, color = "red") +
  geom_smooth(method = "lm", color = "darkred", se = TRUE) +
  labs(title = "Polarizing Video Engagement vs alignment",
       x = "Alignment", y = "Engagement") +
  theme_minimal()

polar_align_engage
`geom_smooth()` using formula = 'y ~ x'

Scatterplot showing alignment on the x axis and engagement on the y axis. Red points show individual responses and a dark red regression line indicates a positive relationship.

figure 10. Relationship between polarization alignment and engagement. Fitted with a regression line to show the association between participant’s alignment with polarizing videos and their engagement levels.
ggsave("Polarizing Video Engagement vs alignment.png", plot = polar_align_engage)
Saving 8 x 4 in image
`geom_smooth()` using formula = 'y ~ x'
# source: R for Data Science - Data Visualization (Wickham et al., 2023)
# explanation:Linear regression showing the relationship between a person's alignment with the video content and level of engagement with video content.
cor.test(selecteddata$POLARALIGN, selecteddata$POLARENGAGEMENT, method = "spearman")
Warning in cor.test.default(selecteddata$POLARALIGN,
selecteddata$POLARENGAGEMENT, : Cannot compute exact p-value with ties

    Spearman's rank correlation rho

data:  selecteddata$POLARALIGN and selecteddata$POLARENGAGEMENT
S = 99786, p-value = 0.1327
alternative hypothesis: true rho is not equal to 0
sample estimates:
      rho 
-0.169555 
# source: Correlation Test Between Two Variables in R (STHDA, n.d.)
# explanation: performs a correlation test. Spearman is used because of nonnormality.

Leaning content: engagement vs allignment

lean_align_engage <- ggplot(selecteddata, aes(x = LEANALIGN, y = LEANENGAGEMENT)) +
  geom_point(alpha = 0.6, color = "blue") +
  geom_smooth(method = "lm", color = "darkblue", se = TRUE) +
  labs(title = "Leaning Video Engagement vs ALIGN",
       x = "Alignment", y = "Engagement") +
  theme_minimal()

lean_align_engage
`geom_smooth()` using formula = 'y ~ x'

Scatterplot showing alignment on the x axis and engagement on the y axis. Blue points show individual responses and a dark blue regression line indicates a positive relationship.

figure 11. Relationship between leaning alignment and engagement. Fitted with a regression line to show the association between participant’s alignment with leaning videos and their engagement levels.
ggsave("Leaning Video Engagement vs alignment.png", plot = lean_align_engage)
Saving 8 x 4 in image
`geom_smooth()` using formula = 'y ~ x'
# source: R for Data Science - Data Visualization (Wickham et al., 2023)
# explanation: Linear regression showing the relationship between a person's alignment with the video content and level of engagement with video content.
cor.test(selecteddata$LEANENGAGEMENT, selecteddata$LEANALIGN, method = "spearman")
Warning in cor.test.default(selecteddata$LEANENGAGEMENT,
selecteddata$LEANALIGN, : Cannot compute exact p-value with ties

    Spearman's rank correlation rho

data:  selecteddata$LEANENGAGEMENT and selecteddata$LEANALIGN
S = 86799, p-value = 0.8787
alternative hypothesis: true rho is not equal to 0
sample estimates:
       rho 
-0.0173329 
# source: correlation Test Between Two Variables in R (STHDA, n.d.)
# explanation: performs a correlation test. Spearman is used because of nonnormality.

9 Model: Zero-sum Correlation Matrixes

zero_sum_pre_items <- c("ZSPRE_IMM", "ZSPRE_HEALTH", "ZSPRE_WOMEN1", "ZSPRE_WOMEN2",
                        "ZSPRE_ECONOMY", "ZSPRE_DEI1", "ZSPRE_DEI2", 
                        "ZSPRE_ENVIRO1", "ZSPRE_ENVIRO2")


cor_data <- selecteddata[, c(zero_sum_pre_items, "PREZEROSUM")]


cor_data <- data.frame(lapply(cor_data, function(x) {
  if(is.factor(x)) as.numeric(x) else as.numeric(x)
}))


M <- cor(cor_data, use = "pairwise.complete.obs", method = "pearson")
print(round(M, 2))
              ZSPRE_IMM ZSPRE_HEALTH ZSPRE_WOMEN1 ZSPRE_WOMEN2 ZSPRE_ECONOMY
ZSPRE_IMM          1.00         0.53         0.35         0.51         -0.15
ZSPRE_HEALTH       0.53         1.00         0.06         0.46         -0.23
ZSPRE_WOMEN1       0.35         0.06         1.00         0.38         -0.13
ZSPRE_WOMEN2       0.51         0.46         0.38         1.00         -0.07
ZSPRE_ECONOMY     -0.15        -0.23        -0.13        -0.07          1.00
ZSPRE_DEI1         0.76         0.44         0.32         0.55         -0.15
ZSPRE_DEI2         0.59         0.57         0.29         0.70         -0.26
ZSPRE_ENVIRO1      0.49         0.36         0.24         0.54          0.10
ZSPRE_ENVIRO2     -0.25        -0.13        -0.10        -0.24          0.29
PREZEROSUM         0.73         0.60         0.50         0.71          0.16
              ZSPRE_DEI1 ZSPRE_DEI2 ZSPRE_ENVIRO1 ZSPRE_ENVIRO2 PREZEROSUM
ZSPRE_IMM           0.76       0.59          0.49         -0.25       0.73
ZSPRE_HEALTH        0.44       0.57          0.36         -0.13       0.60
ZSPRE_WOMEN1        0.32       0.29          0.24         -0.10       0.50
ZSPRE_WOMEN2        0.55       0.70          0.54         -0.24       0.71
ZSPRE_ECONOMY      -0.15      -0.26          0.10          0.29       0.16
ZSPRE_DEI1          1.00       0.66          0.56         -0.12       0.78
ZSPRE_DEI2          0.66       1.00          0.40         -0.18       0.71
ZSPRE_ENVIRO1       0.56       0.40          1.00         -0.06       0.70
ZSPRE_ENVIRO2      -0.12      -0.18         -0.06          1.00       0.13
PREZEROSUM          0.78       0.71          0.70          0.13       1.00
cor.mtest <- function(mat, ...) {
  mat <- as.matrix(mat)
  n <- ncol(mat)
  p.mat <- matrix(NA, n, n)
  diag(p.mat) <- 0
  for(i in 1:(n-1)) {
    for(j in (i+1):n) {
      tmp <- cor.test(mat[,i], mat[,j], ...)
      p.mat[i,j] <- p.mat[j,i] <- tmp$p.value
    }
  }
  colnames(p.mat) <- rownames(p.mat) <- colnames(mat)
  return(p.mat)
}


p.mat <- cor.mtest(cor_data)

col <- colorRampPalette(c("red", "white", "blue"))(20)


corrplot(M, 
         type = "upper",         
         order = "hclust",      
         col = col,        
         tl.col = "black",     
         tl.srt = 45,        
         p.mat = p.mat,       
         sig.level = 0.05,    
         insig = "blank", 
         addCoef.col = "black")   

Correlation matrix heatmap showing pearson correlations between pre-zero-sum survey items and the composite pre-zero-sum score. Stronger positive correlations are in blue, weaker are in red.

figure 12. Correlation matrix of pre-intervention zero-sum survey items and the composite pre-zero-sum score.
# source: Correlation matrix : An R function to do all you need (STHDA, n.d.)
# explanation: Correlation matrix of pre-intervention zero-sum survey items and the composite pre-zero-sum score