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 11 5.47
Black or African American 15 7.46
Hispanic, Latino, or Spanish origin 9 4.48
White 146 72.64
multiracial 20 9.95

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 104 51.74
other 2 1.00
woman 95 47.26

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
38.63 12.93

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
GED 58 28.86
2yearColl 21 10.45
4yearColl 90 44.78
MA 24 11.94
PHD 7 3.48
NA 1 0.50

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 23 11.44
Lower Middle Class 53 26.37
Middle Class 95 47.26
Upper Middle Class 27 13.43
Upper Class 3 1.49

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 146 72.64
No 35 17.41
Not sure 20 9.95

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 73 36.32
Independent 58 28.86
Republican 70 34.83

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 88 43.78
Donald Trump 71 35.32
I did not vote 32 15.92
Third-party candidate 10 4.98

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 72 35.82
Joe Biden 72 35.82
I will not vote 26 12.94
Robert F. Kennedy Jr.  18 8.96
Other 7 3.48
Jill Stein 5 2.49
Cornel West 1 0.50

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 suggests that the benefits provided to one group come at the expense of another

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

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.056604 1.524355
0 1 5.340426 1.108791
1 0 5.938776 1.106951
1 1 6.250000 0.882843

Stats

Effect DFn DFd F p p<.05 ges
cond_class 1 197 28.726 2.00e-07
1.27e-01
cond_zs 1 197 3.168 7.70e-02 1.60e-02
cond_class:cond_zs 1 197 0.007 9.35e-01 3.41e-05

Cool.

Plot

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 4.377358 1.559418
0 1 4.276596 1.651115
1 0 3.551020 1.720722
1 1 3.326923 1.641629

uh oh.

Stats

Effect DFn DFd F p p<.05 ges
cond_class 1 197 14.656 0.000173
0.069000
cond_zs 1 197 0.490 0.485000 0.002000
cond_class:cond_zs 1 197 0.071 0.791000 0.000359

That’s no good. Looking at the item, I think we weren’t clear. More over email.

Plot

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 4.226415 1.782840
0 1 4.446809 1.665618
1 0 5.346939 1.283729
1 1 5.653846 1.480390

Stats

Effect DFn DFd F p p<.05 ges
cond_class 1 197 27.651 4.00e-07
0.123000
cond_zs 1 197 1.419 2.35e-01 0.007000
cond_class:cond_zs 1 197 0.038 8.45e-01 0.000194

oh bummer. but big caveat that the it came after the (not-so-great) manipulation checks.

Plot

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.207547 1.691136
0 1 4.503546 1.782730
1 0 4.517007 1.530646
1 1 4.448718 1.852849

Stats

Effect DFn DFd F p p<.05 ges
cond_class 1 197 0.275 0.601 0.001
cond_zs 1 197 0.220 0.640 0.001
cond_class:cond_zs 1 197 0.563 0.454 0.003

Plot

no difference. ok.