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
- If the upper class becomes richer, this comes at the expense of the
working class
- If the upper class makes more money, then the working class makes
less money
- 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
- If racial minorities become richer, this comes at the expense of
white people
- If racial minorities make more money, then white people make less
money
- 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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
