When Politics Becomes Local: Racial Turnout Gaps and Ballot Roll-Off in North Carolina Elections

Author

Rory Church

Abstract

US local elections consistently have lower turnout compared to federal elections; thus, important questions are raised regarding who turns out and who stays home. This study examines racial and ethnic patterns of participation in North Carolina from 2017 to 2024, comparing turnout in presidential, midterm, and municipal elections. Using administrative voter files and precinct-level election results, I analyze racial turnout gaps and evaluate whether municipal elections held concurrently with federal contests attract a more representative electorate. I also estimate race-specific roll-off rates from the 2024 concurrent election using ecological inference. A central focus of this study is the representativeness of the electorate itself. Because racial categories in voter files contain some measurement error, observed turnout gaps may diverge from true behavioral disparities. The findings from this study show that racial turnout gaps widen sharply in stand-alone municipal elections, driven by steep declines in Latino, Asian, and Native American turnout. In contrast, Black non-Latino voters maintain near parity with White voters even in low-salience local contests. These results support theoretical claims about unequal mobilization and information costs (Fraga 2018), while also highlighting the importance of empowerment dynamics, civic infrastructures, and community networks in sustaining political participation. Overall, this study provides a comprehensive account of racial differences in local electoral engagement and demonstrates how election timing and ballot structure shape democratic participation.

Introduction

Each presidential year, North Carolinians pack election sites to cast their ballot for federal and local offices. However, in off-year elections, these same election locations are largely empty for local contests. Local governments make crucial decisions regarding education, housing, and policing; these are issues directly affecting residents. Despite their importance, turnout in local elections generally falls below 20% of registered voters.

These differences between federal and local turnout lead to numerous questions that motivate this study: Who votes when politics becomes local? Do racial participation gaps widen as election salience declines? Do concurrent elections, where presidential and municipal races appear on the same ballot, help to create a more representative electorate?

To address these questions, I analyze presidential, midterm, and municipal elections in North Carolina from 2017 to 2024. I compare turnout patterns across racial and ethnic groups and examine how these patterns vary when elections are stand-alone versus concurrent. I then turn to ballot roll-off in the 2024 presidential election to ask a different but related question: once voters show up, who actually completes the ballot for local offices? Concurrent elections may shrink racial turnout gaps by boosting overall participation, but they may also conceal inequalities if minority voters are more likely than White voters to skip down-ballot races.

All together, the turnout and roll-off analyses provide complementary perspectives on racial inequality in local political representation in North Carolina.

Why North Carolina and Why Race

North Carolina is well suited for studying how election salience and institutional context shape racial turnout. The state holds most municipal elections in odd-numbered years, creating a clear contrast with even-year presidential and midterm contests. It also maintains detailed administrative voter files that include race, ethnicity, age, gender, precinct, and municipality, along with comprehensive voter history. North Carolina is one of the few states where voter files are publicly accessible and where a self-reported race field is available, making it an ideal setting for analyzing racial participation patterns with administrative data.

Beyond these practical advantages, North Carolina provides a theoretically rich context for examining turnout disparities. The state has a racially diverse electorate, long-standing patterns of racially polarized voting, and a recent history of voting rights litigation and redistricting disputes. At the same time, it combines competitive statewide politics with uneven local participation. Presidential and gubernatorial races attract intense mobilization efforts, while municipal elections are frequently characterized by limited campaign contact, weak media coverage, and low information environments.

Focusing on race, rather than class, age, or education, is theoretically motivated by prior work showing that race is a powerful predictor of turnout and partisan alignment in the United States (Fraga 2018). Fraga’s research demonstrates that racial turnout gaps persist even after accounting for socioeconomic status and other individual-level characteristics. These gaps emerge because racial and ethnic minorities are less likely to be mobilized by campaigns and often face higher information and resource costs. Yet much of this literature centers on federal and statewide contests. What remains underexplored is whether racial gaps widen further in local elections that lack partisan cues, media visibility, and large-scale mobilization—and whether concurrent elections can mitigate or exacerbate these inequalities. This study addresses that gap.

Racial Turnout Gap

It is well documented that a racial turnout gap exists between White and non-White voters. In The Turnout Gap (2018), Bernard Fraga argues that this gap is persistent but context-dependent: election timing, election type, and power dynamics all shape who votes. Although Fraga’s analysis focuses primarily on federal and statewide elections, his framework applies directly to municipal contexts.

Local elections are typically low-salience, have fewer partisan cues, and receive less media coverage. Under these conditions, Fraga’s framework suggests that racial turnout gaps should widen. Conversely, high-salience contests like presidential elections tend to generate more attention and mobilization, which should shrink racial turnout gaps relative to local races.

Fraga emphasizes that these disparities are driven less by socioeconomic factors or voter suppression efforts and more on limited electoral influence and a lack of mobilization. Racial and ethnic minorities are less likely to be targeted by campaigns, face higher information costs, and often perceive their influence over outcomes to be weaker. As a result, racial turnout gaps reflect deeper systemic inequalities in who is invited into the electorate and whose voices are consistently heard. This study tests how those dynamics play out when elections move from the presidential level to the local municipal level in North Carolina.

Costs of Voting

Voting can be a costly activity, especially in local elections where partisan cues are weaker and information is scarcer. Verba, Schlozman, and Brady (1995) argue that political participation depends on resources, including time, money, and civic skills; they also suggest that different forms of participation draw on these resources in different ways. Local elections often require more time and effort for voters to learn which offices are on the ballot, what those offices do, and who the candidates are. In this sense, local elections function as high-resource activities, disproportionately burdening lower socioeconomic status (SES) and racially marginalized groups.

Education plays a central role in shaping who can navigate these informational demands. Converse (1964) noted that many citizens hold “non-attitudes” or unstable preferences, and Campbell et al. (1960) found that education increases political knowledge and is positively associated with turnout. More educated citizens are better able to interpret limited political information and make sense of low-salience contests. By contrast, less-educated and lower-resourced voters may be more likely to abstain when partisan cues are weak and media attention is low.

If local elections are more demanding in terms of information and civic skills, then racial and ethnic groups that are systematically disadvantaged in access to these resources will be less likely to participate. This logic helps explain why racial turnout gaps might widen in municipal elections and why we observe especially steep drop-offs in participation among Latino, Asian, and Native American voters when contests move from the presidential to the local level.

Hypotheses

Grounded in the turnout gap and costs-of-voting literature, this study tests three hypotheses:

H1: The racial turnout gap (difference in turnout rate between White non-Latino voters and each other racial/ethnic group) is larger in municipal elections than in federal elections.

H2: Non-Latino Black voters will exhibit smaller racial turnout gaps in municipal elections than other racial and ethnic minorities, reflecting stronger local civic infrastructures and mobilization networks.

H3: When local elections are held concurrently with federal elections, racial turnout gaps will narrow relative to stand-alone municipal elections—but may persist or reappear in the form of unequal ballot completion (roll-off).

These hypotheses link the turnout analysis and the roll-off analysis: even when concurrency narrows turnout gaps at the ballot level, it may not eliminate inequalities in local representation if some groups remain more likely to skip municipal races.

Method

To analyze North Carolina elections from 2017 to 2024, I first constructed turnout measures using Python and then imported the resulting summaries into R for visualization and additional analysis. All data were obtained from the North Carolina State Board of Elections website.

Two core administrative datasets form the basis of the analysis:

  1. The statewide voter history file, which records whether each registrant voted in each election.

  2. Annual voter snapshot files, which list all registered voters (active and inactive) and include race, ethnicity, age, gender, precinct, municipality, and county.

I merged these files using the unique state identifier (NCID) and then cleaned the data to remove duplicate records, deceased voters, and registrants who moved out of the state. This ensures that turnout rates reflect only eligible voters within each election year.

Next, I defined the target elections. For presidential and midterm years, I focus on the general elections, which are the highest-salience contests. For local election years, I focus on municipal elections, explicitly excluding elections held concurrently with federal or statewide contests. This distinction is essential: it allows comparisons between clearly stand-alone municipal elections and high-salience general elections without conflating them with concurrent arrangements that might artificially inflate local turnout.

Turnout is computed using carefully constructed numerators and denominators:

  • The denominator includes all registered voters eligible to participate in a given election—that is, all registrants living in a precinct-municipality that held an election on that date. Voters in municipalities without an election on that date are excluded from the denominator.

  • The numerator includes all registrants who actually voted in that election.

I then perform subgroup analyses by race and ethnicity. For each election date, I calculate turnout for:

  • the full electorate,

  • race-only categories,

  • ethnicity-only categories, and

  • joint race × ethnicity categories.

When calculating group-specific turnout, the numerator counts all registrants in that group who voted on that date; the denominator includes all eligible registrants in the same group. This approach yields consistent, comparable turnout measures across years and election types.

After computing these turnout summaries using Python, I import them into R, combine data from 2017–2024, and create tables and plots to compare turnout across racial and ethnic groups and between municipal and general elections. These descriptive analyses set the stage for the more detailed examination of relative turnout and roll-off in later sections.

Turnout Analysis

Figure 1 presents turnout rates across racial and ethnic groups from 2017 to 2024, distinguishing between general and municipal elections. Turnout is substantially higher in general elections for all groups, as expected. White non-Latino voters have the highest turnout in federal contests, consistent with national patterns of elevated White participation in presidential and midterm elections. Hispanic/Latino voters, by contrast, exhibit the lowest turnout overall.

Turnout in municipal elections drops sharply for every racial and ethnic group, illustrating the powerful effect of election salience: far fewer people vote when the offices are local and media coverage is low and information costs are higher. Within this broad decline, however, important differences emerge. White non-Latino and Black non-Latino voters remain the most active in local elections, while turnout among Hispanic and Native American voters remains especially low.

These descriptive patterns provide initial support for H1 and H2. Racial turnout gaps widen when contests move from general to municipal elections, and the drop-off is steepest among Latino, Asian, and Native American voters. At the same time, Black non-Latino voters experience a smaller proportional decline and maintain near parity with White non-Latino voters, suggesting that distinct mechanisms—such as empowerment, mobilization networks, and issue proximity—may be sustaining their local participation.

# Combine all election years to analyze turnout across municipal and federal elections 

turnout_all <- bind_rows(
turnout_2017,
turnout_2018,
turnout_2019,
turnout_2020,
turnout_2021,
turnout_2022,
turnout_2023,
turnout_2024
)
#  Use choose_col() function to detect the right column names, no matter how they are labeled 

choose_col <- function(df, candidates) {
hit <- intersect(candidates, names(df))
if (length(hit)) hit[[1]] else NA_character_
}

# Identify demoninator and numerator column names

den_candidates <- c("denominator_count","denominator","denom","denom_count","denominator_sum","denominator_total")
num_candidates <- c("numerator_count","numerator","num","num_count","numerator_sum","numerator_total")

den_col <- choose_col(turnout_all, den_candidates)
num_col <- choose_col(turnout_all, num_candidates)

# Use make_overall() function to create 'all HL' and 'all NL' turnout categories 

make_overall <- function(df, suffix, den_col, num_col) {
x <- df %>% filter(str_detect(label, paste0(" ", suffix, "$")))
if (!is.na(den_col) && !is.na(num_col) && all(c(den_col, num_col) %in% names(x))) {
x %>%
group_by(year) %>%
summarize(
denom = sum(.data[[den_col]], na.rm = TRUE),
numer = sum(.data[[num_col]], na.rm = TRUE),
.groups = "drop"
) %>%
mutate(label = paste("All", suffix), turnout_rate = numer / denom) %>%
select(year, label, turnout_rate)
} else {
x %>%
group_by(year) %>%
summarize(turnout_rate = mean(turnout_rate, na.rm = TRUE), .groups = "drop") %>%
mutate(label = paste("All", suffix)) %>%
select(year, label, turnout_rate)
}
}

hl_overall <- make_overall(turnout_all, "HL", den_col, num_col)
nl_overall <- make_overall(turnout_all, "NL", den_col, num_col)

turnout_all <- bind_rows(
turnout_all %>% select(year, label, turnout_rate),
hl_overall, nl_overall
)
# Define which groups I want to keep 

keep_labels <- c(
"All voters","All HL","All NL",
"Asian HL","Asian NL",
"Black or African American HL","Black or African American NL",
"American Indian or Alaska Native HL","American Indian or Alaska Native NL",
"Two or More Races HL","Two or More Races NL",
"Other HL","Other NL",
"White HL","White NL"
)

have_weights <- !is.na(den_col) && !is.na(num_col) &&
all(c(den_col, num_col) %in% names(turnout_all))

# Compute turnout rates by group and year

turnout_yearly <- if (have_weights) {
turnout_all %>%
filter(label %in% keep_labels) %>%
group_by(label, year) %>%
summarize(
turnout_rate = sum(.data[[num_col]], na.rm = TRUE) /
sum(.data[[den_col]], na.rm = TRUE),
.groups = "drop"
)
} else {
turnout_all %>%
filter(label %in% keep_labels) %>%
group_by(label, year) %>%
summarize(turnout_rate = mean(turnout_rate, na.rm = TRUE), .groups = "drop")
}

# Create a table 

turnout_table <- turnout_yearly %>%
mutate(year = as.integer(year),
turnout_rate = round(turnout_rate * 100, 1),
label = factor(label, levels = keep_labels, ordered = TRUE)) %>%
arrange(label, year)

turnout_table_raw <- turnout_yearly   
# One column per year

turnout_wide <- turnout_table %>%
  tidyr::pivot_wider(
    names_from  = year,
    values_from = turnout_rate,
    values_fill = NA_real_
  )

# Build a GT table 

turnout_gt <- turnout_wide %>%
  mutate(
    label = as.character(label),
    # rename for display only
    label = dplyr::case_when(
      label == "American Indian or Alaska Native HL" ~ "Native American HL",
      label == "American Indian or Alaska Native NL" ~ "Native American NL",
      TRUE ~ label
    )
  ) %>%
  gt(rowname_col = "label") %>%
  # visible "Table 1" label
  tab_caption("Table 1. Turnout by Race/Ethnicity, 2017–2024") %>%
  tab_header(
    title = md("**Turnout by Race/Ethnicity, 2017–2024**"),
    subtitle = md("Percent of registered voters who turned out")
  ) %>%
  fmt_number(columns = -c(label), decimals = 1) %>%
  cols_label(
    label = "Race/Ethnicity",
    `2017` = "2017 Municipal",
    `2018` = "2018 General",
    `2019` = "2019 Municipal (No Sept.)",
    `2020` = "2020 General",
    `2021` = "2021 Municipal",
    `2022` = "2022 General",
    `2023` = "2023 Municipal",
    `2024` = "2024 General"
  ) %>%
  tab_style(
    style = list(cell_text(weight = "bold")),
    locations = cells_body(rows = label %in% c("All voters"))
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_column_labels(everything())
  ) %>%
  tab_options(table.font.size = 14)

# Render the table 

turnout_gt
Table 1. Turnout by Race/Ethnicity, 2017–2024
Turnout by Race/Ethnicity, 2017–2024
Percent of registered voters who turned out
2017 Municipal 2018 General 2019 Municipal (No Sept.) 2020 General 2021 Municipal 2022 General 2023 Municipal 2024 General
All voters 12.9 51.6 14.6 73.2 12.5 49.8 10.7 70.8
All HL 4.9 33.7 5.3 56.9 5.0 25.0 4.7 54.9
All NL 17.0 53.7 17.0 74.7 16.2 53.9 16.1 74.2
Asian HL 4.4 33.1 6.2 58.3 5.7 28.6 4.4 60.9
Asian NL 6.2 43.0 8.1 69.8 6.5 38.4 8.1 65.9
Black or African American HL 5.6 34.1 6.5 54.0 6.7 25.6 5.7 53.7
Black or African American NL 14.3 48.6 16.2 67.0 14.3 42.3 14.4 65.1
Native American HL 4.5 32.7 6.1 54.2 3.1 27.3 4.3 54.8
Native American NL 7.1 36.7 7.8 60.2 6.8 36.6 7.1 62.0
Two or More Races HL 5.6 34.8 7.8 54.0 6.7 29.2 6.8 55.3
Two or More Races NL 7.2 39.1 9.1 60.0 7.7 34.5 8.2 57.6
Other HL 2.9 28.7 3.9 52.8 3.6 22.0 2.4 54.6
Other NL 7.9 38.5 9.5 62.1 8.4 35.7 7.7 60.5
White HL 5.8 41.4 7.9 64.4 7.4 36.4 5.7 64.7
White NL 15.0 56.0 17.2 77.7 14.7 58.5 12.0 77.7
# Tag each row as General vs Municipal 

turnout_long <- turnout_table_raw %>%
  mutate(election_type = ifelse(year %in% c(2018, 2020, 2022, 2024),
                                "General", "Municipal"))

# Pick what groups to include (use the TRUE underlying labels here)

SHOW <- c(
  "All HL",
  "Asian NL",
  "White NL",
  "Black or African American NL",
  "American Indian or Alaska Native NL"
)

# Map underlying labels -> pretty labels for the plot

label_map <- c(
  "All HL"                          = "All HL",
  "White NL"                        = "White NL",
  "Black or African American NL"    = "Black NL",
  "Asian NL"                        = "Asian NL",
  "American Indian or Alaska Native NL" = "Native American NL"
)

# Order using the underlying labels

order_vec <- c(
  "All HL",
  "Asian NL",
  "White NL",
  "Black or African American NL",
  "American Indian or Alaska Native NL"
)

# Aggregate turnout by election type 

plot_df <- turnout_long %>%
  dplyr::filter(label %in% SHOW) %>%
  dplyr::group_by(label, election_type) %>%
  dplyr::summarise(turnout = mean(turnout_rate) * 100, .groups = "drop") %>%
  dplyr::mutate(
    label = factor(label, levels = order_vec, ordered = TRUE),
    nice  = factor(label_map[as.character(label)],
                   levels = label_map[order_vec],
                   ordered = TRUE)
  )

# Plot side-by-side bars (Municipal vs General) 

ggplot(plot_df, aes(x = nice, y = turnout, fill = election_type)) +
  geom_col(position = "dodge") +
  labs(title = "Turnout Rates by Race/Ethnicity and Election Type (2017–2024)",
       x = "Race/Ethnicity", y = "Turnout Rate (%)",
       fill = "Election Type") +
  theme_minimal(base_size = 14)

Relative Turnout

Descriptive turnout rates show who participates, but they do not fully capture how large the gaps are relative to White non-Latino voters. To address this, I analyze relative turnout, comparing each group’s turnout to that of White non-Latino voters in both general and municipal elections.

The figure and table in this section show that relative turnout gaps clearly widen as electoral salience declines. While all groups experience lower turnout in municipal elections, the relative decline is steepest among Latino, Asian, and Native American voters, whose participation drops to less than half the rate of White voters in local contests. In contrast, Black non-Latino turnout remains close to parity with White non-Latino turnout even in municipal elections.

These results align with Fraga’s (2018) argument that unequal mobilization and higher information costs widen racial turnout gaps in low-salience elections. At the same time, they highlight an important exception: Black non-Latino voters do not experience as severe a drop-off as other minority groups when contests move from federal to local. The near parity of Black non-Latino turnout suggests that strong local networks, community institutions, and targeted mobilization may partially offset the structural barriers that depress participation in municipal elections.

This pattern motivates the subsequent sections, which explore why Black voters maintain relatively high levels of local engagement and why other groups, particularly Latino and Asian voters, experience more dramatic declines.

SHOW <- c(
  "All HL",
  "Asian NL",
  "Black or African American NL",
  "American Indian or Alaska Native NL",
  "White NL"
)

SHORT <- c(
  "All HL" = "All HL",
  "Asian NL" = "Asian NL",
  "Black or African American NL" = "Black NL",
  "American Indian or Alaska Native NL" = "Native American NL",
  "White NL" = "White NL"
)


white_by_year <- turnout_long %>%
  dplyr::filter(label == "White NL") %>%
  dplyr::select(year, white_rate = turnout_rate)

ratio_df <- turnout_long %>%
  dplyr::left_join(white_by_year, by = "year") %>%
  dplyr::mutate(ratio = turnout_rate / white_rate) %>%
  dplyr::filter(label %in% SHOW) %>%
  dplyr::group_by(label, election_type) %>%
  dplyr::summarise(ratio = mean(ratio, na.rm = TRUE), .groups = "drop") %>%
  dplyr::mutate(ratio = ifelse(label == "White NL", 1, ratio),
                label_short = factor(SHORT[label],
                                     levels = SHORT[SHOW], ordered = TRUE))

# Plot
ggplot(ratio_df, aes(x = label_short, y = ratio, fill = election_type)) +
  geom_col(position = "dodge") +
  scale_y_continuous(labels = scales::number_format(accuracy = 0.01),
                     limits = c(0, 1.1)) +
  labs(title = "Relative Turnout vs White (Non-Latino) by Election Type",
       x = "Race/Ethnicity",
       y = "Ratio to White Turnout (1.0 = equal turnout)",
       fill = "Election Type") +
  theme_minimal(base_size = 14)

mun_gen <- turnout_long %>%
  dplyr::group_by(label, election_type) %>%
  dplyr::summarise(rate = mean(turnout_rate) * 100, .groups = "drop") %>%
  dplyr::filter(label %in% c(
    "White NL",
    "Black or African American NL",
    "All HL",
    "Asian NL",
    "American Indian or Alaska Native NL"
  )) %>%
  tidyr::pivot_wider(names_from = election_type, values_from = rate)

key_tbl <- mun_gen %>%
  dplyr::left_join(
    ratio_df %>%
      dplyr::group_by(label) %>%
      dplyr::summarise(
        Ratio_Mun = mean(ratio[election_type == "Municipal"]),
        .groups = "drop"
      ),
    by = "label"
  ) %>%
  dplyr::select(label, General, Municipal, Ratio_Mun) %>%
  dplyr::mutate(
    across(c(General, Municipal), ~ round(.x, 1)),
    Ratio_Mun = scales::number(Ratio_Mun, accuracy = 0.01)
  )

key_tbl %>%
  dplyr::mutate(
    # pretty display name just for the table
    label = dplyr::case_when(
      label == "American Indian or Alaska Native NL" ~ "Native American NL",
      TRUE ~ label
    )
  ) %>%
  gt::gt() %>%
  gt::tab_caption("Table 2. Summary: Turnout & Parity vs White") %>%
  gt::tab_header(
    title = md("**Summary: Turnout & Parity vs White**")
  ) %>%
  gt::cols_label(
    label      = "Group",
    General    = "General (%)",
    Municipal  = "Municipal (%)",
    Ratio_Mun  = "Ratio to White (Mun)"
  ) %>%
  gt::fmt_number(columns = c(General, Municipal), decimals = 1)
Table 2. Summary: Turnout & Parity vs White
Summary: Turnout & Parity vs White
Group General (%) Municipal (%) Ratio to White (Mun)
All HL 42.7 5.0 0.34
Native American NL 48.9 7.2 0.50
Asian NL 54.3 7.2 0.50
Black or African American NL 55.7 14.8 1.02
White NL 67.5 14.7 1.00

Near Parity for Black Voters in Municipal Elections

One of the most striking findings of this study is that Black non-Latino voters in North Carolina exhibit municipal turnout rates that are nearly equal to those of White non-Latino voters, even as overall participation declines in local elections. In contrast, Latino and Asian voters show much larger declines in turnout when moving from general to municipal contests. This near parity for Black voters challenges the expectation that a historically marginalized group facing high information and resource costs would experience the greatest drop-off in low-salience elections.

Several mechanisms from the political participation literature help explain why Black voters may remain comparatively engaged in municipal elections:

  1. Empowerment and local representation Bobo and Gilliam (1990) argue that political empowerment can increase participation by cultivating feelings of trust, influence, and efficacy. Keele et al. (2017) find that the presence of viable Black candidates can elevate Black turnout in mayoral elections, and Banducci et al. (2004) show that minority representation can increase minority engagement. In municipalities where Black residents see themselves reflected in local leadership or perceive city government as responsive, empowerment dynamics may sustain turnout even when overall salience is low.

  2. Dense mobilizing networks Historically, Black churches, the NAACP, neighborhood associations, and other groups have played central roles in mobilizing Black voters. Verba, Schlozman, and Brady’s (1995) Civic Voluntarism Model emphasizes how organizations that build civic skills and provide mobilization cues can lower the costs of participation. While Gray and Caul (2000) note a general decline in group-based mobilization in advanced democracies, the Black civic infrastructure that exists in many North Carolina communities may continue to function as a powerful mobilizing force, especially around local issues.

  3. Targeted appeals and group norms As Cox (2015) argues, campaigns tend to target areas where mobilization yields the greatest payoffs. Geographically clustered Black populations in Southern cities create favorable conditions for efficient mobilization, particularly by community organizations, churches, and local advocacy groups. Anoll (2018) further highlights the importance of neighborhood norms: in communities where voting is seen as an expected behavior, individuals face social incentives to participate. These norms may encourage Black voters not only to turn out but to remain engaged in local elections over time.

  4. Issue proximity and local stakes Local decisions about policing, housing, and education often have especially visible consequences in majority-Black neighborhoods. As Leighley and Nagler (2013) argue, turnout composition reflects how closely policy stakes align with voters’ lived experiences. When local issues directly affect racial equity and community well-being, Black residents may perceive higher returns to participating in municipal elections than their counterparts in other groups.

These mechanisms suggest that Black municipal turnout is not simply an anomaly but a product of empowerment, mobilization, and issue proximity.

Why Other Groups Experience Greater Drop-Off

In contrast to Black North Carolinians, Latino, Native American, and Asian voters experience much larger declines in turnout when shifting from general to municipal elections. Several factors may contribute to this pattern.

First, campaign targeting and organizational infrastructure are weaker for these groups. Cox (2015) emphasizes that campaigns allocate resources where mobilization is most efficient. Smaller, more geographically dispersed populations are less likely to receive sustained outreach, especially in low-salience local contests. Valenzuela and Michelson (2016) show that group-identity appeals can effectively mobilize Latino voters, but such targeted messages may be rare in municipal campaigns with limited budgets and low visibility.

Second, information and language barriers can weigh heavily in local elections. Limited bilingual outreach, sparse ethnic media coverage, and complex local ballot structures raise the costs of participation for voters who are newer to the political system or less familiar with municipal institutions. Without strong local organizations embedded in city governance, Latino and Asian communities may lack the networks that help Black voters navigate these environments.

As a result, Latino, Native American, and Asian voters often confront both lower mobilization and higher information costs, leading to particularly steep declines in turnout when contests move from the presidential to the municipal level. These dynamics foreshadow the roll-off patterns observed in the 2024 concurrent election, where these groups are especially likely to skip municipal races even when they do vote for President.

Roll-Off

Roll off occurs when a voter participates in a high-salience contest such as President but does not vote in lower-salience municipal offices. In concurrent elections, it is important to consider roll-off to better understand representation. Even if overall turnout is high, ballot completion may remain unequal across racial groups.

Method

To evaluate how concurrent elections shape ballot completion across racial and ethnic groups, I analyze roll-off in the November 2024 presidential election in North Carolina. Unlike turnout, which captures whether a person cast a ballot at all, roll-off reflects within-ballot inequality in political engagement. Understanding roll-off is therefore central to assessing the representativeness of the electorate in concurrent elections.

Not all municipalities held elections in November 2024, and those that did often featured different sets of local races. To construct a consistent measure of municipal voting across the state, I focus on a set of “safe” municipal contests that meet two criteria:

  1. They appear in a substantial number of precincts, allowing for broad geographic coverage; and

  2. They involve mayoral or citywide offices, which typically have higher visibility and more uniform reporting.

The selected races are:

  • City of Raleigh Mayoral Election

  • City of Winston-Salem Mayoral Election

  • City of Raleigh City Council At-Large Election

For each precinct, I calculate three mutually exclusive categories using election returns and the 2024 statewide voter file:

  • Presidential votes: number of ballots cast for President

  • Municipal votes: total ballots cast across the selected municipal contests

  • Registered voters (N): total registered voters from the 2024 voter file

To isolate presidential-only voters, I compute:

\[ \text{presidential-only} = \max\bigl(\text{presidential votes} - \text{municipal votes}, 0\bigr). \]

This yields three groups within each precinct:

  1. Municipal voters

  2. Presidential-only voters

  3. Nonvoters

Race totals for each precinct come from the 2024 voter file. I collapse administrative categories into four analytically meaningful groups:

  1. Non-Hispanic White

  2. Non-Hispanic Black

  3. Hispanic/Latino

  4. Other (Asian, Native American, multiracial, and unclassified)

Smaller groups, including Asian and Indigenous voters, are combined into “Other” to reduce classification noise and ensure sufficient sample sizes for stable ecological inference estimates.

Race-specific roll-off cannot be directly observed because ballots do not record race. Ecological inference (EI) provides a methodological solution by estimating how racial groups are distributed across the three behavioral outcomes: municipal voting, presidential-only voting, and nonvoting.

I use the RxC ecological inference model implemented in eiPack, which is designed for settings with more than two racial groups and more than two behavioral outcomes. For each racial group \(r\), roll-off is defined as:

\[ \text{Roll-Off}_r = \frac{p_r}{m_r + p_r} \]

where \(m_r\) is the proportion of group \(r\) that votes in both municipal and presidential contests, and \(p_r\) is the proportion that votes only in the presidential contest.

Considering roll-off in this way is essential because it reveals whether high participation in concurrent elections translates into equitable engagement with local offices. The EI-based estimates provide a theoretically grounded assessment of race-specific roll-off in North Carolina’s 2024 concurrent election, complementing the earlier turnout analysis.

Results

Table 3 reports the aggregate level of ballot roll-off in precincts that held both presidential and municipal elections in November 2024. Across the selected precincts, 161,841 presidential ballots were cast, but only 98,057 included votes in the municipal contests analyzed. This implies an overall roll-off rate of 39.4%, meaning that nearly four in ten presidential voters skipped the municipal portion of the ballot. This level of incomplete ballot participation is consistent with well-documented gaps in information and salience between federal and local elections. Even when voters are already at the polls for a high-salience contest, a substantial share fails to engage with lower-salience local offices, raising concerns about the representativeness of municipal governance.

Table 4 reports race-specific estimates of turnout and roll-off from the Bayesian ecological inference model. EI is necessary because ballots do not record race and administrative racial classifications contain some measurement error. The model therefore provides probabilistic estimates of within-ballot racial disparities in participation rather than exact individual-level behavior.

Several patterns stand out. White voters exhibit the highest presidential turnout but also relatively high roll-off; many White voters do not complete the municipal ballot once they have voted for President. Black voters show comparatively strong engagement and the lowest roll-off rate. Black non-Hispanic voters are the least likely of any racial group to skip municipal contests once they appear at the polls. This finding aligns with empowerment theories and accounts emphasizing community-based mobilization and strong civic infrastructures in Black communities.

Hispanic voters show extremely low municipal turnout and the second-highest roll-off rate, with more than two-thirds of presidential voters skipping the municipal contests. These patterns are consistent with lower campaign targeting (Fraga 2018), limited information about municipal offices (e.g., Lau & Redlawsk; Converse; Verba et al.), language-access barriers, and the newer and more transient nature of many Latino communities in North Carolina. The “Other” category exhibits the highest rate of incomplete ballots, likely reflecting small group sizes, weak mobilization, and heterogeneous composition. Because this category aggregates multiple distinct populations, these estimates should be interpreted with particular caution.

Together, the roll-off results show that concurrent elections increase overall turnout but do not guarantee equitable engagement with local offices. They also mirror the earlier turnout findings: Black voters are comparatively engaged in municipal politics, while Latino and “Other” voters remain underrepresented even when they show up for the top-of-the-ticket race.

safe_races <- c(
  "CITY OF RALEIGH MAYOR",
  "CITY OF WINSTON-SALEM MAYOR",
  "CITY OF RALEIGH CITY COUNCIL AT-LARGE"
)

# President votes by county–precinct
pres_votes <- results24_real %>%
  filter(`Contest Name` == "US PRESIDENT") %>%
  group_by(County, Precinct) %>%
  summarise(
    president_votes = sum(`Total Votes`, na.rm = TRUE),
    .groups = "drop"
  )


muni_votes <- results24_real %>%
  filter(`Contest Name` %in% safe_races) %>%
  group_by(County, Precinct) %>%
  summarise(
    municipal_votes = sum(`Total Votes`, na.rm = TRUE),
    .groups = "drop"
  )


pres_muni <- pres_votes %>%
  inner_join(muni_votes, by = c("County", "Precinct")) %>%
  mutate(
    bad_muni      = municipal_votes > president_votes,
    pres_only     = pmax(president_votes - municipal_votes, 0),
    rolloff_share = 1 - municipal_votes / president_votes
  ) %>%
  filter(!bad_muni, president_votes > 0, municipal_votes > 0)

# Overall roll-off (for the descriptive table you already have)
overall_rolloff <- pres_muni %>%
  summarise(
    total_pres  = sum(president_votes,  na.rm = TRUE),
    total_muni  = sum(municipal_votes,  na.rm = TRUE),
    overall_rolloff_share = 1 - total_muni / total_pres
  )
overall_table <- overall_rolloff %>%
  mutate(
    overall_rolloff_share = scales::percent(overall_rolloff_share, accuracy = 0.1)
  ) %>%
  gt() %>%
  tab_caption("Table 3. Overall Roll-Off in 2024 Concurrent Election") %>%
  tab_header(
    title = md("**Overall Roll-Off in 2024 Concurrent Election**")
  ) %>%
  cols_label(
    total_pres = "Total Presidential Votes",
    total_muni = "Total Municipal Votes",
    overall_rolloff_share = "Roll-Off Rate"
  ) %>%
  cols_align("center", everything())

overall_table
Table 3. Overall Roll-Off in 2024 Concurrent Election
Overall Roll-Off in 2024 Concurrent Election
Total Presidential Votes Total Municipal Votes Roll-Off Rate
161841 98057 39.4%
ei_data <- pres_muni %>%
  inner_join(
    precinct_race,
    by = c("County" = "county_desc", "Precinct" = "precinct_desc")
  ) %>%
  mutate(
    nonvoters = pmax(N_total - president_votes, 0)
  ) %>%
  filter(
    N_total > 50,                    # drop tiny precincts
    president_votes <= N_total,      # sanity check on totals
    nonvoters >= 0
  )

ei_data <- ei_data %>%
  mutate(
    pres_turnout  = president_votes / N_total,
    muni_turnout  = municipal_votes / N_total,
    turnout_gap   = pres_turnout - muni_turnout
  )


ei_df <- as.data.frame(ei_data)


formula_rc <- cbind(municipal_votes, pres_only, nonvoters) ~
              cbind(NH_White, NH_Black, Hispanic, Other)


tune_out <- tuneMD(
  formula = formula_rc,
  data    = ei_df
)


ei_results <- ei.MD.bayes(
  formula   = formula_rc,
  data      = ei_df,
  tune.list = tune_out,
  sample    = 2000,
  burnin    = 1000,
  thin      = 5,
  verbose   = 500
)
alpha_mat <- ei_results$draws$Alpha


alpha_df <- tibble(
  race_choice = sub("^[Aa]lpha\\.", "", colnames(alpha_mat)),  # drop 'alpha.' prefix
  mean        = apply(alpha_mat, 2, mean)
)

alpha_tidy <- alpha_df %>%
  separate(race_choice, into = c("race", "choice"), sep = "\\.") %>%
  pivot_wider(names_from = choice, values_from = mean)


rolloff_race <- alpha_tidy %>%
  mutate(
    pres_voters = municipal_votes + pres_only,
    rolloff     = pres_only / pres_voters
  ) %>%
  select(race, rolloff)

# 5. Nice table
rolloff_table <- rolloff_race %>%
  mutate(
    rolloff = percent(rolloff, accuracy = 0.1)
  ) %>%
  arrange(race) %>%
  gt() %>%
  tab_header(
    title = md("**Estimated Roll-Off by Race (EI Model)**")
  ) %>%
  cols_label(
    race    = "Race",
    rolloff = "Roll-Off Rate"
  )
turnout_table <- turnout_by_race %>%
  gt() %>%
  tab_caption("Table 4. Turnout and Roll-Off by Race (EI Model)") %>%
  tab_header(
    title = md("**Turnout and Roll-Off by Race (EI Model)**"),
    subtitle = md("Estimated from Bayesian Ecological Inference")
  ) %>%
  cols_label(
    race = "Race",
    muni_turnout = "Municipal Turnout",
    pres_turnout = "Presidential Turnout",
    rolloff = "Roll-Off Rate"
  ) %>%
  cols_align("center", everything())

turnout_table
Table 4. Turnout and Roll-Off by Race (EI Model)
Turnout and Roll-Off by Race (EI Model)
Estimated from Bayesian Ecological Inference
Race Municipal Turnout Presidential Turnout Roll-Off Rate
NH_White 44.4% 84.1% 47.2%
NH_Black 40.2% 52.4% 23.3%
Hispanic 8.4% 31.9% 73.6%
Other 6.7% 18.1% 63.1%

Limitations

Several limitations qualify the conclusions of this study. First, the analysis focuses on a single state. North Carolina is institutionally and demographically distinctive, and the patterns observed here may not generalize to states with different electoral rules, racial compositions, or political histories. The external validity of the results is therefore uncertain.

Second, the analysis relies on administrative voter files and official election returns, which may contain measurement error. Racial and ethnic categories in the voter file are imperfect proxies for social identities; misclassification can occur, especially for multiracial, Latino, Asian, and Indigenous voters. Collapsing Asian, Indigenous, multiracial, and unclassified voters into an “Other” category in the EI model helps mitigate small cell-size issues but obscures important heterogeneity within this group. Estimates for the “Other” category should thus be interpreted with caution, and future research should further explore the political behaviors of these individual groups.

Third, turnout measures are based on registered voters rather than the voting-eligible population. As a result, the study captures inequalities among those already incorporated into the electorate and cannot directly speak to disparities in registration itself.

Fourth, ecological inference is not free from assumptions. EI models rely on the idea that precinct-level patterns can be used to infer individual behavior. The estimates presented here should be viewed as probabilistic summaries of race-specific roll-off, not as perfectly observed individual-level behavior.

Fifth, the roll-off analysis is limited to a subset of municipal contests in 2024: two mayoral races and one city council at-large race. These offices were chosen for coverage and data quality, but they do not represent all local offices on the ballot. Roll-off patterns may differ in school board races, judicial contests, or smaller municipalities not captured in this design.

Finally, the study is primarily descriptive. Although I compare turnout and roll-off across election types and racial groups, the design cannot definitively isolate causal effects of election timing or concurrency. Unobserved differences in local political context, candidate quality, and issue environments may contribute to the observed patterns. The findings should therefore be interpreted as evidence of strong associations rather than causal estimates.

Discussion

Taken together, the results highlight the multidimensional nature of racial inequality in electoral participation. Consistent with Fraga’s (2018) argument, racial turnout gaps in North Carolina widen substantially in low-salience municipal elections. Latino, Asian, and Indigenous voters participate at far lower rates than White voters when contests move from the presidential to the local level. These patterns underscore how information costs, resource disparities, and unequal mobilization combine to depress local turnout among historically marginalized communities.

At the same time, Black non-Latino voters maintain turnout that is exceptionally close to that of White voters in municipal elections, and the ecological inference estimates show that Black voters have the lowest roll-off rate of any group in the 2024 concurrent election. Once they appear at the polls, Black voters are more likely than White, Latino, or “Other” voters to complete the ballot down to the municipal contests. This pattern is consistent with empowerment theories and accounts emphasizing dense civic infrastructures in Black communities—churches, neighborhood associations, and civil rights organizations that connect local policy stakes to everyday life.

By contrast, Latino voters exhibit both low municipal turnout and very high roll-off. These findings reinforce concerns about the representational marginalization of newer immigrant communities and smaller racial groups in local governance. Limited campaign targeting, language and information barriers, and weaker organizational infrastructures likely combine to produce high rates of incomplete ballots and low local representation for these groups.

Overall, the results suggest that concurrent elections can bring more voters, especially White and Black registrants—to the polls, but concurrency alone does not guarantee meaningful engagement with local offices. For Latino and “Other” voters in particular, concurrent elections generate a growing number of presidential voters who remain effectively absent from municipal decision-making.

These findings have several implications for scholars and practitioners. For researchers, they underscore the importance of studying both turnout and ballot completion as dimensions of political inequality. They also illustrate the promise and limitations of ecological inference for recovering race-specific behavior from administrative data. Future work could extend this design by incorporating additional years, comparing multiple states, or combining EI with surname-based or geocoded measures to improve the measurement of racial identity.

For election administrators and campaigns, the results indicate that institutional reforms, such as moving municipal elections on-cycle, are likely necessary but not sufficient. Without targeted outreach to Latino, Asian, and Indigenous communities—through multilingual voter guides, community-based organizations, and culturally specific mobilization strategies, higher presidential turnout will not automatically translate into equal participation in local offices. At the same time, the comparatively high engagement of Black voters in municipal elections highlights the power of community-based networks and suggests that investing in local civic infrastructures can pay dividends for democratic representation.

Ultimately, this study shows that who turns out and how completely they use the ballot varies sharply across racial groups and electoral contexts. Understanding these patterns is essential for evaluating the democratic quality of local governance and for designing reforms that move municipalities toward a more representative electorate.