Processing math: 100%
  • Background
  • Eligibility
  • Demographics
    • Race
    • Gender
    • Age
    • Education
    • Subjective SES
    • Income
  • Politics
    • Ideology
    • Party ID
    • Vote in 2020
    • Vote in 2024
  • Measures
    • Class-based Zero-Sum Beliefs
    • Race-based Zero-Sum Beliefs
    • Linked Fate
      • White Working Class
      • White Upper Class
      • Non-White Working Class
      • Non-White Upper Class
  • Analysis
    • Correlation matrix
    • Regressions
      • Outcome: White Upper Class Linked Fate
      • Outcome: Non-White Working Class Linked Fate

Background

The purpose of this study was to validate the correlational relationship between race+class zero-sum and linked fate.

We targeted white working class folks and wanted to see if their zs beliefs map onto to their perceived linked fate with either upper class white people (if they have more racial zero-sum beliefs or working class non white people (if they have more class zero-sum beliefs).

Eligibility

First, let’s see how many people entered the survey and did not pass the initial eligibility block.
We filtered on race (for white people) and on income (lower than 100k) and ses (anything other than upper class) and education (masters and above).

df_cbzs %>% 
  filter(elg == 0) %>% 
  group_by(race,
           income,
           ses,
           edu) %>% 
  summarise(N = n()) %>% 
  ungroup() %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = "hover",
                full_width = F,
                position = "left")
race income ses edu N
Hispanic, Latino, or Spanish origin $20,001-$40,000 Lower Middle Class 4yearColl 1
Hispanic, Latino, or Spanish origin $20,001-$40,000 Middle Class 4yearColl 1
Hispanic, Latino, or Spanish origin $40,001-$60,000 Middle Class MA 1
Hispanic, Latino, or Spanish origin $60,001-$80,000 Middle Class 2yearColl 1
Hispanic, Latino, or Spanish origin $100,001-$120,000 Middle Class 4yearColl 1
Other (please specify) $80,001-$100,000 Middle Class 4yearColl 1
White $20,001-$40,000 Lower Middle Class MA 1
White $20,001-$40,000 Middle Class MA 1
White $20,001-$40,000 Upper Class 4yearColl 1
White $60,001-$80,000 Middle Class MA 1
White $100,001-$120,000 Upper Middle Class 4yearColl 1
White $120,001-$140,000 Middle Class 4yearColl 1
White $160,001-$180,000 Upper Middle Class 4yearColl 1


ok cool. 13 people didn’t pass the eligibility criteria and were routed out of the survey. that leaves us with 200 eligible participants.

Demographics

Race

df_cbzs_elg %>% 
  group_by(race) %>% 
  summarise(N = n()) %>% 
  ungroup() %>% 
  mutate(Perc = round(100*(N/sum(N)),2)) %>% 
  ungroup() %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = "hover",
                full_width = F,
                position = "left")
race N Perc
White 193 96.5
multiracial 7 3.5

Gender

df_cbzs_elg %>% 
  mutate(gender = ifelse(is.na(gender) | gender == "","other",gender)) %>% 
  group_by(gender) %>% 
  summarise(N = n()) %>% 
  ungroup() %>% 
  mutate(Perc = round(100*(N/sum(N)),2)) %>% 
  ungroup() %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = "hover",
                full_width = F,
                position = "left")
gender N Perc
man 81 40.5
other 1 0.5
woman 118 59.0

Age

df_cbzs_elg %>% 
  summarise(age_mean = round(mean(age,na.rm = T),2),
            age_sd = round(sd(age,na.rm = T),2)) %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = "hover",
                full_width = F,
                position = "left")
age_mean age_sd
40.3 13.53

Education

df_cbzs_elg %>% 
  group_by(edu) %>% 
  summarise(N = n()) %>% 
  ungroup() %>% 
  mutate(Perc = round(100*(N/sum(N)),2)) %>% 
  ungroup() %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = "hover",
                full_width = F,
                position = "left")
edu N Perc
noHS 1 0.5
GED 80 40.0
2yearColl 41 20.5
4yearColl 78 39.0

Subjective SES

df_cbzs_elg %>% 
  group_by(ses) %>% 
  summarise(N = n()) %>% 
  ungroup() %>% 
  mutate(Perc = round(100*(N/sum(N)),2)) %>% 
  ungroup() %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = "hover",
                full_width = F,
                position = "left")
ses N Perc
Lower Class 42 21
Lower Middle Class 96 48
Middle Class 56 28
Upper Middle Class 6 3

Income

df_cbzs_elg %>% 
  ggplot(aes(x = income)) +
  geom_bar() +
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.background = element_blank(),
        axis.ticks = element_blank(),
        axis.line = element_line(color = "grey66"),
        axis.text.y = element_text(color = "black"),
        axis.text.x = element_text(color = "black",
                                   face = "bold"),
        axis.title.x = element_blank(),
        axis.title.y = element_blank()) +
  coord_flip()

Politics

Ideology

Participants were asked about the extent to which they subscribe to the following ideologies on a scale of 1-7 (select NA if unfamiliar): Conservatism, Liberalism, Democratic Socialism, Libertarianism, Progressivism.

means <- df_cbzs_elg %>%
  dplyr::select(PID,ideo_con:ideo_prog) %>% 
  pivot_longer(-PID,
               names_to = "ideo",
               values_to = "score") %>% 
  filter(!is.na(score)) %>% 
  group_by(ideo) %>% 
  summarise(score = mean(score)) %>% 
  ungroup()

df_cbzs_elg %>%
  dplyr::select(PID,ideo_con:ideo_prog) %>% 
  pivot_longer(-PID,
               names_to = "ideo",
               values_to = "score") %>% 
  filter(!is.na(score)) %>%  
  ggplot() +
  geom_density(aes(x = score), fill = "lightblue") +
  scale_x_continuous(limits = c(1,7),
                     breaks = seq(1,7,1)) +
  geom_vline(data = means,mapping = aes(xintercept = score),
             color = "black",
             linetype = "dashed",
             size = 1.1) +
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.background = element_blank(),
        axis.ticks = element_blank(),
        axis.line = element_line(color = "grey66"),
        axis.text.y = element_text(color = "black"),
        axis.text.x = element_text(color = "black",
                                   face = "bold")) +
  facet_wrap(~ideo,nrow = 2)

Party ID

df_cbzs_elg %>% 
  group_by(party_id) %>% 
  summarise(N = n()) %>% 
  ungroup() %>% 
  mutate(Perc = round(100*(N/sum(N)),2)) %>% 
  ungroup() %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = "hover",
                full_width = F,
                position = "left")
party_id N Perc
Democrat 67 33.5
Independent 61 30.5
Republican 72 36.0

Vote in 2020

df_cbzs_elg %>% 
  group_by(vote_2020) %>% 
  summarise(N = n()) %>% 
  ungroup() %>% 
  mutate(Perc = round(100*(N/sum(N)),2)) %>% 
  ungroup() %>% 
  arrange(desc(N)) %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = "hover",
                full_width = F,
                position = "left")
vote_2020 N Perc
Joe Biden 80 40.0
Donald Trump 66 33.0
I did not vote 45 22.5
Third-party candidate 9 4.5

Vote in 2024

df_cbzs_elg %>% 
  group_by(vote_2024) %>% 
  summarise(N = n()) %>% 
  ungroup() %>% 
  mutate(Perc = round(100*(N/sum(N)),2)) %>% 
  ungroup() %>% 
  arrange(desc(N)) %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = "hover",
                full_width = F,
                position = "left")
vote_2024 N Perc
Donald Trump 80 40.0
Joe Biden 74 37.0
I will not vote 21 10.5
Robert F. Kennedy Jr.  15 7.5
Cornel West 5 2.5
Other 5 2.5

Measures

Class-based Zero-Sum Beliefs

  1. If the upper class becomes richer, this comes at the expense of the working class
  2. If the upper class makes more money, then the working class makes less money
  3. If the upper class does better economically, this does NOT come at the expense of the working class [R]

    alpha = 0.94
df_cbzs_elg %>% 
  ggplot(aes(x = zs_class)) +
  geom_density(fill = "lightblue",
                 color = "black") +
  scale_x_continuous(breaks = seq(1,7,1),
                     limits = c(1,7)) +
  ylab("density") +
  geom_vline(xintercept = mean(df_cbzs_elg$zs_class,na.rm = T),
             color = "black",
             linetype = "dashed",
             size = 1.1) +
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.background = element_blank(),
        axis.ticks = element_blank(),
        axis.line = element_line(color = "grey66"),
        axis.text.y = element_text(color = "black"),
        axis.text.x = element_text(color = "black",
                                   face = "bold"),
        axis.title.x = element_text(color = "black",
                                   face = "bold"))

Race-based Zero-Sum Beliefs

  1. If racial minorities become richer, this comes at the expense of white people
  2. If racial minorities make more money, then white people make less money
  3. If the racial minorities do better economically, this does NOT come at the expense of white people [R]

    alpha = 0.91
df_cbzs_elg %>% 
  ggplot(aes(x = zs_race)) +
  geom_density(fill = "lightblue",
                 color = "black") +
  scale_x_continuous(breaks = seq(1,7,1),
                     limits = c(1,7)) +
  ylab("density") +
  geom_vline(xintercept = mean(df_cbzs_elg$zs_race,na.rm = T),
             color = "black",
             linetype = "dashed",
             size = 1.1) +
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.background = element_blank(),
        axis.ticks = element_blank(),
        axis.line = element_line(color = "grey66"),
        axis.text.y = element_text(color = "black"),
        axis.text.x = element_text(color = "black",
                                   face = "bold"),
        axis.title.x = element_text(color = "black",
                                   face = "bold"))

Linked Fate

White Working Class

Please indicate your agreement, as a white working class person, with the following statements.

1. Issues that affect me also affect white working class people
2. What happens to white working class people in this country will have something to do with what happens to me
3. White working class people and me share a common destiny
4. Progress for white working class people also means progress for me

alpha = 0.85

df_cbzs_elg %>% 
  ggplot(aes(x = lnktfate_wwc)) +
  geom_density(fill = "lightblue",
                 color = "black") +
  scale_x_continuous(breaks = seq(1,7,1),
                     limits = c(1,7)) +
  ylab("density") +
  geom_vline(xintercept = mean(df_cbzs_elg$lnktfate_wwc,na.rm = T),
             color = "black",
             linetype = "dashed",
             size = 1.1) +
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.background = element_blank(),
        axis.ticks = element_blank(),
        axis.line = element_line(color = "grey66"),
        axis.text.y = element_text(color = "black"),
        axis.text.x = element_text(color = "black",
                                   face = "bold"),
        axis.title.x = element_text(color = "black",
                                   face = "bold"))

White Upper Class

Please indicate your agreement, as a white working class person, with the following statements.

1. Issues that affect me also affect white upper class people
2. What happens to white upper class people in this country will have something to do with what happens to me
3. White upper class people and me share a common destiny
4. Progress for white upper class people also means progress for me

alpha = 0.89

df_cbzs_elg %>% 
  ggplot(aes(x = lnktfate_wuc)) +
  geom_density(fill = "lightblue",
                 color = "black") +
  scale_x_continuous(breaks = seq(1,7,1),
                     limits = c(1,7)) +
  ylab("density") +
  geom_vline(xintercept = mean(df_cbzs_elg$lnktfate_wuc,na.rm = T),
             color = "black",
             linetype = "dashed",
             size = 1.1) +
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.background = element_blank(),
        axis.ticks = element_blank(),
        axis.line = element_line(color = "grey66"),
        axis.text.y = element_text(color = "black"),
        axis.text.x = element_text(color = "black",
                                   face = "bold"),
        axis.title.x = element_text(color = "black",
                                   face = "bold"))

Non-White Working Class

Please indicate your agreement, as a white working class person, with the following statements.

1. Issues that affect me also affect non-white working class people
2. What happens to non-white working class people in this country will have something to do with what happens to me
3. Non-white working class people and me share a common destiny
4. Progress for non-white working class people also means progress for me

alpha = 0.88

df_cbzs_elg %>% 
  ggplot(aes(x = lnktfate_nwwc)) +
  geom_density(fill = "lightblue",
                 color = "black") +
  scale_x_continuous(breaks = seq(1,7,1),
                     limits = c(1,7)) +
  ylab("density") +
  geom_vline(xintercept = mean(df_cbzs_elg$lnktfate_nwwc,na.rm = T),
             color = "black",
             linetype = "dashed",
             size = 1.1) +
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.background = element_blank(),
        axis.ticks = element_blank(),
        axis.line = element_line(color = "grey66"),
        axis.text.y = element_text(color = "black"),
        axis.text.x = element_text(color = "black",
                                   face = "bold"),
        axis.title.x = element_text(color = "black",
                                   face = "bold"))

Non-White Upper Class

Please indicate your agreement, as a white working class person, with the following statements.

1. Issues that affect me also affect non-white upper class people
2. What happens to non-white upper class people in this country will have something to do with what happens to me
3. Non-white upper class people and me share a common destiny
4. Progress for non-white upper class people also means progress for me

alpha = 0.88

df_cbzs_elg %>% 
  ggplot(aes(x = lnktfate_nwuc)) +
  geom_density(fill = "lightblue",
                 color = "black") +
  scale_x_continuous(breaks = seq(1,7,1),
                     limits = c(1,7)) +
  ylab("density") +
  geom_vline(xintercept = mean(df_cbzs_elg$lnktfate_nwuc,na.rm = T),
             color = "black",
             linetype = "dashed",
             size = 1.1) +
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.background = element_blank(),
        axis.ticks = element_blank(),
        axis.line = element_line(color = "grey66"),
        axis.text.y = element_text(color = "black"),
        axis.text.x = element_text(color = "black",
                                   face = "bold"),
        axis.title.x = element_text(color = "black",
                                   face = "bold"))

Analysis

Correlation matrix

df_cbzs_elg <- df_cbzs_elg %>% 
  mutate(income_num = as.numeric(income),
         edu_num = as.numeric(edu),
         ses_num = as.numeric(ses))

df_cbzs_elg %>%
  dplyr::select(zs_class:lnktfate_nwuc,ideo_con:ideo_prog,income_num:ses_num) %>%
  corPlot(upper = TRUE,stars = TRUE,xsrt = 270)

I like what I’m seeing! A few notes.
1. Class ZS is doing exactly what we want it to do. positive correlation with working class linked fate (both white and non-white) and negative correlations with upper class linked fate. That’s great.
2. Race ZS is also doing what we want it to do: Positively correlated with white upper class linked fate and negatively correlated with non-white working class linked fate.
3. Despite being filtered for, we still see meaningful correlations with SES, and in the direction you’d expect. So, that’s cool. I bet our effects are stronger for lower SES.

Regressions

Outcome: White Upper Class Linked Fate

m1 <- lm(lnktfate_wuc ~ zs_race,data = df_cbzs_elg)

apa_lm <- apa_print(m1)
apa_table(
  apa_lm$table, 
  placement = "H"
)
(#tab:unnamed-chunk-26)
Predictor b 95% CI t df p
Intercept 2.62 [2.25, 3.00] 13.86 198 < .001
Zs race 0.31 [0.19, 0.43] 5.09 198 < .001
m1 <- lm(lnktfate_wuc ~ zs_race + ideo_con,data = df_cbzs_elg)

apa_lm <- apa_print(m1)
apa_table(
  apa_lm$table, 
  placement = "H"
)
(#tab:unnamed-chunk-27)
Predictor b 95% CI t df p
Intercept 2.25 [1.81, 2.69] 10.06 190 < .001
Zs race 0.26 [0.13, 0.38] 4.00 190 < .001
Ideo con 0.14 [0.05, 0.23] 3.10 190 .002
m1 <- lm(lnktfate_wuc ~ zs_race + ideo_con + lnktfate_wwc,data = df_cbzs_elg)

apa_lm <- apa_print(m1)
apa_table(
  apa_lm$table, 
  placement = "H"
)
(#tab:unnamed-chunk-28)
Predictor b 95% CI t df p
Intercept 1.77 [0.52, 3.02] 2.79 189 .006
Zs race 0.26 [0.13, 0.39] 4.02 189 < .001
Ideo con 0.14 [0.05, 0.23] 3.09 189 .002
Lnktfate wwc 0.08 [-0.12, 0.29] 0.81 189 .418
m1 <- lm(lnktfate_wuc ~ zs_race + ideo_con + lnktfate_wwc + lnktfate_nwwc,data = df_cbzs_elg)

apa_lm <- apa_print(m1)
apa_table(
  apa_lm$table, 
  placement = "H"
)
(#tab:unnamed-chunk-29)
Predictor b 95% CI t df p
Intercept 1.40 [0.00, 2.81] 1.97 188 .050
Zs race 0.28 [0.15, 0.42] 4.16 188 < .001
Ideo con 0.15 [0.06, 0.24] 3.22 188 .002
Lnktfate wwc 0.04 [-0.18, 0.26] 0.38 188 .702
Lnktfate nwwc 0.10 [-0.08, 0.28] 1.10 188 .272
m1 <- lm(lnktfate_wuc ~ zs_race*zs_class,data = df_cbzs_elg)

apa_lm <- apa_print(m1)
apa_table(
  apa_lm$table, 
  placement = "H"
)
(#tab:unnamed-chunk-30)
Predictor b 95% CI t df p
Intercept 4.60 [3.53, 5.66] 8.50 196 < .001
Zs race 0.34 [-0.03, 0.71] 1.80 196 .074
Zs class -0.38 [-0.58, -0.18] -3.83 196 < .001
Zs race × Zs class -0.01 [-0.08, 0.06] -0.33 196 .744
interact_plot(m1,
              pred = "zs_class",
              modx = "zs_race",
              interval = T)

class zs just takes over. that’s cool. If you believe the rich are gaining at your expense, you have nothing in common with upper class white people, even if you have racial zero-sum beliefs.

m1 <- lm(lnktfate_wuc ~ zs_race*zs_class + lnktfate_wwc,data = df_cbzs_elg)

apa_lm <- apa_print(m1)
apa_table(
  apa_lm$table, 
  placement = "H"
)
(#tab:unnamed-chunk-32)
Predictor b 95% CI t df p
Intercept 3.61 [2.24, 4.98] 5.20 195 < .001
Zs race 0.32 [-0.05, 0.69] 1.73 195 .086
Zs class -0.41 [-0.60, -0.21] -4.10 195 < .001
Lnktfate wwc 0.20 [0.02, 0.37] 2.22 195 .028
Zs race × Zs class -0.01 [-0.08, 0.06] -0.22 195 .827
interact_plot(m1,
              pred = "zs_class",
              modx = "zs_race",
              interval = T)

Outcome: Non-White Working Class Linked Fate

m1 <- lm(lnktfate_nwwc ~ zs_class,data = df_cbzs_elg)

apa_lm <- apa_print(m1)
apa_table(
  apa_lm$table, 
  placement = "H"
)
(#tab:unnamed-chunk-34)
Predictor b 95% CI t df p
Intercept 4.08 [3.53, 4.63] 14.62 198 < .001
Zs class 0.17 [0.06, 0.27] 3.14 198 .002
m1 <- lm(lnktfate_nwwc ~ zs_class + ideo_con,data = df_cbzs_elg)

apa_lm <- apa_print(m1)
apa_table(
  apa_lm$table, 
  placement = "H"
)
(#tab:unnamed-chunk-35)
Predictor b 95% CI t df p
Intercept 4.66 [3.87, 5.45] 11.62 190 < .001
Zs class 0.12 [0.01, 0.24] 2.09 190 .038
Ideo con -0.08 [-0.17, 0.00] -1.98 190 .049
m1 <- lm(lnktfate_nwwc ~ zs_class + lnktfate_wwc,data = df_cbzs_elg)

apa_lm <- apa_print(m1)
apa_table(
  apa_lm$table, 
  placement = "H"
)
(#tab:unnamed-chunk-36)
Predictor b 95% CI t df p
Intercept 1.83 [0.82, 2.84] 3.57 197 < .001
Zs class 0.13 [0.03, 0.23] 2.56 197 .011
Lnktfate wwc 0.44 [0.27, 0.61] 5.11 197 < .001
m1 <- lm(lnktfate_nwwc ~ zs_class + lnktfate_wwc + lnktfate_wuc,data = df_cbzs_elg)

apa_lm <- apa_print(m1)
apa_table(
  apa_lm$table, 
  placement = "H"
)
(#tab:unnamed-chunk-37)
Predictor b 95% CI t df p
Intercept 1.86 [0.69, 3.03] 3.13 196 .002
Zs class 0.13 [0.01, 0.24] 2.17 196 .031
Lnktfate wwc 0.44 [0.27, 0.61] 5.06 196 < .001
Lnktfate wuc -0.01 [-0.13, 0.12] -0.10 196 .919
m1 <- lm(lnktfate_nwwc ~ zs_class*zs_race,data = df_cbzs_elg)

apa_lm <- apa_print(m1)
apa_table(
  apa_lm$table, 
  placement = "H"
)
(#tab:unnamed-chunk-38)
Predictor b 95% CI t df p
Intercept 3.94 [2.95, 4.94] 7.83 196 < .001
Zs class 0.33 [0.15, 0.52] 3.62 196 < .001
Zs race 0.13 [-0.21, 0.47] 0.75 196 .457
Zs class × Zs race -0.08 [-0.14, -0.02] -2.43 196 .016
interact_plot(m1,
              pred = "zs_class",
              modx = "zs_race",
              interval = T)

oh this is cool. These are the racial divides obstacles to class solidarity. If you’re high on race zs, it doesn’t matter how much you believe that the rich are gaining at your expense. If you’re low on race zs, it matters a lot.

m1 <- lm(lnktfate_nwwc ~ zs_class*zs_race + lnktfate_wwc,data = df_cbzs_elg)

apa_lm <- apa_print(m1)
apa_table(
  apa_lm$table, 
  placement = "H"
)
(#tab:unnamed-chunk-40)
Predictor b 95% CI t df p
Intercept 1.88 [0.67, 3.09] 3.07 195 .002
Zs class 0.28 [0.11, 0.45] 3.21 195 .002
Zs race 0.10 [-0.23, 0.42] 0.58 195 .560
Lnktfate wwc 0.42 [0.26, 0.57] 5.27 195 < .001
Zs class × Zs race -0.07 [-0.13, -0.01] -2.32 195 .021
interact_plot(m1,
              pred = "zs_class",
              modx = "zs_race",
              interval = T)