Background

The purpose of this study is to pilot our experimental manipulation for class (class-frame vs. control) and zero-sum (zs-frame vs. control) framing of progressive housing policy.

See materials here

We also measured support and race zero-sum beliefs, just to get a sense.

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
Asian 13 6.5
Black or African American 26 13.0
Hispanic, Latino, or Spanish origin 13 6.5
Other (please specify) 1 0.5
White 134 67.0
multiracial 12 6.0
NA 1 0.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 100 50.0
other 3 1.5
woman 97 48.5

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
39.52 12.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 3 1.5
GED 52 26.0
2yearColl 29 14.5
4yearColl 84 42.0
MA 21 10.5
PHD 9 4.5
NA 2 1.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 20 10.0
Lower Middle Class 57 28.5
Middle Class 92 46.0
Upper Middle Class 29 14.5
Upper Class 1 0.5
NA 1 0.5

Working Class

Do you see yourself as part of the working class?

df_cbzs_elg %>% 
  group_by(wrkclass) %>% 
  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")
wrkclass N Perc
Yes 154 77
No 30 15
Not sure 16 8

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 64 32
Independent 66 33
Republican 70 35

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 92 46.0
Donald Trump 63 31.5
I did not vote 37 18.5
Third-party candidate 8 4.0

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
Joe Biden 74 37.0
Donald Trump 70 35.0
I will not vote 24 12.0
Robert F. Kennedy Jr.  18 9.0
Other 10 5.0
Jill Stein 3 1.5
Cornel West 1 0.5

Measures

Manipulation check: Class

The policy proposal emphasizes the benefit for working class individuals seeking homeownership

df_cbzs_elg %>%
  ggplot(aes(x = check_class)) +
  geom_histogram(fill = "lightblue",
                 color = "black",
                 binwidth = 1) +
  scale_x_continuous(limits = c(0,8),
                     breaks = seq(1,7,1)) +
  geom_vline(xintercept = mean(df_cbzs_elg$check_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"))

Manipulation check: Zero-Sum

This policy proposal emphasizes that one group has gained at the expense of another group

df_cbzs_elg %>%
  ggplot(aes(x = check_zs)) +
  geom_histogram(fill = "lightblue",
                 color = "black",
                 binwidth = 1) +
  scale_x_continuous(limits = c(0,8),
                     breaks = seq(1,7,1)) +
  geom_vline(xintercept = mean(df_cbzs_elg$check_zs,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"))

Support

To what extent do you oppose or support this policy?

df_cbzs_elg %>%
  ggplot(aes(x = support)) +
  geom_histogram(fill = "lightblue",
                 color = "black",
                 binwidth = 1) +
  scale_x_continuous(limits = c(0,8),
                     breaks = seq(1,7,1)) +
  geom_vline(xintercept = mean(df_cbzs_elg$support,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"))

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.91
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"))

Analysis

DV: Class manipulation check

Descriptives

df_cbzs_elg %>% 
  group_by(cond_class,cond_zs) %>% 
  summarise(mean = mean(check_class,na.rm = T),
            sd = sd(check_class,na.rm = T)) %>% 
  ungroup() %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = "hover",
                full_width = F,
                position = "left")
## `summarise()` has grouped output by 'cond_class'. You can override using the
## `.groups` argument.
cond_class cond_zs mean sd
0 0 5.698113 1.1021815
0 1 5.446809 1.2821265
1 0 6.127660 0.8499878
1 1 5.679245 1.4381289

Stats

Effect DFn DFd F p p<.05 ges
cond_class 1 196 3.827 0.052 0.019
cond_zs 1 196 4.275 0.040
0.021
cond_class:cond_zs 1 196 0.339 0.561 0.002

Plot

This is very weak.

DV: Zero-Sum manipulation check

Descriptives

df_cbzs_elg %>% 
  group_by(cond_class,cond_zs) %>% 
  summarise(mean = mean(check_zs,na.rm = T),
            sd = sd(check_zs,na.rm = T)) %>% 
  ungroup() %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = "hover",
                full_width = F,
                position = "left")
## `summarise()` has grouped output by 'cond_class'. You can override using the
## `.groups` argument.
cond_class cond_zs mean sd
0 0 3.433962 1.562904
0 1 4.893617 1.644940
1 0 3.276596 1.814221
1 1 5.358491 1.630176

Stats

Effect DFn DFd F p p<.05 ges
cond_class 1 196 0.427 0.514 0.002
cond_zs 1 196 56.588 0.000
0.224
cond_class:cond_zs 1 196 1.747 0.188 0.009

Plot

Much better.

DV: Support

Descriptives

df_cbzs_elg %>% 
  group_by(cond_class,cond_zs) %>% 
  summarise(mean = mean(support,na.rm = T),
            sd = sd(support,na.rm = T)) %>% 
  ungroup() %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = "hover",
                full_width = F,
                position = "left")
## `summarise()` has grouped output by 'cond_class'. You can override using the
## `.groups` argument.
cond_class cond_zs mean sd
0 0 5.415094 1.167409
0 1 4.808511 1.676413
1 0 5.276596 1.715684
1 1 4.981132 1.715210

Stats

Effect DFn DFd F p p<.05 ges
cond_class 1 196 0.006 0.939 2.97e-05
cond_zs 1 196 4.066 0.045
2.00e-02
cond_class:cond_zs 1 196 0.484 0.488 2.00e-03

Plot

Not great. Could be an artifact of the manipulation checks, though. Especially because it emphasizes that one group loses. But still, looks like the zero-sum conditions are under-performing, and that’s not what we’d want to see.

DV: Class ZSB’s

Descriptives

df_cbzs_elg %>% 
  group_by(cond_class,cond_zs) %>% 
  summarise(mean = mean(zs_class,na.rm = T),
            sd = sd(zs_class,na.rm = T)) %>% 
  ungroup() %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = "hover",
                full_width = F,
                position = "left")
## `summarise()` has grouped output by 'cond_class'. You can override using the
## `.groups` argument.
cond_class cond_zs mean sd
0 0 4.138365 1.528132
0 1 4.730497 1.509452
1 0 4.446809 1.743555
1 1 4.389937 1.602263

Stats

Effect DFn DFd F p p<.05 ges
cond_class 1 196 0.005 0.943 2.57e-05
cond_zs 1 196 1.400 0.238 7.00e-03
cond_class:cond_zs 1 196 2.058 0.153 1.00e-02

Plot

Extra analyses

Ideology moderator

Is ZSB framing lowering support for all participants, across poli ideological spectrum?

Descriptives

df_cbzs_elg %>% 
  mutate(is_conservative = ifelse(ideo_con > 4,1,0),
         is_liberal = ifelse(ideo_lib > 4,1,0)) %>% 
  group_by(is_conservative,cond_class,cond_zs) %>% 
  summarise(mean = mean(support,na.rm = T),
            sd = sd(support,na.rm = T)) %>% 
  ungroup() %>% 
  filter(!is.na(is_conservative)) %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = "hover",
                full_width = F,
                position = "left")
## `summarise()` has grouped output by 'is_conservative', 'cond_class'. You can
## override using the `.groups` argument.
is_conservative cond_class cond_zs mean sd
0 0 0 5.535714 1.137969
0 0 1 5.037037 1.531251
0 1 0 5.758621 1.057462
0 1 1 5.281250 1.611138
1 0 0 5.428571 1.247855
1 0 1 4.133333 1.922300
1 1 0 4.285714 2.431478
1 1 1 4.400000 1.759186

Plot

Class ZSB’s as control

(#tab:unnamed-chunk-32)
Predictor \(b\) 95% CI \(t\) \(\mathit{df}\) \(p\)
Intercept 4.38 [3.69, 5.08] 12.41 195 < .001
Cond class -0.22 [-0.82, 0.39] -0.70 195 .484
Cond zs -0.75 [-1.36, -0.14] -2.44 195 .016
Zs class 0.25 [0.11, 0.38] 3.65 195 < .001
Cond class \(\times\) Cond zs 0.47 [-0.39, 1.33] 1.08 195 .279

SES as control

(#tab:unnamed-chunk-33)
Predictor \(b\) 95% CI \(t\) \(\mathit{df}\) \(p\)
Intercept 6.28 [5.48, 7.08] 15.47 194 < .001
Cond class -0.10 [-0.71, 0.51] -0.33 194 .739
Cond zs -0.62 [-1.23, -0.02] -2.03 194 .044
As numericses -0.32 [-0.57, -0.07] -2.49 194 .014
Cond class \(\times\) Cond zs 0.29 [-0.57, 1.16] 0.67 194 .501

Income as control

(#tab:unnamed-chunk-34)
Predictor \(b\) 95% CI \(t\) \(\mathit{df}\) \(p\)
Intercept 5.80 [5.20, 6.40] 19.15 191 < .001
Cond class -0.17 [-0.80, 0.45] -0.54 191 .588
Cond zs -0.59 [-1.22, 0.03] -1.86 191 .064
As numericincome -0.08 [-0.16, 0.01] -1.78 191 .077
Cond class \(\times\) Cond zs 0.28 [-0.60, 1.16] 0.62 191 .537

By Party ID

hmm independents don’t like the zs conditions

By voting intentions