Background

The purpose of this wave is to recruit participants for the longitudinal study. To be eligible as swing voters, they had to check two of these four criteria:

1. Their vote choices between 2020 vote recall, the 2024 two-way ballot, and the 2024 six-way ballot are not consistent.
2. Their vote choices between the 2024 two-way ballot, the 2024 six-way ballot, and generic congressional ballot are not all consistent.
3. They report similar ratings for Harris favorability and Trump favorability.*
4. They say they are considering at least two options in 2024 (Harris, Trump, third-party, not voting).

Full sample

First, let’s check the demographics and responses of the full sample

Demographics

Race

df_cbzs %>% 
  group_by(race) %>% 
  summarise(N = n()) %>% 
  ungroup() %>% 
  mutate(Perc = round(100*(N/sum(N)),2)) %>% 
  ungroup() %>% 
  arrange(desc(Perc)) %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = "hover",
                full_width = F,
                position = "left")
race N Perc
White 3083 65.48
Black or African American 678 14.40
Asian 357 7.58
multiracial 313 6.65
Hispanic, Latino, or Spanish origin 195 4.14
Other (please specify) 23 0.49
NA 22 0.47
American Indian or Alaska Native 20 0.42
Middle Eastern or North African 11 0.23
Native Hawaiian or Other Pacific Islander 6 0.13

Gender

df_cbzs %>% 
  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() %>% 
  arrange(desc(Perc)) %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = "hover",
                full_width = F,
                position = "left")
gender N Perc
woman 2422 51.44
man 2203 46.79
other 83 1.76

Age

df_cbzs %>% 
  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.2 12.61

Education

df_cbzs %>% 
  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 30 0.64
GED 1305 27.72
2yearColl 603 12.81
4yearColl 1895 40.25
MA 671 14.25
PHD 169 3.59
NA 35 0.74

Subjective SES

df_cbzs %>% 
  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 568 12.06
Lower Middle Class 1421 30.18
Middle Class 2145 45.56
Upper Middle Class 526 11.17
Upper Class 30 0.64
NA 18 0.38

Income

df_cbzs %>% 
  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()

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 %>%
  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 %>%
  dplyr::select(PID,ideo_con:ideo_prog) %>% 
  pivot_longer(-PID,
               names_to = "ideo",
               values_to = "score") %>% 
  filter(!is.na(score)) %>%  
  ggplot() +
  geom_histogram(aes(x = score), 
                 fill = "lightblue",
                 binwidth = 1) +
  scale_x_continuous(limits = c(0,8),
                     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)

Vote 2020

df_cbzs %>% 
  group_by(vote_2020) %>% 
  summarise(N = n()) %>% 
  ungroup() %>% 
  mutate(Perc = round(100*(N/sum(N)),2)) %>% 
  ungroup() %>% 
  arrange(desc(Perc)) %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = "hover",
                full_width = F,
                position = "left")
vote_2020 N Perc
Joe Biden (Democratic Party) 2589 54.99
Donald Trump (Republican Party) 1356 28.80
I did not vote 621 13.19
Jo Jorgensen (Libertarian Party) 90 1.91
Howie Hawkins (Green Party) 33 0.70
19 0.40

Consider 2024

Which of the following options are you considering to vote for president in 2024? Select ALL that apply.

Trump

df_cbzs %>% 
  mutate(consider_trump = ifelse(consider_trump == 1,"Trump",""),
         consider_harris = ifelse(consider_harris == 1,"Harris","")) %>% 
  group_by(consider_trump) %>% 
  summarise(n = n()) %>% 
  ungroup() %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = "hover",
                full_width = F,
                position = "left")
consider_trump n
2919
Trump 1789

Harris

df_cbzs %>% 
  mutate(consider_trump = ifelse(consider_trump == 1,"Trump",""),
         consider_harris = ifelse(consider_harris == 1,"Harris","")) %>% 
  group_by(consider_harris) %>% 
  summarise(n = n()) %>% 
  ungroup() %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = "hover",
                full_width = F,
                position = "left")
consider_harris n
1828
Harris 2880

Third party

df_cbzs %>% 
  mutate(consider_trump = ifelse(consider_trump == 1,"Trump",""),
         consider_harris = ifelse(consider_harris == 1,"Harris","")) %>% 
  group_by(consider_third) %>% 
  summarise(n = n()) %>% 
  ungroup() %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = "hover",
                full_width = F,
                position = "left")
consider_third n
4056
A third party candidate 652

No vote

df_cbzs %>% 
  mutate(consider_trump = ifelse(consider_trump == 1,"Trump",""),
         consider_harris = ifelse(consider_harris == 1,"Harris","")) %>% 
  group_by(consider_novote) %>% 
  summarise(n = n()) %>% 
  ungroup() %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = "hover",
                full_width = F,
                position = "left")
consider_novote n
4378
Not voting in 2024 330

Vote 2024: All

df_cbzs %>% 
  group_by(vote_2024_all) %>% 
  summarise(N = n()) %>% 
  ungroup() %>% 
  mutate(Perc = round(100*(N/sum(N)),2)) %>% 
  ungroup() %>% 
  arrange(desc(Perc)) %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = "hover",
                full_width = F,
                position = "left")
vote_2024_all N Perc
Kamala Harris (Democratic Party) 2567 54.52
Donald Trump (Republican Party) 1497 31.80
Not sure 221 4.69
Robert F. Kennedy Jr. (Independent) 175 3.72
I will not vote 110 2.34
Jill Stein (Green Party) 53 1.13
Cornel West (Independent) 38 0.81
Chase Oliver (Libertarian Party) 30 0.64
17 0.36

Vote 2024: Just two

df_cbzs %>% 
  group_by(vote_2024_justtwo) %>% 
  summarise(N = n()) %>% 
  ungroup() %>% 
  mutate(Perc = round(100*(N/sum(N)),2)) %>% 
  ungroup() %>% 
  arrange(desc(Perc)) %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = "hover",
                full_width = F,
                position = "left")
vote_2024_justtwo N Perc
Kamala Harris (Democratic Party) 2710 57.56
Donald Trump (Republican Party) 1626 34.54
Not sure 183 3.89
I will not vote 172 3.65
17 0.36

Vote 2024: Congress

df_cbzs %>% 
  group_by(congress_2024) %>% 
  summarise(N = n()) %>% 
  ungroup() %>% 
  mutate(Perc = round(100*(N/sum(N)),2)) %>% 
  ungroup() %>% 
  arrange(desc(Perc)) %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = "hover",
                full_width = F,
                position = "left")
congress_2024 N Perc
The Democrat 2587 54.95
The Republican 1581 33.58
Don’t know 522 11.09
18 0.38

Favorability

means <- df_cbzs %>%
  dplyr::select(PID,favor_trump,favor_harris) %>% 
  pivot_longer(-PID,
               names_to = "candidate",
               values_to = "score") %>% 
  filter(!is.na(score)) %>% 
  group_by(candidate) %>% 
  summarise(score = mean(score)) %>% 
  ungroup()

df_cbzs %>%
  dplyr::select(PID,favor_trump,favor_harris) %>% 
  pivot_longer(-PID,
               names_to = "candidate",
               values_to = "score") %>% 
  filter(!is.na(score)) %>% 
  ggplot() +
  geom_histogram(aes(x = score), 
                 fill = "lightblue",
                 binwidth = 1) +
  scale_x_continuous(limits = c(0,5),
                     breaks = seq(1,4,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(~candidate,nrow = 1)

Eligibility

The number of criteria each participant checked off

df_cbzs %>% 
  group_by(crit_sum) %>% 
  summarise(N = n()) %>% 
  ungroup() %>% 
  mutate(Perc = round(100*(N/sum(N)),2)) %>% 
  ungroup() %>% 
  arrange(desc(Perc)) %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = "hover",
                full_width = F,
                position = "left")
crit_sum N Perc
0 2646 56.20
1 1024 21.75
2 534 11.34
3 368 7.82
4 136 2.89

Great. That gives us 1038. Now let’s take a look at our eligibles.

Swing voters

Demographics

Race

df_cbzs_elg %>% 
  group_by(race) %>% 
  summarise(N = n()) %>% 
  ungroup() %>% 
  mutate(Perc = round(100*(N/sum(N)),2)) %>% 
  ungroup() %>% 
  arrange(desc(Perc)) %>%  
  kbl() %>% 
  kable_styling(bootstrap_options = "hover",
                full_width = F,
                position = "left")
race N Perc
White 631 60.79
Black or African American 145 13.97
multiracial 95 9.15
Asian 86 8.29
Hispanic, Latino, or Spanish origin 44 4.24
NA 17 1.64
American Indian or Alaska Native 7 0.67
Other (please specify) 7 0.67
Middle Eastern or North African 5 0.48
Native Hawaiian or Other Pacific Islander 1 0.10

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() %>% 
  arrange(desc(Perc)) %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = "hover",
                full_width = F,
                position = "left")
gender N Perc
man 561 54.05
woman 439 42.29
other 38 3.66

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
37.82 11.62

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 11 1.06
GED 340 32.76
2yearColl 132 12.72
4yearColl 383 36.90
MA 122 11.75
PHD 27 2.60
NA 23 2.22

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 163 15.70
Lower Middle Class 339 32.66
Middle Class 418 40.27
Upper Middle Class 97 9.34
Upper Class 4 0.39
NA 17 1.64

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()

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_histogram(aes(x = score), 
                 fill = "lightblue",
                 binwidth = 1) +
  scale_x_continuous(limits = c(0,8),
                     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)

Vote 2020

df_cbzs_elg %>% 
  group_by(vote_2020) %>% 
  summarise(N = n()) %>% 
  ungroup() %>% 
  mutate(Perc = round(100*(N/sum(N)),2)) %>% 
  ungroup() %>% 
  arrange(desc(Perc)) %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = "hover",
                full_width = F,
                position = "left")
vote_2020 N Perc
I did not vote 370 35.65
Joe Biden (Democratic Party) 341 32.85
Donald Trump (Republican Party) 208 20.04
Jo Jorgensen (Libertarian Party) 74 7.13
Howie Hawkins (Green Party) 26 2.50
19 1.83

Consider 2024

Which of the following options are you considering to vote for president in 2024? Select ALL that apply.

Trump

df_cbzs_elg %>% 
  mutate(consider_trump = ifelse(consider_trump == 1,"Trump",""),
         consider_harris = ifelse(consider_harris == 1,"Harris","")) %>% 
  group_by(consider_trump) %>% 
  summarise(n = n()) %>% 
  ungroup() %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = "hover",
                full_width = F,
                position = "left")
consider_trump n
551
Trump 487

Harris

df_cbzs_elg %>% 
  mutate(consider_trump = ifelse(consider_trump == 1,"Trump",""),
         consider_harris = ifelse(consider_harris == 1,"Harris","")) %>% 
  group_by(consider_harris) %>% 
  summarise(n = n()) %>% 
  ungroup() %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = "hover",
                full_width = F,
                position = "left")
consider_harris n
515
Harris 523

Third party

df_cbzs_elg %>% 
  mutate(consider_trump = ifelse(consider_trump == 1,"Trump",""),
         consider_harris = ifelse(consider_harris == 1,"Harris","")) %>% 
  group_by(consider_third) %>% 
  summarise(n = n()) %>% 
  ungroup() %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = "hover",
                full_width = F,
                position = "left")
consider_third n
587
A third party candidate 451

No vote

df_cbzs_elg %>% 
  mutate(consider_trump = ifelse(consider_trump == 1,"Trump",""),
         consider_harris = ifelse(consider_harris == 1,"Harris","")) %>% 
  group_by(consider_novote) %>% 
  summarise(n = n()) %>% 
  ungroup() %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = "hover",
                full_width = F,
                position = "left")
consider_novote n
769
Not voting in 2024 269

Vote 2024: All

df_cbzs_elg %>% 
  group_by(vote_2024_all) %>% 
  summarise(N = n()) %>% 
  ungroup() %>% 
  mutate(Perc = round(100*(N/sum(N)),2)) %>% 
  ungroup() %>% 
  arrange(desc(Perc)) %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = "hover",
                full_width = F,
                position = "left")
vote_2024_all N Perc
Kamala Harris (Democratic Party) 264 25.43
Donald Trump (Republican Party) 257 24.76
Not sure 190 18.30
Robert F. Kennedy Jr. (Independent) 110 10.60
I will not vote 106 10.21
Jill Stein (Green Party) 38 3.66
Cornel West (Independent) 31 2.99
Chase Oliver (Libertarian Party) 25 2.41
17 1.64

Vote 2024: Just two

df_cbzs_elg %>% 
  group_by(vote_2024_justtwo) %>% 
  summarise(N = n()) %>% 
  ungroup() %>% 
  mutate(Perc = round(100*(N/sum(N)),2)) %>% 
  ungroup() %>% 
  arrange(desc(Perc)) %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = "hover",
                full_width = F,
                position = "left")
vote_2024_justtwo N Perc
Kamala Harris (Democratic Party) 334 32.18
Donald Trump (Republican Party) 332 31.98
Not sure 183 17.63
I will not vote 172 16.57
17 1.64

Vote 2024: Congress

df_cbzs_elg %>% 
  group_by(congress_2024) %>% 
  summarise(N = n()) %>% 
  ungroup() %>% 
  mutate(Perc = round(100*(N/sum(N)),2)) %>% 
  ungroup() %>% 
  arrange(desc(Perc)) %>% 
  kbl() %>% 
  kable_styling(bootstrap_options = "hover",
                full_width = F,
                position = "left")
congress_2024 N Perc
Don’t know 380 36.61
The Republican 325 31.31
The Democrat 315 30.35
18 1.73

Favorability

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

df_cbzs_elg %>%
  dplyr::select(PID,favor_trump,favor_harris) %>% 
  pivot_longer(-PID,
               names_to = "candidate",
               values_to = "score") %>% 
  filter(!is.na(score)) %>% 
  ggplot() +
  geom_histogram(aes(x = score), 
                 fill = "lightblue",
                 binwidth = 1) +
  scale_x_continuous(limits = c(0,5),
                     breaks = seq(1,4,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(~candidate,nrow = 1)