# Air pollution and the vote: report

Companion 8.1d of The Public Mind, by Vishal Singh (NYU Stern). Generated from the chapter's data files; the reading version is at https://vishalsingh.org/politics/air-pollution-and-the-vote. Table n of this report is figure n of the chapter.

## Identification

- Title: Air pollution and the vote
- Chapter: Companion 8.1d (Part VIII, Places and the people in them; Votes, giving and places)
- Question: Do neighborhoods with more diesel and traffic pollution vote differently once race, income and education are held fixed?
- Dek: Tracts with more diesel exposure voted more Democratic in 2020, by 24.8 points per standard deviation of exposure, but only 4.9 points once race, income, education and density are held fixed.
- Grain: places
- Status: draft
- Published: 2026-09-30
- Updated: not revised
- Data sources:
  - Precinct votes on census geographies. Precinct votes allocated to 2020 census tracts (Fekrazad 2025) with the ACS demographics of the tract atlas (ACS years not recorded), 2020 presidential election; years: 2016 and 2020 (contiguous United States only); weights: votes cast in the tract (pres_tot); full counts of tracts, no sampling weights
  - EJScreen. EPA EJScreen version 2.3 (July 2024; modeled air data for 2020), tract values in the atlas; EPA removed the tool in February 2025 and the archived copy is not recorded; years: Version as distributed with the tract atlas file.; weights: none (tract values)
  - Area Deprivation Index. Area Deprivation Index national rank, tract values in the atlas; release year not recorded; years: Vintage as distributed with the tract and ZCTA atlas files.; weights: none (tract values)
  - CDC PLACES. Current asthma among adults, model-based tract estimates in the atlas; release year not recorded; years: Release as distributed with the tract and ZCTA atlas files.; weights: none (tract values)
  - Cooperative Election Study. Cooperative Election Study 2020 wave; support for strengthening EPA enforcement of the Clean Air Act and Clean Water Act even if it costs U.S. jobs; years: 2006-2024 (every year; self-reported turnout is available in the 10 even years); weights: weight (single wave)
- Canonical URL: https://vishalsingh.org/politics/air-pollution-and-the-vote
- Report: https://vishalsingh.org/politics/air-pollution-and-the-vote/report
- Markdown: https://vishalsingh.org/politics/air-pollution-and-the-vote/report.md
- BibTeX key: singh2026airpollutionandthevote

```bibtex
@misc{singh2026airpollutionandthevote,
  author = {Singh, Vishal},
  title = {Air pollution and the vote},
  year = {2026},
  url = {https://vishalsingh.org/politics/air-pollution-and-the-vote},
  note = {In The Public Mind. Published 30 September 2026.}
}
```

## Principal estimates

The facts the dek and the opening prose cite, in order of appearance.

| Estimand | Population | Period | Value | Interval | n | Weights | Source | Fact id |
| --- | --- | --- | ---: | --- | ---: | --- | --- | --- |
| weighted least squares coefficient on the standardized diesel particulate matter exposure, with no controls; 95% interval clustered by county | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | 2020 presidential election; EJScreen 2.3 air data for 2020 | 24.8 | 95% CI 21.5 to 28.0 | 81,134 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies | diesel_raw |
| weighted least squares coefficient on the standardized diesel particulate matter exposure, with race, income, education and density held fixed; 95% interval clustered by county | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | 2020 presidential election; EJScreen 2.3 air data for 2020 | 4.9 | 95% CI 2.6 to 7.2 | 81,134 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies | diesel_dens |
| vote-weighted mean tract margin; 95% interval clustered by county | census tracts in decile 10 of diesel exposure | 2020 presidential election; EJScreen 2.3 air data for 2020 | +49.1 | 95% CI 42.4 to 55.8 | 8,114 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies | margin_d10 |
| vote-weighted mean tract margin; 95% interval clustered by county | census tracts in decile 1 of diesel exposure | 2020 presidential election; EJScreen 2.3 air data for 2020 | −29.8 | 95% CI −32.2 to −27.4 | 8,114 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies | margin_d1 |
| difference in vote-weighted mean margin, top decile minus bottom decile; 95% interval clustered by county | census tracts in the top and bottom decile of diesel exposure | 2020 presidential election; EJScreen 2.3 air data for 2020 | 78.9 | 95% CI 71.8 to 86.1 | 16,228 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies | margin_gap |
| ratio of the diesel coefficient with race, income and education held fixed to the diesel coefficient with no controls (ratio of point estimates); 95% interval from a county bootstrap (2,000 replicates) | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | 2020 presidential election; EJScreen 2.3 air data for 2020 | 42% | 95% CI 36% to 48% | 81,134 | none (ratio of estimates) | Precinct votes on census geographies | diesel_ctrl_kept |
| ratio of the diesel coefficient with race, income, education and density held fixed to the diesel coefficient with no controls (ratio of point estimates); 95% interval from a county bootstrap (2,000 replicates) | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | 2020 presidential election; EJScreen 2.3 air data for 2020 | 20% | 95% CI 12% to 27% | 81,134 | none (ratio of estimates) | Precinct votes on census geographies | diesel_dens_kept |
| version of the tool, identified from the indicators and values in the atlas | the EPA EJScreen release identified in the tract atlas | released July 2024 | 2.3 |   |   | none (identifier) | EJScreen | ejscreen_version |
| count of tracts | tracts in the 2020 tract atlas | 2020 presidential election | 82,765 |   |   | none (count) | Precinct votes on census geographies | n_atlas_tracts |
| count of tracts | tracts in the atlas with more than 100 estimated votes | 2020 presidential election; EJScreen 2.3 air data for 2020 | 81,617 |   |   | none (count) | Precinct votes on census geographies | n_over100 |
| a tract is kept when its estimated presidential votes exceed this number | census tracts | 2020 presidential election; EJScreen 2.3 air data for 2020 | 100 |   |   | none (constant) | Precinct votes on census geographies | vote_floor |
| count of tracts | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | 2020 presidential election; EJScreen 2.3 air data for 2020 | 81,134 |   |   | none (count) | Precinct votes on census geographies | n_tracts |
| count of states | states with at least one tract in the sample | 2020 presidential election; EJScreen 2.3 air data for 2020 | 47 |   |   | none (count) | Precinct votes on census geographies | n_states |
| sum of tract presidential votes in the sample | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | 2020 presidential election; EJScreen 2.3 air data for 2020 | 155.1 million |   |   | none (sum of votes) | Precinct votes on census geographies | votes_m |

## Findings

The tenth of census tracts with the most diesel exhaust in the air had a Democratic two-party margin of +49.1 (95% CI 42.4 to 55.8) points in the 2020 presidential election, against −29.8 (95% CI −32.2 to −27.4) points in the tenth with the least, a gap of 78.9 points. The margin difference per standard deviation of diesel exposure shrinks when tracts are compared on who lives in them: 42% (95% CI 36% to 48%) of the no-controls coefficient remains with race, income and education held fixed, and 20% (95% CI 12% to 27%) once population density is added. The four air measures in the chapter move together, so the data cannot say which one carries the difference that remains. The chapter also compares neighborhood deprivation, modeled asthma prevalence and survey support for EPA enforcement. The asthma figures are modeled estimates and not measured health outcomes, a distinction that the section on asthma explains.

The margin is the Democratic vote minus the Republican vote as a share of the two, so a positive value is a Democratic lead. The votes come from precinct returns that a land-cover model allocated to 2020 census tracts [1], so each tract's margin is an estimate and not a count. Pollution comes from EJSCREEN. Diesel exposure is its modeled annual average concentration of diesel particulate matter in the tract's air, in micrograms per cubic meter, and the other measures are modeled annual averages of fine particles and nitrogen dioxide and a traffic proximity score (vehicles per day on nearby major roads, weighted by distance). (Note: The EPA removed EJSCREEN from its website in February 2025. [Public Environmental Data Partners](https://screening-tools.com/epa-ejscreen) hosts a reconstruction of version 2.3, released in July 2024 with air data modeled for 2020 [2].) Of the 82,765 tracts in the atlas, 81,617 have more than 100 estimated votes, and 81,134 of those have every pollution measure, control and land area that the models need. They lie in 47 states and carry 155.1 million votes, and each tract counts in proportion to its votes. The unit is a neighborhood, and the last section returns to what that allows.

### The margin rises with diesel exposure

Table 1 sorts the tracts into ten equal groups by diesel exposure and shows the margin in each, with each row labeled by its decile and median exposure. The point estimates rise with each step. The deciles below the fifth lean Republican and the deciles above it lean Democratic. The fifth decile, with a median exposure of 0.14 micrograms per cubic meter of diesel particulate matter, is an even split within its interval (+1.4 (95% CI −1.8 to 4.7) points). The intervals are widest in the top two deciles. The tenth-decile tracts sit in 112 counties, against 1,824 counties for the first decile, and the intervals allow for tracts in one county resembling each other.

Table 1. The Democratic margin rises from −29.8 points in the tenth of tracts with the least diesel exposure to +49.1 points in the tenth with the most

The tenth decile differs from the first in more than the air (Table 2). The white-alone share of residents is 36% in the tenth decile against 79% in the first, the Hispanic share is 33% against 9%, and the median tract holds 5,167 people per square kilometer against 14. Income peaks in decile 6 and the college share is nearly flat from there. Diesel exposure moves with density, and across tracts the correlation of exposure with the log of density is +0.68 (95% CI 0.66 to 0.71). Holding these traits fixed means comparing tracts that resemble each other on them.

The Area Deprivation Index ranks neighborhoods from the least to the most deprived [3], and its mean national rank falls from 62.5 (95% CI 60.9 to 64.2) in the first decile of diesel exposure to 22.2 (95% CI 16.2 to 28.2) in the tenth, against 44.8 (95% CI 42.2 to 47.4) for all tracts weighted by votes. The index is built from income, education, employment and housing measures, so it overlaps with the controls in the vote models. Planned, Deprivation and mobility (https://vishalsingh.org/politics/deprivation-and-mobility; planned) asks how deprivation itself relates to the vote, and Companion 8.1c, Measures of hardship compared (https://vishalsingh.org/politics/measures-of-hardship-compared) sets several hardship measures side by side.

Table 2. Higher-diesel tracts are denser, less white and more Hispanic, and income peaks at decile 6 while college share stays nearly flat after it

### Controls shrink every gap, and fine particles end near zero

Table 3 regresses the tract margin on each exposure. Each exposure is standardized, so a coefficient is the difference in the margin, in points, between tracts one standard deviation apart in exposure. One standard deviation of diesel exposure is 0.14 micrograms per cubic meter. For the other exposures it is 3.5 parts per billion of nitrogen dioxide, 2.1 micrograms per cubic meter of fine particles and 2.4 million on the traffic proximity score. Tracts count in proportion to their votes, and the intervals are clustered by county, so they allow tracts in one county to resemble each other. Companion 8.1c, Measures of hardship compared (https://vishalsingh.org/politics/measures-of-hardship-compared) sets this specification beside a common one for every hardship measure, which reports the Democratic share in place of the margin, leaves out income, standardizes with a vote-weighted standard deviation and adds state fixed effects, and it traces the difference between the two diesel estimates mainly to the state effects.

The diesel coefficient is 24.8 (95% CI 21.5 to 28.0) points with no controls and 10.3 (95% CI 8.1 to 12.6) points with the white, Black and Hispanic shares of residents, the college share and median household income held fixed. Adding the log of population density lowers it further, to 4.9 (95% CI 2.6 to 7.2) points. Traffic proximity goes from 24.7 (95% CI 19.2 to 30.2) points to 12.2 (95% CI 9.0 to 15.3) with the demographic controls and 8.7 (95% CI 6.1 to 11.3) with density added. Nitrogen dioxide goes from 24.3 (95% CI 22.3 to 26.3) points to 10.1 (95% CI 8.3 to 11.9) and then 3.6 (95% CI 1.5 to 5.8). Fine particles are the exception, with a coefficient of 8.8 (95% CI 5.3 to 12.2) points with no controls, 0.9 (95% CI −1.4 to 3.1) with the demographic controls and −0.7 (95% CI −2.8 to 1.4) with density. Once tracts are compared on who lives in them, the fine-particle interval includes zero.

The four exposures are correlated, so the first four rows of each panel do not say which one matters. Diesel exposure moves with traffic proximity and nitrogen dioxide (correlations of +0.68 and +0.72 across tracts). In the joint row, where all four enter one model with the controls and density, only traffic proximity has an interval above zero: it keeps 8.7 (95% CI 5.6 to 11.7) points while diesel falls to 1.3, an interval that includes zero, so the data cannot say which exposure carries the difference.

Table 3. Controls shrink the Democratic gap for every pollutant, and with all four exposures in one model traffic proximity keeps 8.7 points while diesel falls to 1.3

Population density is closely tied to the Democratic vote across American places [4]. Entering density as 20 equal-size bins in place of the log term gives a diesel coefficient of 3.4 (95% CI 1.1 to 5.8) points. Clustering the intervals by state in place of county gives 4.9 (95% CI 0.2 to 9.6) points for the diesel coefficient with density, and the lower bound is near zero.

Comparing tracts inside the same county, with a fixed effect for each county and the same controls and density, gives 7.1 (95% CI 5.3 to 8.9) points for diesel, 6.5 (95% CI 5.2 to 7.8) points for nitrogen dioxide and 6.6 (95% CI 4.6 to 8.6) points for traffic. The point estimates for diesel and nitrogen dioxide are larger than the pooled ones with density, and the point estimate for traffic is smaller. (Note: The within-county coefficient minus the pooled coefficient with density is +2.2 (95% CI −0.4 to 5.3) points for diesel, an interval that includes zero, +2.8 (95% CI 0.5 to 5.3) points for nitrogen dioxide and −2.1 (95% CI −4.4 to −0.1) points for traffic.) A within-county comparison removes every difference between counties, including the urban-rural contrast, but it is not a comparison of neighbors. Tracts in one county range from dense cores to suburbs, which is why density stays in the model. Planned, Suburbs and density (https://vishalsingh.org/politics/suburbs-and-density; planned) takes up the density gradient in the vote directly.

### In counties, the link depends on weighting

Table 4 moves the question to counties. A tract model of the margin on race, income and education, with no pollution term, predicts each tract's margin, and the residual margin is the actual margin minus that prediction. The map averages the residual over each county's tracts by votes, which smooths the noise in single tract estimates and lets the map use county shapes. Diesel exposure for a county is the same vote-weighted average of its tract values.

Table 4. The residual margin after race, income and education averages −15.9 points in southern counties and +14.5 points in northeastern counties, weighted by votes

The residual margin has a strong regional component. Counties in the South average −15.9 points and counties in the Northeast +14.5 points, and 61% of the variance of the residual, weighted by county votes, lies between states.

Table 5 plots each county's diesel exposure against its residual margin. Across counties weighted by their votes, the residual correlates with county diesel exposure at +0.26 (95% CI 0.17 to 0.34), so counties with more exposure vote more Democratic than the demographic model predicts. Counting each county once, the correlation is +0.27 (95% CI 0.25 to 0.30). When density also enters the model that produces the residual, the vote-weighted correlation is +0.08 (95% CI −0.02 to 0.17), which includes zero, and the unweighted correlation is −0.06 (95% CI −0.09 to −0.03), which does not. The sign of the density-adjusted correlation therefore depends on whether large counties count more. Within states, the vote-weighted correlation is +0.18 (95% CI 0.01 to 0.41) net of race, income and education and −0.07 (95% CI −0.21 to 0.16) with density added, with intervals that resample the states.

Table 5. County diesel exposure correlates at +0.26 with the residual margin after race, income and education, and at +0.08 (interval includes zero) with density added

### Modeled asthma cannot register local air

A modeled health estimate is computed from other data by a formula. A measured health outcome is a count or an answer recorded for the people who live in the place. The asthma figures in this chapter are of the first kind: the CDC's PLACES estimates of current asthma among adults [5] are modeled and not measured, so they cannot show an effect of local air. PLACES fits a multilevel model to survey answers, with the age, sex, race and education of respondents and the poverty rate of the county as inputs, and applies it to each tract's population [5]. One tract's estimate differs from another's through its demographic mix and its county, and not through its local air.

Modeled prevalence is 11.0% (95% CI 11.0% to 11.1%) in the first decile of diesel exposure and 9.9% (95% CI 9.6% to 10.3%) in the tenth. Per standard deviation of diesel exposure, prevalence differs by −0.25 (95% CI −0.35 to −0.14) points with no controls, by 0.04 (95% CI −0.04 to 0.12) points with race, income and education held fixed and by −0.02 (95% CI −0.11 to 0.07) points with density added. The difference is negative with no controls and its interval includes zero once race, income and education are held fixed, as expected when the model is built from demographic inputs. The pattern describes how the modeled values line up with diesel exposure and does not test whether exposure affects asthma. Planned, Health outcomes and the vote (https://vishalsingh.org/politics/health-outcomes-and-the-vote; planned) looks at small-area health outcomes and the vote more broadly.

### The support gap shrinks within party

The Cooperative Election Study asked respondents in 2020 whether they support strengthening the Environmental Protection Agency's enforcement of the Clean Air Act and the Clean Water Act even if it costs U.S. jobs. The item names two statutes and a cost in jobs, so it measures more than support for the agency, and it does not ask about local pollution or health. Among the 57,411 respondents in 2,630 counties who gave an answer and a party ID and live in a county with tracts in the sample, weighted support is 59.7% (95% CI 58.5% to 60.8%). Respondents in the fifth whose counties have the most diesel exposure are more supportive, 69.5% (95% CI 67.2% to 71.8%) against 51.2% (95% CI 49.8% to 52.7%) in the fifth whose counties have the least. They are also more often Democrats, 59.0% (95% CI 56.0% to 62.0%) against 32.3% (95% CI 30.9% to 33.7%). Support is 86.1% (95% CI 85.3% to 86.9%) among Democrats, 59.7% (95% CI 58.0% to 61.4%) among independents and 30.6% (95% CI 29.5% to 31.7%) among Republicans, with leaners counted in their party.

Table 6 fits a linear probability model of support on standardized county diesel exposure, with survey weights and errors clustered by county. For all respondents the coefficient is 6.4 (95% CI 5.3 to 7.6) points per standard deviation with no controls, 1.3 (95% CI 0.9 to 1.7) points with party ID and demographics held fixed and −0.4 (95% CI −1.1 to 0.4) with the density of the county added. Among Democrats it is 0.0 (95% CI −0.8 to 0.8) with no controls and 0.2 (95% CI −0.6 to 1.0) with controls. Among Republicans it is 4.3 (95% CI 2.4 to 6.2) with no controls, 3.0 (95% CI 1.2 to 4.8) with controls and 1.0 (95% CI −1.4 to 3.4) once county density is added. With county density added every group's interval includes zero. The fifth of respondents in the most exposed counties live in only 54 counties, so large urban counties make up that end of the exposure range.

Table 6. Support for EPA enforcement rises with county diesel exposure, but the rise shrinks within party and its interval includes zero with county density held fixed

### What these data cannot show

The estimates describe places in one election. They do not say how the residents of a tract voted, because a pattern across areas can differ from the pattern among the people in them [6] (ecological inference). The vote in each tract is an allocation of precinct returns by a land-cover model and each pollution value is modeled, so the estimates carry errors that the intervals leave out. The exposures and the vote are both from 2020, so the data cannot say whether pollution changes how people vote, whether people who vote a certain way settle near sources, or whether the siting of sources follows political power, a claim the environmental justice literature makes [7].

Holding traits fixed is partial. The controls come from the American Community Survey and carry sampling error, and density enters as one summary of urban form. The four exposures move together, so the data cannot say which one the coefficients reflect, and the county residual varies strongly between states, so a correlation across counties can reflect regional differences that the data cannot separate from exposure. Coverage is 47 states, because Alaska, Hawaii and Connecticut have no tract vote estimates and the District of Columbia lacks the white share that the controls need. The survey comparison assigns a county exposure to each respondent and cannot see how much air pollution a respondent breathes. The vote is the presidential margin in one election, so the data say nothing about turnout, down-ballot races or votes on local environmental measures. They hold no local political context, so they cannot say why tracts with more exposure vote as they do.

## Tables

### Table 1. The Democratic margin rises from −29.8 points in the tenth of tracts with the least diesel exposure to +49.1 points in the tenth with the most

Democratic minus Republican share of the two-party 2020 presidential vote, percentage points; vote-weighted mean by decile of tract diesel particulate exposure, each row labeled with the decile and its median exposure in micrograms per cubic meter; 95% intervals clustered by county

| conf_high | conf_low | decile | decile_label | diesel_median | margin | n |
| ---: | ---: | ---: | --- | ---: | ---: | ---: |
| −27.42 | −32.23 | 1 | 1 (0.04 µg/m³) | 0.042 | −29.82 | 8,114 |
| −26.24 | −31.31 | 2 | 2 (0.07) | 0.068 | −28.78 | 8,113 |
| −19.39 | −24.18 | 3 | 3 (0.09) | 0.092 | −21.78 | 8,113 |
| −7.48 | −13.25 | 4 | 4 (0.12) | 0.118 | −10.36 | 8,114 |
| 4.68 | −1.83 | 5 | 5 (0.14) | 0.144 | 1.42 | 8,113 |
| 12.45 | 6.15 | 6 | 6 (0.17) | 0.171 | 9.30 | 8,113 |
| 21.73 | 14.99 | 7 | 7 (0.20) | 0.203 | 18.36 | 8,114 |
| 30.07 | 22.62 | 8 | 8 (0.24) | 0.244 | 26.34 | 8,113 |
| 40.11 | 28.24 | 9 | 9 (0.31) | 0.311 | 34.18 | 8,113 |
| 55.84 | 42.39 | 10 | 10 (0.48) | 0.477 | 49.12 | 8,114 |

Note: Deciles of diesel exposure hold equal numbers of tracts; ties are broken by census tract code.

Note: Tracts with 100 or fewer votes are left out. Intervals treat counties as the units that vary. They do not include error in the allocation of precinct votes to tracts or in the modeled pollution values.

Source: Precinct votes allocated to census tracts (Fekrazad 2025), 2020 presidential election; EPA EJScreen version 2.3 (2024 release, 2020 air data); American Community Survey tract data (vintage not recorded in the atlas); vote-weighted, full counts of tracts, no sampling weights

Data: https://vishalsingh.org/politics/report/air-pollution-and-the-vote/figures/margin_by_diesel_decile.json

### Table 2. Higher-diesel tracts are denser, less white and more Hispanic, and income peaks at decile 6 while college share stays nearly flat after it

Characteristics of the tracts in each decile of diesel particulate exposure (8,113 or 8,114 tracts per decile): shares of residents (percent), income (dollars) and deprivation rank averaged by votes, density and exposure as medians

| Decile of diesel exposure | Diesel PM, median (µg/m³) | Democratic margin (points) | White alone (%) | Black alone (%) | Hispanic (%) | College degree (%) | Median household income | Deprivation rank (100 = most) | People per km², median |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
| 1 (least) | 0.04 | −29.8 | 79 | 5 | 9 | 25 | $70k | 62.5 | 14 |
| 2 | 0.07 | −28.8 | 78 | 7 | 9 | 28 | $78k | 59.1 | 44 |
| 3 | 0.09 | −21.8 | 77 | 7 | 10 | 32 | $87k | 52.2 | 152 |
| 4 | 0.12 | −10.4 | 72 | 8 | 11 | 36 | $95k | 47.1 | 427 |
| 5 | 0.14 | +1.4 | 67 | 11 | 13 | 40 | $98k | 45.0 | 821 |
| 6 | 0.17 | +9.3 | 62 | 13 | 15 | 41 | $102k | 42.7 | 1,080 |
| 7 | 0.20 | +18.4 | 57 | 14 | 17 | 42 | $101k | 41.4 | 1,394 |
| 8 | 0.24 | +26.3 | 53 | 15 | 19 | 42 | $100k | 39.4 | 1,669 |
| 9 | 0.31 | +34.2 | 47 | 14 | 25 | 42 | $98k | 34.4 | 2,354 |
| 10 (most) | 0.48 | +49.1 | 36 | 13 | 33 | 42 | $97k | 22.2 | 5,167 |

Note: Deciles of diesel exposure hold equal numbers of tracts; ties are broken by census tract code.

Note: Shares, incomes and ranks are means of tract values weighted by votes. They describe the tracts in each decile, so the table shows no interval.

Note: The atlas labels the white share as white alone. Together the white, Black and Hispanic shares never exceed a tract's whole population, so the white share appears to leave out Hispanic residents, but the atlas file does not say so.

Note: The Area Deprivation Index has no rank for a small number of tracts, which are left out of that column.

Source: Precinct votes allocated to census tracts (Fekrazad 2025), 2020 presidential election; EPA EJScreen version 2.3 (2024 release, 2020 air data); American Community Survey tract data (vintage not recorded in the atlas); vote-weighted, full counts of tracts, no sampling weights; Area Deprivation Index national rank (Neighborhood Atlas; release year not recorded in the atlas file)

Data: https://vishalsingh.org/politics/report/air-pollution-and-the-vote/figures/tract_profile.json

### Table 3. Controls shrink the Democratic gap for every pollutant, and with all four exposures in one model traffic proximity keeps 8.7 points while diesel falls to 1.3

Difference in the Democratic two-party margin (percentage points) per standard deviation of tract exposure, by pollutant and set of controls; 81,134 tracts; 95% intervals clustered by county

| conf_high | conf_low | estimate | n | pollutant | specification |
| ---: | ---: | ---: | ---: | --- | --- |
| 27.99 | 21.52 | 24.75 | 81,134 | Diesel particulate matter | No controls |
| 12.56 | 8.11 | 10.34 | 81,134 | Diesel particulate matter | Race, income, education |
| 7.21 | 2.60 | 4.90 | 81,134 | Diesel particulate matter | Plus density |
| 4.64 | −2.05 | 1.29 | 81,134 | Diesel particulate matter | All four together |
| 8.89 | 5.26 | 7.07 | 81,134 | Diesel particulate matter | County fixed effects |
| 30.22 | 19.19 | 24.70 | 81,134 | Traffic proximity | No controls |
| 15.35 | 9.04 | 12.20 | 81,134 | Traffic proximity | Race, income, education |
| 11.29 | 6.08 | 8.69 | 81,134 | Traffic proximity | Plus density |
| 11.72 | 5.59 | 8.65 | 81,134 | Traffic proximity | All four together |
| 8.56 | 4.64 | 6.60 | 81,134 | Traffic proximity | County fixed effects |
| 26.28 | 22.35 | 24.31 | 81,134 | Nitrogen dioxide | No controls |
| 11.86 | 8.29 | 10.07 | 81,134 | Nitrogen dioxide | Race, income, education |
| 5.80 | 1.46 | 3.63 | 81,134 | Nitrogen dioxide | Plus density |
| 1.85 | −3.40 | −0.777 | 81,134 | Nitrogen dioxide | All four together |
| 7.80 | 5.16 | 6.48 | 81,134 | Nitrogen dioxide | County fixed effects |
| 12.24 | 5.26 | 8.75 | 81,134 | Fine particles (PM2.5) | No controls |
| 3.09 | −1.37 | 0.859 | 81,134 | Fine particles (PM2.5) | Race, income, education |
| 1.36 | −2.80 | −0.721 | 81,134 | Fine particles (PM2.5) | Plus density |
| 0.309 | −3.76 | −1.72 | 81,134 | Fine particles (PM2.5) | All four together |
| 2.53 | −2.43 | 0.050 | 81,134 | Fine particles (PM2.5) | County fixed effects |

Note: Controls are the white, Black and Hispanic shares of residents, the college share and median household income; density is the log of people per square kilometer. The joint row enters all four exposures in one model with the controls and density.

Note: The county fixed effects row is a different comparison and not a further control: it uses the same controls and density and compares tracts only within their own county.

Note: Intervals treat counties as the units that vary. They do not include error in the allocation of precinct votes to tracts or in the modeled pollution values.

Source: Precinct votes allocated to census tracts (Fekrazad 2025), 2020 presidential election; EPA EJScreen version 2.3 (2024 release, 2020 air data); American Community Survey tract data (vintage not recorded in the atlas); vote-weighted, full counts of tracts, no sampling weights

Data: https://vishalsingh.org/politics/report/air-pollution-and-the-vote/figures/pollutant_ladder.json

### Table 4. The residual margin after race, income and education averages −15.9 points in southern counties and +14.5 points in northeastern counties, weighted by votes

Residual margin: tract Democratic two-party margin minus the margin predicted from tract race, income and education, averaged over each county's tracts by votes, percentage points; county diesel exposure in micrograms per cubic meter

No inline rows: the values of Table 4 are in https://vishalsingh.org/politics/data/air-pollution-and-the-vote/county_lean.json.

Views: Residual margin; Residual, density held fixed; Diesel exposure.

Note: Hawaii, Connecticut and the District of Columbia draw as no data (Hawaii has no tract vote estimates, the tract atlas has no rows for Connecticut, and it has no white share for DC tracts), and so does any county without a tract of more than 100 votes.

Note: County values are averages of modeled tract values, so they carry the errors of both models. No interval is shown on the map.

Source: Precinct votes allocated to census tracts (Fekrazad 2025), 2020 presidential election; EPA EJScreen version 2.3 (2024 release, 2020 air data); American Community Survey tract data (vintage not recorded in the atlas); vote-weighted county means of tract values, full counts, no sampling weights

Data: https://vishalsingh.org/politics/report/air-pollution-and-the-vote/figures/county_lean_map.json

### Table 5. County diesel exposure correlates at +0.26 with the residual margin after race, income and education, and at +0.08 (interval includes zero) with density added

Each dot is a county: its mean diesel exposure (averaged over tracts by 2020 votes) against its residual margin, the Democratic two-party margin minus the margin predicted from race, income and education, in percentage points; correlations across 3,096 counties weighted by county votes

| County | Diesel exposure (µg/m³) | Residual margin (points) | Residual margin, density held fixed (points) | Votes for president, 2020 |
| --- | ---: | ---: | ---: | ---: |
| Autauga, AL | 0.099 | −37.1 | −34.3 | 27,770 |
| Baldwin, AL | 0.079 | −39.1 | −36.2 | 109,679 |
| Barbour, AL | 0.048 | −21.7 | −4.6 | 10,518 |
| Bibb, AL | 0.061 | −31.6 | −21.9 | 9,595 |
| Blount, AL | 0.078 | −38.5 | −33.6 | 27,588 |
| Bullock, AL | 0.040 | +10.2 | +37.9 | 4,613 |
| Butler, AL | 0.059 | −25.1 | −7.6 | 9,488 |
| Calhoun, AL | 0.091 | −25.8 | −24.3 | 50,980 |
| Chambers, AL | 0.080 | −22.0 | −11.1 | 15,284 |
| Cherokee, AL | 0.073 | −29.5 | −22.0 | 12,301 |
| Chilton, AL | 0.075 | −36.1 | −29.0 | 19,310 |
| Choctaw, AL | 0.034 | −15.7 | +7.6 | 7,464 |
| Clarke, AL | 0.041 | −22.4 | −1.5 | 13,135 |
| Clay, AL | 0.052 | −32.7 | −17.4 | 6,930 |
| Cleburne, AL | 0.077 | −38.4 | −26.5 | 7,227 |
| Coffee, AL | 0.048 | −37.5 | −31.8 | 22,275 |
| Colbert, AL | 0.107 | −17.4 | −17.3 | 27,886 |
| Conecuh, AL | 0.047 | −16.9 | +7.3 | 6,441 |
| Coosa, AL | 0.048 | −21.2 | −1.1 | 5,479 |
| Covington, AL | 0.039 | −36.8 | −27.5 | 17,430 |
| Crenshaw, AL | 0.035 | −33.3 | −14.9 | 6,617 |
| Cullman, AL | 0.090 | −36.4 | −34.6 | 41,851 |
| Dale, AL | 0.044 | −33.3 | −25.6 | 19,738 |
| Dallas, AL | 0.067 | −10.5 | +4.6 | 17,864 |
| DeKalb, AL | 0.073 | −34.6 | −27.6 | 29,356 |
| Elmore, AL | 0.072 | −34.4 | −29.9 | 41,030 |
| Escambia, AL | 0.054 | −29.5 | −16.8 | 15,910 |
| Etowah, AL | 0.097 | −24.6 | −25.1 | 47,728 |
| Fayette, AL | 0.051 | −34.1 | −20.8 | 8,766 |
| Franklin, AL | 0.057 | −36.0 | −25.9 | 12,578 |
| Geneva, AL | 0.043 | −39.6 | −29.5 | 12,545 |
| Greene, AL | 0.059 | +5.7 | +37.6 | 4,775 |
| Hale, AL | 0.051 | −19.7 | +3.5 | 6,772 |
| Henry, AL | 0.040 | −34.9 | −19.5 | 9,298 |
| Houston, AL | 0.070 | −38.1 | −36.1 | 46,173 |
| Jackson, AL | 0.073 | −25.9 | −19.6 | 23,636 |
| Jefferson, AL | 0.194 | −18.3 | −15.8 | 325,762 |
| Lamar, AL | 0.047 | −31.6 | −18.7 | 7,193 |
| Lauderdale, AL | 0.085 | −22.8 | −21.7 | 44,339 |
| Lawrence, AL | 0.073 | −27.2 | −17.2 | 16,031 |
| Lee, AL | 0.087 | −37.8 | −31.5 | 71,065 |
| Limestone, AL | 0.112 | −29.6 | −25.6 | 49,235 |
| Lowndes, AL | 0.057 | −2.4 | +27.9 | 6,835 |
| Macon, AL | 0.064 | +0.7 | +25.9 | 8,723 |
| Madison, AL | 0.118 | −26.4 | −23.0 | 194,767 |
| Marengo, AL | 0.048 | −24.2 | −0.6 | 10,900 |
| Marion, AL | 0.061 | −31.4 | −23.7 | 13,807 |
| Marshall, AL | 0.076 | −41.1 | −37.6 | 39,655 |
| Mobile, AL | 0.150 | −24.0 | −24.2 | 181,166 |
| Monroe, AL | 0.040 | −17.7 | −0.4 | 10,668 |
| Montgomery, AL | 0.145 | −24.7 | −18.6 | 98,448 |
| Morgan, AL | 0.124 | −31.2 | −30.8 | 53,722 |
| Perry, AL | 0.043 | +0.8 | +31.8 | 5,230 |
| Pickens, AL | 0.046 | −21.4 | −0.2 | 9,668 |
| Pike, AL | 0.047 | −36.5 | −20.2 | 13,841 |
| Randolph, AL | 0.059 | −42.5 | −27.8 | 10,837 |
| Russell, AL | 0.090 | −10.3 | −3.5 | 21,329 |
| St. Clair, AL | 0.109 | −30.2 | −29.8 | 44,441 |
| Shelby, AL | 0.128 | −46.2 | −42.5 | 114,950 |
| Sumter, AL | 0.058 | −3.8 | +28.8 | 6,291 |
| Talladega, AL | 0.080 | −19.6 | −13.1 | 35,663 |
| Tallapoosa, AL | 0.054 | −31.2 | −19.7 | 20,991 |
| Tuscaloosa, AL | 0.118 | −25.9 | −22.1 | 89,347 |
| Walker, AL | 0.087 | −28.7 | −25.0 | 31,170 |
| Washington, AL | 0.038 | −34.1 | −13.0 | 8,876 |
| Wilcox, AL | 0.039 | −2.4 | +26.4 | 5,903 |
| Winston, AL | 0.056 | −34.7 | −26.9 | 11,284 |
| Apache, AZ | 0.016 | +16.7 | +54.6 | 35,171 |
| Cochise, AZ | 0.049 | −19.7 | −5.7 | 60,391 |
| Coconino, AZ | 0.072 | +9.6 | +27.7 | 73,274 |
| Gila, AZ | 0.038 | −11.5 | +4.0 | 27,663 |
| Graham, AZ | 0.039 | −28.7 | −12.5 | 14,995 |
| Greenlee, AZ | 0.019 | −35.2 | +1.5 | 3,685 |
| La Paz, AZ | 0.071 | −17.9 | +5.1 | 6,546 |
| Maricopa, AZ | 0.256 | −3.0 | −7.5 | 2,067,902 |
| Mohave, AZ | 0.074 | −18.1 | −20.4 | 104,667 |
| Navajo, AZ | 0.040 | −6.5 | +17.2 | 51,767 |
| Pima, AZ | 0.159 | +7.1 | +10.1 | 519,220 |
| Pinal, AZ | 0.131 | −7.2 | −6.6 | 184,398 |
| Santa Cruz, AZ | 0.048 | +4.7 | +30.6 | 19,556 |
| Yavapai, AZ | 0.073 | −10.5 | −6.0 | 143,219 |
| Yuma, AZ | 0.162 | −14.3 | −10.5 | 69,651 |
| Arkansas, AR | 0.074 | −21.5 | −10.7 | 6,292 |
| Ashley, AR | 0.050 | −29.0 | −16.4 | 7,926 |
| Baxter, AR | 0.061 | −14.0 | −11.2 | 21,007 |
| Benton, AR | 0.090 | −25.8 | −22.0 | 119,903 |
| Boone, AR | 0.051 | −16.3 | −13.4 | 17,114 |
| Bradley, AR | 0.043 | −31.9 | −9.7 | 3,654 |
| Calhoun, AR | 0.040 | −32.4 | −6.3 | 2,182 |
| Carroll, AR | 0.042 | −5.9 | +7.9 | 11,797 |
| Chicot, AR | 0.062 | −22.2 | −0.3 | 4,103 |
| Clark, AR | 0.086 | −14.0 | +0.5 | 8,395 |
| Clay, AR | 0.091 | −14.6 | −8.8 | 5,183 |
| Cleburne, AR | 0.052 | −24.0 | −17.7 | 12,680 |
| Cleveland, AR | 0.045 | −31.3 | −12.4 | 3,600 |
| Columbia, AR | 0.056 | −36.9 | −22.8 | 8,616 |
| Conway, AR | 0.100 | −10.1 | +2.0 | 8,685 |
| Craighead, AR | 0.125 | −26.5 | −24.9 | 38,511 |
| Crawford, AR | 0.117 | −25.3 | −22.8 | 24,093 |
| Crittenden, AR | 0.180 | −13.8 | −8.3 | 16,367 |
| Cross, AR | 0.106 | −24.5 | −16.8 | 6,942 |
| Dallas, AR | 0.051 | −23.5 | −4.5 | 2,649 |
| Desha, AR | 0.070 | −19.0 | +4.3 | 4,164 |
| Drew, AR | 0.055 | −30.4 | −12.4 | 6,908 |
| Faulkner, AR | 0.106 | −21.5 | −19.0 | 54,428 |
| Franklin, AR | 0.073 | −20.0 | −9.8 | 7,129 |
| Fulton, AR | 0.053 | −14.3 | +0.2 | 5,119 |
| Garland, AR | 0.062 | −13.9 | −11.6 | 44,199 |
| Grant, AR | 0.054 | −26.7 | −18.2 | 8,191 |
| Greene, AR | 0.103 | −17.5 | −19.6 | 16,100 |
| Hempstead, AR | 0.078 | −32.9 | −16.5 | 6,845 |
| Hot Spring, AR | 0.090 | −16.7 | −9.9 | 12,557 |
| Howard, AR | 0.059 | −34.2 | −17.6 | 4,837 |
| Independence, AR | 0.072 | −22.4 | −14.5 | 14,512 |
| Izard, AR | 0.042 | −27.7 | −12.4 | 5,810 |
| Jackson, AR | 0.100 | −18.4 | −7.5 | 5,091 |
| Jefferson, AR | 0.093 | −10.8 | −1.1 | 24,796 |
| Johnson, AR | 0.084 | −20.2 | −9.5 | 9,541 |
| Lafayette, AR | 0.047 | −31.1 | −10.8 | 2,679 |
| Lawrence, AR | 0.101 | −14.6 | −8.4 | 5,857 |
| Lee, AR | 0.076 | −17.7 | +1.1 | 2,848 |
| Lincoln, AR | 0.054 | −21.9 | −6.7 | 3,875 |
| Little River, AR | 0.066 | −35.4 | −18.2 | 5,177 |
| Logan, AR | 0.048 | −17.5 | −9.5 | 8,182 |
| Lonoke, AR | 0.098 | −22.0 | −21.4 | 30,699 |
| Madison, AR | 0.037 | −22.6 | −5.7 | 7,351 |
| Marion, AR | 0.041 | −12.4 | −2.0 | 7,503 |
| Miller, AR | 0.118 | −30.3 | −28.4 | 16,527 |
| Mississippi, AR | 0.102 | −19.7 | −10.7 | 12,342 |
| Monroe, AR | 0.091 | −23.3 | +1.7 | 2,816 |
| Montgomery, AR | 0.035 | −19.8 | −0.8 | 3,873 |
| Nevada, AR | 0.065 | −24.2 | −3.2 | 3,358 |
| Newton, AR | 0.030 | −15.7 | +2.9 | 3,998 |
| Ouachita, AR | 0.109 | −19.0 | −5.1 | 9,629 |
| Perry, AR | 0.054 | −11.5 | +1.7 | 4,627 |
| Phillips, AR | 0.076 | −12.0 | +6.2 | 6,242 |
| Pike, AR | 0.046 | −36.5 | −18.0 | 4,246 |
| Poinsett, AR | 0.101 | −20.0 | −15.3 | 7,521 |
| Polk, AR | 0.039 | −29.8 | −17.6 | 8,490 |
| Pope, AR | 0.100 | −25.2 | −21.2 | 24,432 |
| Prairie, AR | 0.085 | −28.7 | −9.5 | 3,495 |
| Pulaski, AR | 0.154 | −6.9 | −4.6 | 169,926 |
| Randolph, AR | 0.076 | −17.9 | −10.8 | 6,812 |
| St. Francis, AR | 0.123 | −14.4 | −0.3 | 7,108 |
| Saline, AR | 0.100 | −21.7 | −21.5 | 56,960 |
| Scott, AR | 0.036 | −28.1 | −13.0 | 3,551 |
| Searcy, AR | 0.036 | −27.0 | −9.3 | 4,019 |
| Sebastian, AR | 0.092 | −20.8 | −20.8 | 47,138 |
| Sevier, AR | 0.058 | −35.9 | −19.2 | 5,202 |
| Sharp, AR | 0.059 | −13.6 | −5.3 | 7,566 |
| Stone, AR | 0.039 | −17.1 | −3.5 | 5,938 |
| Union, AR | 0.057 | −29.6 | −18.1 | 16,607 |
| Van Buren, AR | 0.042 | −14.1 | −1.9 | 7,807 |
| Washington, AR | 0.092 | −3.1 | +0.5 | 94,275 |
| White, AR | 0.083 | −26.5 | −22.1 | 30,885 |
| Woodruff, AR | 0.086 | −16.2 | +7.1 | 2,476 |
| Yell, AR | 0.056 | −27.7 | −13.0 | 6,741 |
| Alameda, CA | 0.250 | +21.4 | +21.4 | 767,729 |
| Alpine, CA | 0.012 | +26.8 | +71.0 | 741 |
| Amador, CA | 0.052 | +2.6 | +11.5 | 22,308 |
| Butte, CA | 0.133 | +8.5 | +10.7 | 102,023 |
| Calaveras, CA | 0.049 | +4.6 | +16.4 | 27,159 |
| Colusa, CA | 0.078 | −20.1 | +8.3 | 7,962 |
| Contra Costa, CA | 0.161 | +22.9 | +23.3 | 581,271 |
| Del Norte, CA | 0.024 | −0.7 | +7.4 | 11,452 |
| El Dorado, CA | 0.067 | +3.4 | +6.8 | 115,597 |
| Fresno, CA | 0.369 | −9.6 | −6.9 | 364,089 |
| Glenn, CA | 0.100 | −16.9 | −7.7 | 11,296 |
| Humboldt, CA | 0.054 | +42.2 | +48.7 | 68,824 |
| Imperial, CA | 0.180 | −4.7 | +7.2 | 55,690 |
| Inyo, CA | 0.021 | +0.6 | +25.6 | 9,480 |
| Kern, CA | 0.318 | −17.1 | −15.6 | 305,129 |
| Kings, CA | 0.268 | −19.2 | −16.6 | 43,863 |
| Lake, CA | 0.031 | +28.5 | +35.5 | 28,808 |
| Lassen, CA | 0.020 | −25.9 | −9.4 | 11,980 |
| Los Angeles, CA | 0.401 | +12.5 | +10.1 | 4,256,459 |
| Madera, CA | 0.225 | −13.6 | −1.8 | 53,736 |
| Marin, CA | 0.077 | +54.1 | +54.9 | 155,764 |
| Mariposa, CA | 0.030 | −0.5 | +24.0 | 10,277 |
| Mendocino, CA | 0.031 | +47.4 | +61.9 | 43,333 |
| Merced, CA | 0.302 | −0.9 | +5.1 | 90,569 |
| Modoc, CA | 0.015 | −23.4 | +2.3 | 4,338 |
| Mono, CA | 0.014 | +27.3 | +57.3 | 6,737 |
| Monterey, CA | 0.093 | +25.7 | +30.6 | 163,789 |
| Napa, CA | 0.101 | +32.4 | +34.7 | 72,042 |
| Nevada, CA | 0.058 | +28.7 | +34.7 | 64,806 |
| Orange, CA | 0.316 | −13.3 | −16.2 | 1,521,670 |
| Placer, CA | 0.211 | −3.9 | −5.4 | 234,940 |
| Plumas, CA | 0.022 | +17.6 | +37.8 | 11,256 |
| Riverside, CA | 0.271 | −4.1 | −3.9 | 997,214 |
| Sacramento, CA | 0.234 | +10.4 | +6.0 | 716,929 |
| San Benito, CA | 0.100 | +19.1 | +25.4 | 28,876 |
| San Bernardino, CA | 0.353 | −7.1 | −5.6 | 840,486 |
| San Diego, CA | 0.234 | +2.9 | +1.3 | 1,601,471 |
| San Francisco, CA | 0.307 | +33.3 | +25.2 | 439,813 |
| San Joaquin, CA | 0.265 | +3.3 | +1.6 | 288,024 |
| San Luis Obispo, CA | 0.070 | +13.8 | +17.3 | 159,755 |
| San Mateo, CA | 0.125 | +30.3 | +29.4 | 373,511 |
| Santa Barbara, CA | 0.116 | +20.0 | +20.6 | 200,147 |
| Santa Clara, CA | 0.202 | +10.1 | +11.3 | 849,568 |
| Santa Cruz, CA | 0.078 | +54.1 | +54.6 | 143,698 |
| Shasta, CA | 0.090 | −7.5 | −8.4 | 92,846 |
| Sierra, CA | 0.020 | +11.3 | +42.4 | 1,930 |
| Siskiyou, CA | 0.029 | +5.2 | +25.2 | 23,439 |
| Solano, CA | 0.151 | +15.3 | +15.2 | 205,888 |
| Sonoma, CA | 0.095 | +52.5 | +53.1 | 268,261 |
| Stanislaus, CA | 0.269 | −0.2 | −2.9 | 214,859 |
| Sutter, CA | 0.151 | −15.4 | −13.3 | 42,604 |
| Tehama, CA | 0.098 | −16.0 | −4.3 | 28,787 |
| Trinity, CA | 0.010 | +26.5 | +52.9 | 6,262 |
| Tulare, CA | 0.312 | −16.4 | −11.5 | 146,843 |
| Tuolumne, CA | 0.040 | +8.3 | +15.4 | 30,395 |
| Ventura, CA | 0.165 | +11.7 | +10.8 | 422,731 |
| Yolo, CA | 0.190 | +12.7 | +18.2 | 96,830 |
| Yuba, CA | 0.143 | −9.6 | −5.7 | 29,816 |
| Adams, CO | 0.312 | +15.0 | +11.1 | 236,740 |
| Alamosa, CO | 0.050 | −13.7 | +6.6 | 7,808 |
| Arapahoe, CO | 0.268 | +9.9 | +5.7 | 350,172 |
| Archuleta, CO | 0.015 | −10.8 | +12.4 | 9,144 |
| Baca, CO | 0.022 | −45.1 | −8.9 | 2,225 |
| Bent, CO | 0.036 | −21.5 | +13.9 | 2,274 |
| Boulder, CO | 0.122 | +38.6 | +41.4 | 206,111 |
| Broomfield, CO | 0.238 | +18.7 | +15.8 | 46,632 |
| Chaffee, CO | 0.016 | +10.8 | +29.8 | 13,718 |
| Cheyenne, CO | 0.020 | −51.0 | −10.4 | 1,136 |
| Clear Creek, CO | 0.025 | +13.0 | +37.8 | 6,548 |
| Conejos, CO | 0.014 | −14.2 | +24.9 | 4,333 |
| Costilla, CO | 0.010 | +5.3 | +54.4 | 2,094 |
| Crowley, CO | 0.030 | −34.5 | −8.2 | 1,750 |
| Custer, CO | 0.009 | −14.1 | +13.6 | 3,635 |
| Delta, CO | 0.029 | −13.8 | +2.5 | 19,370 |
| Denver, CO | 0.462 | +32.4 | +28.7 | 393,776 |
| Dolores, CO | 0.011 | −26.3 | +8.8 | 1,449 |
| Douglas, CO | 0.166 | −12.9 | −13.0 | 231,605 |
| Eagle, CO | 0.029 | +14.9 | +38.6 | 26,745 |
| Elbert, CO | 0.048 | −22.8 | −9.3 | 18,983 |
| El Paso, CO | 0.117 | −13.2 | −15.9 | 378,813 |
| Fremont, CO | 0.026 | −11.6 | −5.1 | 25,557 |
| Garfield, CO | 0.041 | +5.8 | +24.5 | 30,904 |
| Gilpin, CO | 0.021 | +15.1 | +36.1 | 4,186 |
| Grand, CO | 0.017 | +7.0 | +33.4 | 9,870 |
| Gunnison, CO | 0.018 | +20.3 | +46.2 | 11,190 |
| Hinsdale, CO | 0.005 | −13.8 | +33.5 | 632 |
| Huerfano, CO | 0.022 | +5.5 | +35.4 | 4,406 |
| Jackson, CO | 0.013 | −37.8 | +4.6 | 876 |
| Jefferson, CO | 0.185 | +18.0 | +14.2 | 376,131 |
| Kiowa, CO | 0.022 | −41.1 | −2.2 | 903 |
| Kit Carson, CO | 0.026 | −35.8 | −4.6 | 3,871 |
| Lake, CO | 0.015 | +5.3 | +25.4 | 3,961 |
| La Plata, CO | 0.030 | +15.7 | +32.3 | 35,667 |
| Larimer, CO | 0.146 | +13.7 | +14.1 | 224,264 |
| Las Animas, CO | 0.028 | −0.8 | +26.4 | 7,961 |
| Lincoln, CO | 0.028 | −46.7 | −12.3 | 2,651 |
| Logan, CO | 0.070 | −27.8 | −17.5 | 10,532 |
| Mesa, CO | 0.093 | −8.8 | −11.9 | 90,623 |
| Mineral, CO | 0.006 | −19.7 | +29.4 | 756 |
| Moffat, CO | 0.034 | −35.2 | −30.9 | 7,026 |
| Montezuma, CO | 0.021 | −9.2 | +9.4 | 15,500 |
| Montrose, CO | 0.043 | −20.2 | −10.1 | 24,922 |
| Morgan, CO | 0.109 | −26.5 | −14.0 | 13,744 |
| Otero, CO | 0.049 | −15.0 | +0.7 | 9,576 |
| Ouray, CO | 0.009 | +20.3 | +52.5 | 4,020 |
| Park, CO | 0.013 | +3.1 | +24.7 | 12,285 |
| Phillips, CO | 0.033 | −43.4 | −12.1 | 2,485 |
| Pitkin, CO | 0.014 | +34.5 | +60.7 | 11,957 |
| Prowers, CO | 0.044 | −35.8 | −19.4 | 5,561 |
| Pueblo, CO | 0.101 | +2.0 | +5.1 | 88,239 |
| Rio Blanco, CO | 0.015 | −42.7 | −7.1 | 3,691 |
| Rio Grande, CO | 0.022 | −22.1 | +1.3 | 6,305 |
| Routt, CO | 0.028 | +28.3 | +47.8 | 16,876 |
| Saguache, CO | 0.011 | +18.8 | +61.5 | 3,389 |
| San Juan, CO | 0.007 | +23.9 | +68.5 | 562 |
| San Miguel, CO | 0.008 | +36.5 | +69.2 | 5,147 |
| Sedgwick, CO | 0.058 | −41.9 | −8.0 | 1,446 |
| Summit, CO | 0.026 | +36.8 | +52.4 | 18,479 |
| Teller, CO | 0.016 | −20.1 | −8.9 | 16,962 |
| Washington, CO | 0.031 | −45.5 | −11.7 | 3,008 |
| Weld, CO | 0.190 | −9.6 | −7.3 | 166,255 |
| Yuma, CO | 0.033 | −54.2 | −18.9 | 4,981 |
| Kent, DE | 0.108 | −0.5 | +1.0 | 87,021 |
| New Castle, DE | 0.183 | +18.2 | +16.2 | 287,633 |
| Sussex, DE | 0.079 | −0.8 | +2.3 | 129,356 |
| Alachua, FL | 0.146 | −1.4 | +5.7 | 142,988 |
| Baker, FL | 0.080 | −37.4 | −31.1 | 14,082 |
| Bay, FL | 0.092 | −30.7 | −33.8 | 93,213 |
| Bradford, FL | 0.073 | −29.0 | −22.6 | 13,704 |
| Brevard, FL | 0.120 | −9.8 | −15.5 | 360,580 |
| Broward, FL | 0.285 | −7.9 | −9.9 | 959,445 |
| Calhoun, FL | 0.036 | −29.1 | −14.4 | 6,537 |
| Charlotte, FL | 0.092 | +0.2 | −6.7 | 116,560 |
| Citrus, FL | 0.080 | −7.0 | −10.1 | 93,403 |
| Clay, FL | 0.124 | −26.3 | −29.9 | 124,589 |
| Collier, FL | 0.115 | −26.4 | −26.5 | 208,285 |
| Columbia, FL | 0.086 | −24.8 | −19.8 | 33,092 |
| DeSoto, FL | 0.076 | −18.1 | −7.4 | 12,676 |
| Dixie, FL | 0.043 | −17.7 | −8.7 | 8,173 |
| Duval, FL | 0.201 | −16.9 | −19.5 | 494,212 |
| Escambia, FL | 0.120 | −17.9 | −20.5 | 170,856 |
| Flagler, FL | 0.093 | −9.6 | −12.1 | 71,871 |
| Franklin, FL | 0.036 | −16.3 | +0.5 | 6,874 |
| Gadsden, FL | 0.058 | −2.6 | +16.2 | 23,763 |
| Gilchrist, FL | 0.051 | −21.7 | −13.3 | 9,702 |
| Glades, FL | 0.056 | −34.8 | −10.9 | 5,212 |
| Gulf, FL | 0.036 | −32.4 | −17.0 | 8,172 |
| Hamilton, FL | 0.065 | −25.6 | −5.7 | 5,567 |
| Hardee, FL | 0.070 | −38.5 | −21.2 | 8,500 |
| Hendry, FL | 0.069 | −31.6 | −14.0 | 12,943 |
| Hernando, FL | 0.105 | −5.6 | −10.9 | 109,147 |
| Highlands, FL | 0.072 | −20.7 | −17.3 | 52,232 |
| Hillsborough, FL | 0.216 | −15.2 | −15.4 | 713,279 |
| Holmes, FL | 0.044 | −35.5 | −26.1 | 9,078 |
| Indian River, FL | 0.098 | −11.8 | −15.0 | 97,740 |
| Jackson, FL | 0.051 | −27.7 | −15.3 | 22,456 |
| Jefferson, FL | 0.049 | −2.2 | +15.9 | 8,468 |
| Lafayette, FL | 0.039 | −45.1 | −26.9 | 3,661 |
| Lake, FL | 0.133 | −11.1 | −11.9 | 211,284 |
| Lee, FL | 0.127 | −11.7 | −16.1 | 393,618 |
| Leon, FL | 0.120 | −6.5 | −1.2 | 161,120 |
| Levy, FL | 0.057 | −16.7 | −5.8 | 23,196 |
| Liberty, FL | 0.033 | −26.1 | −3.4 | 3,566 |
| Madison, FL | 0.052 | −19.5 | −2.6 | 9,393 |
| Manatee, FL | 0.147 | −10.5 | −15.1 | 217,471 |
| Marion, FL | 0.119 | −12.3 | −12.6 | 204,736 |
| Martin, FL | 0.129 | −13.7 | −16.6 | 98,969 |
| Miami-Dade, FL | 0.286 | −42.6 | −39.1 | 1,154,200 |
| Monroe, FL | 0.059 | −9.7 | −8.9 | 48,122 |
| Nassau, FL | 0.101 | −27.0 | −24.8 | 58,920 |
| Okaloosa, FL | 0.082 | −34.2 | −37.1 | 116,748 |
| Okeechobee, FL | 0.075 | −26.7 | −20.2 | 15,984 |
| Orange, FL | 0.255 | −9.1 | −6.7 | 649,086 |
| Osceola, FL | 0.167 | −12.8 | −5.7 | 172,793 |
| Palm Beach, FL | 0.192 | −4.5 | −7.5 | 774,179 |
| Pasco, FL | 0.137 | −8.6 | −13.4 | 302,673 |
| Pinellas, FL | 0.184 | +3.9 | −5.9 | 556,668 |
| Polk, FL | 0.146 | −15.3 | −15.7 | 344,106 |
| Putnam, FL | 0.069 | −19.8 | −13.8 | 36,403 |
| St. Johns, FL | 0.126 | −25.3 | −24.5 | 177,026 |
| St. Lucie, FL | 0.136 | −5.5 | −8.9 | 172,340 |
| Santa Rosa, FL | 0.078 | −28.1 | −30.3 | 107,193 |
| Sarasota, FL | 0.132 | +0.2 | −5.6 | 271,167 |
| Seminole, FL | 0.212 | −14.4 | −14.6 | 261,618 |
| Sumter, FL | 0.170 | −17.7 | −22.0 | 92,538 |
| Suwannee, FL | 0.059 | −31.6 | −20.7 | 21,057 |
| Taylor, FL | 0.050 | −33.6 | −20.8 | 10,135 |
| Union, FL | 0.062 | −32.5 | −24.7 | 6,251 |
| Volusia, FL | 0.135 | −2.7 | −7.3 | 308,100 |
| Wakulla, FL | 0.048 | −15.6 | −7.8 | 18,133 |
| Walton, FL | 0.062 | −34.3 | −28.0 | 43,795 |
| Washington, FL | 0.046 | −29.4 | −19.3 | 12,335 |
| Appling, GA | 0.049 | −33.5 | −21.6 | 8,341 |
| Atkinson, GA | 0.042 | −36.7 | −15.0 | 3,155 |
| Bacon, GA | 0.052 | −44.8 | −32.8 | 4,668 |
| Baker, GA | 0.036 | −28.7 | +1.2 | 1,555 |
| Baldwin, GA | 0.072 | −18.7 | −10.4 | 18,283 |
| Banks, GA | 0.097 | −37.1 | −30.9 | 8,784 |
| Barrow, GA | 0.175 | −29.0 | −29.6 | 37,921 |
| Bartow, GA | 0.179 | −28.0 | −27.9 | 50,434 |
| Ben Hill, GA | 0.073 | −27.3 | −21.2 | 6,560 |
| Berrien, GA | 0.048 | −33.0 | −22.2 | 7,743 |
| Bibb, GA | 0.170 | −14.0 | −10.3 | 69,327 |
| Bleckley, GA | 0.063 | −40.5 | −30.7 | 5,706 |
| Brantley, GA | 0.046 | −32.1 | −24.2 | 7,746 |
| Brooks, GA | 0.051 | −20.3 | −3.6 | 7,100 |
| Bryan, GA | 0.099 | −29.6 | −23.4 | 21,340 |
| Bulloch, GA | 0.068 | −31.9 | −22.1 | 30,084 |
| Burke, GA | 0.053 | −13.7 | +6.0 | 10,684 |
| Butts, GA | 0.130 | −28.3 | −23.6 | 11,771 |
| Calhoun, GA | 0.038 | −16.0 | +9.1 | 2,194 |
| Camden, GA | 0.099 | −18.3 | −13.8 | 23,688 |
| Candler, GA | 0.051 | −31.7 | −16.0 | 4,431 |
| Carroll, GA | 0.104 | −27.0 | −25.1 | 54,450 |
| Catoosa, GA | 0.165 | −21.8 | −27.3 | 32,593 |
| Charlton, GA | 0.055 | −45.2 | −26.7 | 4,566 |
| Chatham, GA | 0.140 | −12.2 | −9.9 | 133,420 |
| Chattahoochee, GA | 0.051 | −21.1 | −5.2 | 1,582 |
| Chattooga, GA | 0.089 | −23.1 | −19.8 | 10,050 |
| Cherokee, GA | 0.156 | −30.7 | −33.2 | 144,830 |
| Clarke, GA | 0.168 | +2.0 | +8.1 | 51,333 |
| Clay, GA | 0.035 | −26.5 | +3.0 | 1,434 |
| Clayton, GA | 0.184 | +5.2 | +7.8 | 111,190 |
| Clinch, GA | 0.043 | −34.1 | −11.5 | 2,864 |
| Cobb, GA | 0.230 | −20.7 | −18.8 | 393,747 |
| Coffee, GA | 0.064 | −34.4 | −23.5 | 15,214 |
| Colquitt, GA | 0.062 | −44.3 | −33.8 | 16,083 |
| Columbia, GA | 0.127 | −30.9 | −30.7 | 80,581 |
| Cook, GA | 0.081 | −36.0 | −24.1 | 7,035 |
| Coweta, GA | 0.117 | −33.1 | −30.9 | 76,798 |
| Crawford, GA | 0.067 | −23.1 | −10.9 | 6,102 |
| Crisp, GA | 0.108 | −40.8 | −28.2 | 8,039 |
| Dade, GA | 0.096 | −23.4 | −18.7 | 7,434 |
| Dawson, GA | 0.091 | −44.4 | −38.5 | 16,081 |
| Decatur, GA | 0.050 | −25.9 | −14.0 | 11,627 |
| DeKalb, GA | 0.255 | +3.2 | +7.0 | 370,006 |
| Dodge, GA | 0.053 | −38.7 | −25.2 | 8,070 |
| Dooly, GA | 0.080 | −26.3 | −3.6 | 4,105 |
| Dougherty, GA | 0.090 | −17.1 | −9.9 | 35,296 |
| Douglas, GA | 0.159 | −13.8 | −8.3 | 69,121 |
| Early, GA | 0.039 | −29.6 | −5.8 | 5,187 |
| Echols, GA | 0.045 | −59.6 | −33.6 | 1,441 |
| Effingham, GA | 0.092 | −34.0 | −29.9 | 31,570 |
| Elbert, GA | 0.073 | −26.4 | −15.2 | 9,171 |
| Emanuel, GA | 0.048 | −33.0 | −16.9 | 9,501 |
| Evans, GA | 0.052 | −35.6 | −20.7 | 4,247 |
| Fannin, GA | 0.049 | −27.5 | −20.8 | 14,865 |
| Fayette, GA | 0.121 | −33.3 | −26.7 | 71,994 |
| Floyd, GA | 0.134 | −27.8 | −25.4 | 41,648 |
| Forsyth, GA | 0.163 | −48.4 | −45.0 | 129,176 |
| Franklin, GA | 0.108 | −38.2 | −32.2 | 10,765 |
| Fulton, GA | 0.273 | −14.0 | −9.0 | 518,228 |
| Gilmer, GA | 0.054 | −31.4 | −23.6 | 16,510 |
| Glascock, GA | 0.048 | −42.4 | −28.0 | 1,566 |
| Glynn, GA | 0.089 | −23.0 | −19.3 | 41,984 |
| Gordon, GA | 0.156 | −31.5 | −29.4 | 24,066 |
| Grady, GA | 0.051 | −29.3 | −16.4 | 10,707 |
| Greene, GA | 0.074 | −38.0 | −20.8 | 11,247 |
| Gwinnett, GA | 0.231 | −21.8 | −18.5 | 413,865 |
| Habersham, GA | 0.069 | −42.1 | −37.1 | 20,453 |
| Hall, GA | 0.157 | −34.9 | −33.5 | 90,517 |
| Hancock, GA | 0.049 | +5.5 | +32.1 | 4,133 |
| Haralson, GA | 0.097 | −31.9 | −30.3 | 14,248 |
| Harris, GA | 0.068 | −37.5 | −24.8 | 19,991 |
| Hart, GA | 0.087 | −27.5 | −22.2 | 12,727 |
| Heard, GA | 0.059 | −25.0 | −16.1 | 5,391 |
| Henry, GA | 0.179 | −14.8 | −10.8 | 122,762 |
| Houston, GA | 0.117 | −29.7 | −29.4 | 74,819 |
| Irwin, GA | 0.054 | −42.7 | −24.0 | 4,168 |
| Jackson, GA | 0.172 | −37.7 | −34.8 | 37,673 |
| Jasper, GA | 0.081 | −36.5 | −23.5 | 7,644 |
| Jeff Davis, GA | 0.051 | −40.8 | −28.8 | 5,771 |
| Jefferson, GA | 0.057 | −11.4 | +9.4 | 7,642 |
| Jenkins, GA | 0.048 | −21.4 | −3.7 | 3,455 |
| Johnson, GA | 0.046 | −25.0 | −11.4 | 4,100 |
| Jones, GA | 0.083 | −17.6 | −11.2 | 14,966 |
| Lamar, GA | 0.088 | −31.0 | −23.3 | 9,039 |
| Lanier, GA | 0.048 | −40.8 | −27.4 | 2,844 |
| Laurens, GA | 0.064 | −32.0 | −22.5 | 22,729 |
| Lee, GA | 0.062 | −46.9 | −38.6 | 16,729 |
| Liberty, GA | 0.083 | −0.9 | +5.4 | 21,257 |
| Lincoln, GA | 0.054 | −25.7 | −10.6 | 4,650 |
| Long, GA | 0.059 | −20.6 | −5.6 | 5,656 |
| Lowndes, GA | 0.104 | −30.0 | −25.2 | 46,355 |
| Lumpkin, GA | 0.064 | −32.1 | −26.0 | 15,531 |
| McDuffie, GA | 0.085 | −27.4 | −15.9 | 10,455 |
| McIntosh, GA | 0.077 | −18.0 | 0.0 | 6,696 |
| Macon, GA | 0.069 | −8.2 | +14.8 | 4,662 |
| Madison, GA | 0.090 | −27.9 | −21.3 | 14,936 |
| Marion, GA | 0.045 | −22.1 | −0.9 | 3,624 |
| Meriwether, GA | 0.065 | −19.9 | −5.3 | 10,878 |
| Miller, GA | 0.038 | −45.3 | −24.0 | 2,835 |
| Mitchell, GA | 0.045 | −22.4 | −5.7 | 8,963 |
| Monroe, GA | 0.126 | −34.4 | −22.9 | 15,492 |
| Montgomery, GA | 0.042 | −38.8 | −21.9 | 3,966 |
| Morgan, GA | 0.101 | −34.0 | −20.3 | 11,707 |
| Murray, GA | 0.073 | −29.7 | −27.5 | 15,389 |
| Muscogee, GA | 0.133 | −14.7 | −13.9 | 80,509 |
| Newton, GA | 0.158 | −13.8 | −9.7 | 54,239 |
| Oconee, GA | 0.125 | −34.4 | −25.7 | 25,168 |
| Oglethorpe, GA | 0.071 | −25.2 | −11.2 | 8,131 |
| Paulding, GA | 0.144 | −24.2 | −26.1 | 85,385 |
| Peach, GA | 0.117 | −25.3 | −15.2 | 12,549 |
| Pickens, GA | 0.071 | −28.9 | −26.7 | 17,116 |
| Pierce, GA | 0.058 | −44.8 | −36.9 | 9,048 |
| Pike, GA | 0.071 | −35.2 | −29.8 | 10,720 |
| Polk, GA | 0.101 | −30.8 | −26.0 | 17,399 |
| Pulaski, GA | 0.060 | −38.0 | −30.7 | 4,059 |
| Putnam, GA | 0.070 | −41.2 | −27.0 | 11,855 |
| Quitman, GA | 0.033 | −20.2 | +3.9 | 1,106 |
| Rabun, GA | 0.036 | −33.0 | −18.8 | 9,568 |
| Randolph, GA | 0.038 | −36.4 | −5.9 | 3,074 |
| Richmond, GA | 0.150 | −3.5 | −1.9 | 87,014 |
| Rockdale, GA | 0.179 | −9.5 | −3.0 | 44,686 |
| Schley, GA | 0.045 | −35.2 | −19.7 | 2,275 |
| Screven, GA | 0.050 | −22.0 | −2.2 | 6,628 |
| Seminole, GA | 0.041 | −30.7 | −16.6 | 3,884 |
| Spalding, GA | 0.123 | −21.5 | −20.1 | 30,116 |
| Stephens, GA | 0.088 | −25.6 | −24.6 | 11,884 |
| Stewart, GA | 0.035 | −21.3 | +11.4 | 1,990 |
| Sumter, GA | 0.072 | −27.2 | −10.9 | 12,150 |
| Talbot, GA | 0.057 | −4.3 | +22.5 | 3,522 |
| Taliaferro, GA | 0.059 | +8.0 | +37.2 | 928 |
| Tattnall, GA | 0.048 | −45.2 | −30.7 | 8,183 |
| Taylor, GA | 0.061 | −32.1 | −11.3 | 3,839 |
| Telfair, GA | 0.046 | −30.8 | −11.6 | 4,333 |
| Terrell, GA | 0.056 | −13.0 | +6.9 | 4,416 |
| Thomas, GA | 0.061 | −29.5 | −19.7 | 21,853 |
| Tift, GA | 0.106 | −37.4 | −31.2 | 16,283 |
| Toombs, GA | 0.057 | −44.2 | −33.7 | 10,914 |
| Towns, GA | 0.039 | −35.0 | −25.1 | 7,983 |
| Treutlen, GA | 0.048 | −26.5 | −11.4 | 3,077 |
| Troup, GA | 0.106 | −28.8 | −21.9 | 30,049 |
| Turner, GA | 0.074 | −29.7 | −11.4 | 3,792 |
| Twiggs, GA | 0.067 | −15.5 | +5.5 | 4,444 |
| Union, GA | 0.044 | −27.6 | −21.0 | 15,556 |
| Upson, GA | 0.069 | −18.8 | −14.6 | 12,905 |
| Walker, GA | 0.112 | −23.3 | −25.0 | 29,354 |
| Walton, GA | 0.153 | −36.3 | −35.4 | 51,095 |
| Ware, GA | 0.096 | −32.2 | −27.2 | 14,192 |
| Warren, GA | 0.062 | −13.8 | +10.8 | 2,651 |
| Washington, GA | 0.061 | −25.9 | −4.7 | 9,459 |
| Wayne, GA | 0.064 | −36.3 | −29.0 | 12,778 |

The first 500 of 3096 rows; every row is in https://vishalsingh.org/politics/report/air-pollution-and-the-vote/figures/county_diesel_scatter.json.

Views: Residual margin; Density held fixed.

Note: Binned means group counties into tenths by diesel exposure. The number of counties in each bin is in the tooltip.

Note: Hawaii, Connecticut and the District of Columbia, and counties without a tract of more than 100 votes, are left out. County values are averages of modeled tract values, so they carry the errors of both models.

Note: Intervals on the binned means resample the states. They do not include error in the allocation of precinct votes to tracts or in the modeled pollution values.

Source: Precinct votes allocated to census tracts (Fekrazad 2025), 2020 presidential election; EPA EJScreen version 2.3 (2024 release, 2020 air data); American Community Survey tract data (vintage not recorded in the atlas); vote-weighted county means of tract values, full counts, no sampling weights

Data: https://vishalsingh.org/politics/report/air-pollution-and-the-vote/figures/county_diesel_scatter.json

### Table 6. Support for EPA enforcement rises with county diesel exposure, but the rise shrinks within party and its interval includes zero with county density held fixed

Percentage-point difference in support for strengthening EPA enforcement of the Clean Air Act and Clean Water Act even if it costs U.S. jobs, per standard deviation of county diesel exposure; 57,411 respondents in 2,630 counties, 2020; 95% intervals clustered by county

| conf_high | conf_low | estimate | group | n | specification |
| ---: | ---: | ---: | --- | ---: | --- |
| 7.57 | 5.30 | 6.43 | All respondents | 57,411 | No controls |
| 1.74 | 0.861 | 1.30 | All respondents | 57,411 | Party ID and demographics |
| 0.369 | −1.12 | −0.377 | All respondents | 57,411 | Plus county density |
| 0.829 | −0.773 | 0.028 | Democrats | 28,671 | No controls |
| 0.955 | −0.620 | 0.168 | Democrats | 28,671 | Party ID and demographics |
| 0.568 | −1.77 | −0.603 | Democrats | 28,671 | Plus county density |
| 4.81 | 1.34 | 3.08 | Independents | 8,643 | No controls |
| 3.51 | −0.177 | 1.66 | Independents | 8,643 | Party ID and demographics |
| 1.18 | −4.11 | −1.47 | Independents | 8,643 | Plus county density |
| 6.16 | 2.39 | 4.27 | Republicans | 20,097 | No controls |
| 4.78 | 1.18 | 2.98 | Republicans | 20,097 | Party ID and demographics |
| 3.40 | −1.42 | 0.991 | Republicans | 20,097 | Plus county density |

Note: The CES is an opt-in panel, so its intervals are model based. County exposure is a county value assigned to each respondent, not an exposure the respondent was measured to have.

Note: It is a different CES item from the one on giving the EPA power to regulate carbon dioxide.

Source: Cooperative Election Study 2020 wave, item on strengthening EPA enforcement of the Clean Air Act and Clean Water Act, weighted with the CES survey weight; county diesel exposure from EPA EJScreen version 2.3 averaged over tracts by 2020 votes

Data: https://vishalsingh.org/politics/report/air-pollution-and-the-vote/figures/ces_within_party.json

## All estimates

Every fact in facts.json (103), sorted by id.

| Fact id | Value | Unit | Estimand | Population | Period | Interval | n | Weights | Source | Note |
| --- | ---: | --- | --- | --- | --- | --- | ---: | --- | --- | --- |
| adi_d1 | 62.5 | Area Deprivation Index national rank (1 = least deprived, 100 = most deprived) | vote-weighted mean rank; 95% interval clustered by county | census tracts in decile 1 of diesel exposure with an ADI rank | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI 60.9 to 64.2 | 8,076 | votes cast in the tract, 2020 presidential election (pres_tot) | Area Deprivation Index |   |
| adi_d10 | 22.2 | Area Deprivation Index national rank (1 = least deprived, 100 = most deprived) | vote-weighted mean rank; 95% interval clustered by county | census tracts in decile 10 of diesel exposure with an ADI rank | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI 16.2 to 28.2 | 8,073 | votes cast in the tract, 2020 presidential election (pres_tot) | Area Deprivation Index |   |
| adi_national | 44.8 | Area Deprivation Index national rank (1 = least deprived, 100 = most deprived) | vote-weighted mean rank; 95% interval clustered by county | all sample tracts with an ADI rank | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI 42.2 to 47.4 | 80,849 | votes cast in the tract, 2020 presidential election (pres_tot) | Area Deprivation Index |   |
| asthma_ctrl | 0.04 | percentage points of adults with current asthma per standard deviation of diesel exposure | weighted least squares coefficient of the tract asthma estimate on standardized diesel exposure, with race, income and education held fixed; 95% interval clustered by county | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | PLACES release not recorded in the atlas file | 95% CI −0.04 to 0.12 | 81,134 | votes cast in the tract, 2020 presidential election (pres_tot) | CDC PLACES |   |
| asthma_d1 | 11.0% | percent of adults with current asthma (model-based tract estimate) | vote-weighted mean of the tract estimate; 95% interval clustered by county | census tracts in decile 1 of diesel exposure | PLACES release not recorded in the atlas file | 95% CI 11.0% to 11.1% | 8,114 | votes cast in the tract, 2020 presidential election (pres_tot) | CDC PLACES |   |
| asthma_d10 | 9.9% | percent of adults with current asthma (model-based tract estimate) | vote-weighted mean of the tract estimate; 95% interval clustered by county | census tracts in decile 10 of diesel exposure | PLACES release not recorded in the atlas file | 95% CI 9.6% to 10.3% | 8,114 | votes cast in the tract, 2020 presidential election (pres_tot) | CDC PLACES |   |
| asthma_dens | −0.02 | percentage points of adults with current asthma per standard deviation of diesel exposure | weighted least squares coefficient of the tract asthma estimate on standardized diesel exposure, with race, income, education and density held fixed; 95% interval clustered by county | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | PLACES release not recorded in the atlas file | 95% CI −0.11 to 0.07 | 81,134 | votes cast in the tract, 2020 presidential election (pres_tot) | CDC PLACES |   |
| asthma_raw | −0.25 | percentage points of adults with current asthma per standard deviation of diesel exposure | weighted least squares coefficient of the tract asthma estimate on standardized diesel exposure, with no controls; 95% interval clustered by county | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | PLACES release not recorded in the atlas file | 95% CI −0.35 to −0.14 | 81,134 | votes cast in the tract, 2020 presidential election (pres_tot) | CDC PLACES |   |
| ces_all_ctrl | 1.3 | percentage points of support per standard deviation of county diesel exposure | weighted linear probability model coefficient on standardized county diesel exposure, specification: party id and demographics; 95% interval clustered by county | all respondents in the CES 2020 sample | 2020 | 95% CI 0.9 to 1.7 | 57,411 | CES 2020 weight (weight) | Cooperative Election Study |   |
| ces_all_dens | −0.4 | percentage points of support per standard deviation of county diesel exposure | weighted linear probability model coefficient on standardized county diesel exposure, specification: plus county density; 95% interval clustered by county | all respondents in the CES 2020 sample | 2020 | 95% CI −1.1 to 0.4 | 57,411 | CES 2020 weight (weight) | Cooperative Election Study |   |
| ces_all_raw | 6.4 | percentage points of support per standard deviation of county diesel exposure | weighted linear probability model coefficient on standardized county diesel exposure, specification: no controls; 95% interval clustered by county | all respondents in the CES 2020 sample | 2020 | 95% CI 5.3 to 7.6 | 57,411 | CES 2020 weight (weight) | Cooperative Election Study |   |
| ces_counties | 2,630 | counties | count of counties with a respondent | CES 2020 respondents with an answer on the EPA enforcement item, a seven-point party ID and a county in the tract sample | 2020 |   |   | none (count) | Cooperative Election Study |   |
| ces_dem_ctrl | 0.2 | percentage points of support per standard deviation of county diesel exposure | weighted linear probability model coefficient on standardized county diesel exposure, specification: party id and demographics; 95% interval clustered by county | democrats in the CES 2020 sample | 2020 | 95% CI −0.6 to 1.0 | 28,671 | CES 2020 weight (weight) | Cooperative Election Study |   |
| ces_dem_raw | 0.0 | percentage points of support per standard deviation of county diesel exposure | weighted linear probability model coefficient on standardized county diesel exposure, specification: no controls; 95% interval clustered by county | democrats in the CES 2020 sample | 2020 | 95% CI −0.8 to 0.8 | 28,671 | CES 2020 weight (weight) | Cooperative Election Study |   |
| ces_diesel_sd | 0.12 | micrograms per cubic meter of diesel particulate matter | survey-weighted standard deviation of county diesel exposure across respondents | CES 2020 respondents with an answer on the EPA enforcement item, a seven-point party ID and a county in the tract sample | 2020 |   |   | CES 2020 weight (weight) | Cooperative Election Study |   |
| ces_n | 57,411 | respondents | count of respondents | CES 2020 respondents with an answer on the EPA enforcement item, a seven-point party ID and a county in the tract sample | 2020 |   |   | none (count) | Cooperative Election Study |   |
| ces_q1_dem | 32.3% | percent Democratic (party ID 1 to 3) | weighted share; 95% interval clustered by county | CES respondents in the lowest fifth of county diesel exposure | 2020 | 95% CI 30.9% to 33.7% | 11,483 | CES 2020 weight (weight) | Cooperative Election Study |   |
| ces_q1_support | 51.2% | percent supporting stronger EPA enforcement of the Clean Air Act and Clean Water Act, even if it costs U.S. jobs | weighted share; 95% interval clustered by county | CES respondents in the lowest fifth of county diesel exposure | 2020 | 95% CI 49.8% to 52.7% | 11,483 | CES 2020 weight (weight) | Cooperative Election Study |   |
| ces_q5_counties | 54 | counties | count of counties with a respondent in the group | CES respondents in the highest fifth of county diesel exposure | 2020 |   |   | none (count) | Cooperative Election Study |   |
| ces_q5_dem | 59.0% | percent Democratic (party ID 1 to 3) | weighted share; 95% interval clustered by county | CES respondents in the highest fifth of county diesel exposure | 2020 | 95% CI 56.0% to 62.0% | 11,482 | CES 2020 weight (weight) | Cooperative Election Study |   |
| ces_q5_support | 69.5% | percent supporting stronger EPA enforcement of the Clean Air Act and Clean Water Act, even if it costs U.S. jobs | weighted share; 95% interval clustered by county | CES respondents in the highest fifth of county diesel exposure | 2020 | 95% CI 67.2% to 71.8% | 11,482 | CES 2020 weight (weight) | Cooperative Election Study |   |
| ces_rep_ctrl | 3.0 | percentage points of support per standard deviation of county diesel exposure | weighted linear probability model coefficient on standardized county diesel exposure, specification: party id and demographics; 95% interval clustered by county | republicans in the CES 2020 sample | 2020 | 95% CI 1.2 to 4.8 | 20,097 | CES 2020 weight (weight) | Cooperative Election Study |   |
| ces_rep_dens | 1.0 | percentage points of support per standard deviation of county diesel exposure | weighted linear probability model coefficient on standardized county diesel exposure, specification: plus county density; 95% interval clustered by county | republicans in the CES 2020 sample | 2020 | 95% CI −1.4 to 3.4 | 20,097 | CES 2020 weight (weight) | Cooperative Election Study |   |
| ces_rep_raw | 4.3 | percentage points of support per standard deviation of county diesel exposure | weighted linear probability model coefficient on standardized county diesel exposure, specification: no controls; 95% interval clustered by county | republicans in the CES 2020 sample | 2020 | 95% CI 2.4 to 6.2 | 20,097 | CES 2020 weight (weight) | Cooperative Election Study |   |
| ces_support | 59.7% | percent supporting stronger EPA enforcement of the Clean Air Act and Clean Water Act, even if it costs U.S. jobs | weighted share; 95% interval clustered by county | CES 2020 respondents with an answer on the EPA enforcement item, a seven-point party ID and a county in the tract sample | 2020 | 95% CI 58.5% to 60.8% | 57,411 | CES 2020 weight (weight) | Cooperative Election Study |   |
| ces_support_dem | 86.1% | percent supporting stronger EPA enforcement of the Clean Air Act and Clean Water Act, even if it costs U.S. jobs | weighted share; 95% interval clustered by county | Democratic respondents (seven-point party ID, leaners included) | 2020 | 95% CI 85.3% to 86.9% | 28,671 | CES 2020 weight (weight) | Cooperative Election Study |   |
| ces_support_ind | 59.7% | percent supporting stronger EPA enforcement of the Clean Air Act and Clean Water Act, even if it costs U.S. jobs | weighted share; 95% interval clustered by county | Independent respondents (seven-point party ID, leaners included) | 2020 | 95% CI 58.0% to 61.4% | 8,643 | CES 2020 weight (weight) | Cooperative Election Study |   |
| ces_support_rep | 30.6% | percent supporting stronger EPA enforcement of the Clean Air Act and Clean Water Act, even if it costs U.S. jobs | weighted share; 95% interval clustered by county | Republican respondents (seven-point party ID, leaners included) | 2020 | 95% CI 29.5% to 31.7% | 20,097 | CES 2020 weight (weight) | Cooperative Election Study |   |
| college_at_peak | 41% | percent (share of adults with a college degree) | vote-weighted mean of the tract share of adults with a college degree, in the decile where mean income peaks | census tracts in decile 6 of diesel exposure | 2020 votes; ACS tract shares |   | 8,113 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies |   |
| college_d10 | 42% | percent (share of adults with a college degree) | vote-weighted mean of the tract share of adults with a college degree | census tracts in decile 10 of diesel exposure | 2020 votes; ACS tract shares |   | 8,114 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies |   |
| density_d1 | 14 | people per square kilometer | median across tracts in the decile | census tracts in decile 1 of diesel exposure | 2020 votes; ACS tract population and land area |   | 8,114 | none (each tract counts once) | Precinct votes on census geographies |   |
| density_d10 | 5,167 | people per square kilometer | median across tracts in the decile | census tracts in decile 10 of diesel exposure | 2020 votes; ACS tract population and land area |   | 8,114 | none (each tract counts once) | Precinct votes on census geographies |   |
| diesel_cap | 0.6 | micrograms per cubic meter of diesel particulate matter | the diesel view of the county map stops its color scale at this value | counties on the map | 2020 presidential election; EJScreen 2.3 air data for 2020 |   |   | none (constant) | EJScreen |   |
| diesel_ctrl | 10.3 | percentage points of Democratic two-party margin per standard deviation of the exposure | weighted least squares coefficient on the standardized diesel particulate matter exposure, with race, income and education held fixed; 95% interval clustered by county | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI 8.1 to 12.6 | 81,134 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies |   |
| diesel_ctrl_kept | 42% | percent of the no-controls diesel coefficient | ratio of the diesel coefficient with race, income and education held fixed to the diesel coefficient with no controls (ratio of point estimates); 95% interval from a county bootstrap (2,000 replicates) | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI 36% to 48% | 81,134 | none (ratio of estimates) | Precinct votes on census geographies |   |
| diesel_dens | 4.9 | percentage points of Democratic two-party margin per standard deviation of the exposure | weighted least squares coefficient on the standardized diesel particulate matter exposure, with race, income, education and density held fixed; 95% interval clustered by county | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI 2.6 to 7.2 | 81,134 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies |   |
| diesel_dens20 | 3.4 | percentage points of Democratic two-party margin per standard deviation of the exposure | diesel coefficient with race, income and education held fixed and density entered as 20 equal-size bins instead of a log term; 95% interval clustered by county | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI 1.1 to 5.8 | 81,134 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies |   |
| diesel_dens_kept | 20% | percent of the no-controls diesel coefficient | ratio of the diesel coefficient with race, income, education and density held fixed to the diesel coefficient with no controls (ratio of point estimates); 95% interval from a county bootstrap (2,000 replicates) | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI 12% to 27% | 81,134 | none (ratio of estimates) | Precinct votes on census geographies |   |
| diesel_dens_state | 4.9 | percentage points of Democratic two-party margin per standard deviation of the exposure | same coefficient as diesel with race, income, education and density held fixed, with the interval clustered by state (47 clusters) | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI 0.2 to 9.6 | 81,134 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies |   |
| diesel_fe | 7.1 | percentage points of Democratic two-party margin per standard deviation of the exposure | weighted least squares coefficient on the standardized diesel particulate matter exposure, within county, with race, income, education and density held fixed; 95% interval clustered by county | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI 5.3 to 8.9 | 81,134 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies |   |
| diesel_med_d5 | 0.14 | micrograms per cubic meter of diesel particulate matter | median across tracts in the decile | census tracts in decile 5 of diesel exposure | EJScreen 2.3, 2020 modeled air data |   | 8,113 | none (each tract counts once) | EJScreen |   |
| diesel_raw | 24.8 | percentage points of Democratic two-party margin per standard deviation of the exposure | weighted least squares coefficient on the standardized diesel particulate matter exposure, with no controls; 95% interval clustered by county | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI 21.5 to 28.0 | 81,134 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies |   |
| diesel_sd | 0.14 | micrograms per cubic meter of diesel particulate matter | standard deviation across tracts (unweighted) | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | EJScreen 2.3, 2020 modeled air data |   |   | none (each tract counts once) | EJScreen |   |
| diesel_top5_hi | 0.75 | micrograms per cubic meter of diesel particulate matter | highest county mean of tract diesel exposure (vote-weighted) | counties with at least one tract in the sample | 2020 presidential election; EJScreen 2.3 air data for 2020 |   |   | votes cast in the county, 2020 presidential election | EJScreen |   |
| diesel_top5_lo | 0.56 | micrograms per cubic meter of diesel particulate matter | fifth-highest county mean of tract diesel exposure (vote-weighted) | counties with at least one tract in the sample | 2020 presidential election; EJScreen 2.3 air data for 2020 |   |   | votes cast in the county, 2020 presidential election | EJScreen |   |
| ejscreen_version | 2.3 | EJScreen version number | version of the tool, identified from the indicators and values in the atlas | the EPA EJScreen release identified in the tract atlas | released July 2024 |   |   | none (identifier) | EJScreen |   |
| fe_diff_diesel | +2.2 | percentage points of Democratic two-party margin per standard deviation of the exposure | within-county coefficient on the standardized diesel exposure minus the pooled coefficient with race, income, education and density; 95% interval from a county bootstrap (2,000 replicates) | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI −0.4 to 5.3 | 81,134 | none (difference of two weighted least squares coefficients) | Precinct votes on census geographies |   |
| fe_diff_no2 | +2.8 | percentage points of Democratic two-party margin per standard deviation of the exposure | within-county coefficient on the standardized nitrogen dioxide exposure minus the pooled coefficient with race, income, education and density; 95% interval from a county bootstrap (2,000 replicates) | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI 0.5 to 5.3 | 81,134 | none (difference of two weighted least squares coefficients) | Precinct votes on census geographies |   |
| fe_diff_traffic | −2.1 | percentage points of Democratic two-party margin per standard deviation of the exposure | within-county coefficient on the standardized traffic proximity exposure minus the pooled coefficient with race, income, education and density; 95% interval from a county bootstrap (2,000 replicates) | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI −4.4 to −0.1 | 81,134 | none (difference of two weighted least squares coefficients) | Precinct votes on census geographies |   |
| hispanic_d1 | 9% | percent (share of residents who are Hispanic) | vote-weighted mean of the tract share of residents who are Hispanic | census tracts in decile 1 of diesel exposure | 2020 votes; ACS tract shares |   | 8,114 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies |   |
| hispanic_d10 | 33% | percent (share of residents who are Hispanic) | vote-weighted mean of the tract share of residents who are Hispanic | census tracts in decile 10 of diesel exposure | 2020 votes; ACS tract shares |   | 8,114 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies |   |
| income_d1 | $70,000 | dollars (median household income of the tract, rounded to the nearest thousand) | vote-weighted mean of tract median household income | census tracts in decile 1 of diesel exposure | 2020 votes; ACS tract incomes |   | 8,114 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies | The display is rounded to the nearest thousand dollars; the stored value is exact. |
| income_d10 | $97,000 | dollars (median household income of the tract, rounded to the nearest thousand) | vote-weighted mean of tract median household income | census tracts in decile 10 of diesel exposure | 2020 votes; ACS tract incomes |   | 8,114 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies | The display is rounded to the nearest thousand dollars; the stored value is exact. |
| income_peak | $102,000 | dollars (median household income of the tract, rounded to the nearest thousand) | highest decile mean of tract median household income (vote-weighted) | census tracts in decile 6 of diesel exposure | 2020 votes; ACS tract incomes |   | 8,113 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies | The display is rounded to the nearest thousand dollars; the stored value is exact. |
| income_peak_decile | 6 | decile of diesel exposure | decile with the highest vote-weighted mean tract income | census tracts | 2020 votes; ACS tract incomes |   |   | none (identifier) | Precinct votes on census geographies |   |
| joint_diesel | 1.3 | percentage points of Democratic two-party margin per standard deviation of the exposure | coefficient on standardized diesel in one model with diesel, traffic, nitrogen dioxide and fine particles together, plus race, income, education and density; 95% interval clustered by county | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI −2.1 to 4.6 | 81,134 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies |   |
| joint_traffic | 8.7 | percentage points of Democratic two-party margin per standard deviation of the exposure | coefficient on standardized traffic in one model with diesel, traffic, nitrogen dioxide and fine particles together, plus race, income, education and density; 95% interval clustered by county | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI 5.6 to 11.7 | 81,134 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies |   |
| map_cap | 40 | percentage points | the county map colors stop at this distance from zero | counties on the map | 2020 presidential election; EJScreen 2.3 air data for 2020 |   |   | none (constant) | Precinct votes on census geographies |   |
| map_northeast | +14.5 | percentage points of Democratic two-party margin | mean over counties, weighted by county votes, of the residual margin net of race, income and education (a positive value is more Democratic than the model predicts) | counties of the Northeast census region in the sample | 2020 presidential election; EJScreen 2.3 air data for 2020 |   | 209 | votes cast in the county, 2020 presidential election | Precinct votes on census geographies |   |
| map_south | −15.9 | percentage points of Democratic two-party margin | mean over counties, weighted by county votes, of the residual margin net of race, income and education (a positive value is more Democratic than the model predicts) | counties of the South census region in the sample | 2020 presidential election; EJScreen 2.3 air data for 2020 |   | 1,419 | votes cast in the county, 2020 presidential election | Precinct votes on census geographies |   |
| margin_d1 | −29.8 | percentage points of Democratic two-party margin | vote-weighted mean tract margin; 95% interval clustered by county | census tracts in decile 1 of diesel exposure | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI −32.2 to −27.4 | 8,114 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies |   |
| margin_d10 | +49.1 | percentage points of Democratic two-party margin | vote-weighted mean tract margin; 95% interval clustered by county | census tracts in decile 10 of diesel exposure | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI 42.4 to 55.8 | 8,114 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies |   |
| margin_d5 | +1.4 | percentage points of Democratic two-party margin | vote-weighted mean tract margin; 95% interval clustered by county | census tracts in decile 5 of diesel exposure | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI −1.8 to 4.7 | 8,113 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies |   |
| margin_gap | 78.9 | percentage points of Democratic two-party margin | difference in vote-weighted mean margin, top decile minus bottom decile; 95% interval clustered by county | census tracts in the top and bottom decile of diesel exposure | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI 71.8 to 86.1 | 16,228 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies |   |
| n_atlas_tracts | 82,765 | census tracts | count of tracts | tracts in the 2020 tract atlas | 2020 presidential election |   |   | none (count) | Precinct votes on census geographies |   |
| n_counties_d1 | 1,824 | counties | count of counties with at least one tract in the decile | census tracts in decile 1 of diesel exposure | 2020 presidential election; EJScreen 2.3 air data for 2020 |   |   | none (count) | Precinct votes on census geographies |   |
| n_counties_d10 | 112 | counties | count of counties with at least one tract in the decile | census tracts in decile 10 of diesel exposure | 2020 presidential election; EJScreen 2.3 air data for 2020 |   |   | none (count) | Precinct votes on census geographies |   |
| n_counties_sample | 3,096 | counties | count of counties | counties with at least one tract in the sample | 2020 presidential election; EJScreen 2.3 air data for 2020 |   |   | none (count) | Precinct votes on census geographies |   |
| n_density_bins | 20 | bins | number of equal-size bins of log density that replace the log term in the robustness model | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | 2020 presidential election; EJScreen 2.3 air data for 2020 |   |   | none (constant) | Precinct votes on census geographies |   |
| n_over100 | 81,617 | census tracts | count of tracts | tracts in the atlas with more than 100 estimated votes | 2020 presidential election; EJScreen 2.3 air data for 2020 |   |   | none (count) | Precinct votes on census geographies |   |
| n_over_clamp | 343 | counties | count of counties whose residual margin net of race, income and education is more than 40 points from zero | counties with at least one tract in the sample | 2020 presidential election; EJScreen 2.3 air data for 2020 |   |   | none (count) | Precinct votes on census geographies |   |
| n_over_diesel_cap | 3 | counties | count of counties whose vote-weighted mean tract diesel exposure is above the map cap | counties with at least one tract in the sample | 2020 presidential election; EJScreen 2.3 air data for 2020 |   |   | none (count) | EJScreen |   |
| n_per_decile | 8,113 or 8,114 | census tracts per decile of diesel exposure | count of tracts in each decile (deciles are cut on the rank of exposure, so the counts differ by at most one) | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | 2020 presidential election; EJScreen 2.3 air data for 2020 |   |   | none (count) | Precinct votes on census geographies |   |
| n_states | 47 | states | count of states | states with at least one tract in the sample | 2020 presidential election; EJScreen 2.3 air data for 2020 |   |   | none (count) | Precinct votes on census geographies |   |
| n_tracts | 81,134 | census tracts | count of tracts | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | 2020 presidential election; EJScreen 2.3 air data for 2020 |   |   | none (count) | Precinct votes on census geographies |   |
| no2_ctrl | 10.1 | percentage points of Democratic two-party margin per standard deviation of the exposure | weighted least squares coefficient on the standardized nitrogen dioxide exposure, with race, income and education held fixed; 95% interval clustered by county | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI 8.3 to 11.9 | 81,134 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies |   |
| no2_dens | 3.6 | percentage points of Democratic two-party margin per standard deviation of the exposure | weighted least squares coefficient on the standardized nitrogen dioxide exposure, with race, income, education and density held fixed; 95% interval clustered by county | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI 1.5 to 5.8 | 81,134 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies |   |
| no2_fe | 6.5 | percentage points of Democratic two-party margin per standard deviation of the exposure | weighted least squares coefficient on the standardized nitrogen dioxide exposure, within county, with race, income, education and density held fixed; 95% interval clustered by county | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI 5.2 to 7.8 | 81,134 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies |   |
| no2_raw | 24.3 | percentage points of Democratic two-party margin per standard deviation of the exposure | weighted least squares coefficient on the standardized nitrogen dioxide exposure, with no controls; 95% interval clustered by county | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI 22.3 to 26.3 | 81,134 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies |   |
| no2_sd | 3.5 | parts per billion of nitrogen dioxide | standard deviation across tracts (unweighted) | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | EJScreen 2.3, 2020 modeled air data |   |   | none (each tract counts once) | EJScreen |   |
| pm25_ctrl | 0.9 | percentage points of Democratic two-party margin per standard deviation of the exposure | weighted least squares coefficient on the standardized fine particles (pm2.5) exposure, with race, income and education held fixed; 95% interval clustered by county | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI −1.4 to 3.1 | 81,134 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies |   |
| pm25_dens | −0.7 | percentage points of Democratic two-party margin per standard deviation of the exposure | weighted least squares coefficient on the standardized fine particles (pm2.5) exposure, with race, income, education and density held fixed; 95% interval clustered by county | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI −2.8 to 1.4 | 81,134 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies |   |
| pm25_raw | 8.8 | percentage points of Democratic two-party margin per standard deviation of the exposure | weighted least squares coefficient on the standardized fine particles (pm2.5) exposure, with no controls; 95% interval clustered by county | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI 5.3 to 12.2 | 81,134 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies |   |
| pm25_sd | 2.1 | micrograms per cubic meter of fine particles | standard deviation across tracts (unweighted) | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | EJScreen 2.3, 2020 modeled air data |   |   | none (each tract counts once) | EJScreen |   |
| r_county_lean_demog | +0.26 | correlation coefficient, from −1 to +1 | correlation across counties, weighted by county votes, of county diesel exposure with the county mean residual margin after a tract model of race, income and education; 95% interval from a county bootstrap (2,000 replicates) | counties with at least one tract in the sample | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI 0.17 to 0.34 | 3,096 | votes cast in the county, 2020 presidential election | Precinct votes on census geographies |   |
| r_county_lean_demog_state | +0.18 | correlation coefficient, from −1 to +1 | correlation across counties, weighted by county votes, of county diesel exposure with the county mean residual margin after a tract model of race, income and education, both measured from their vote-weighted state means (within-state); 95% interval from resampling the 47 states (2,000 replicates) | counties with at least one tract in the sample | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI 0.01 to 0.41 | 3,096 | votes cast in the county, 2020 presidential election | Precinct votes on census geographies |   |
| r_county_lean_demog_unw | +0.27 | correlation coefficient, from −1 to +1 | unweighted correlation across counties (each county counts once) of county diesel exposure with the county mean residual margin after a tract model of race, income and education; 95% interval from a county bootstrap (2,000 replicates) | counties with at least one tract in the sample | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI 0.25 to 0.30 | 3,096 | none (each county counts once) | Precinct votes on census geographies |   |
| r_county_lean_dens | +0.08 | correlation coefficient, from −1 to +1 | correlation across counties, weighted by county votes, of county diesel exposure with the county mean residual margin after a tract model of race, income, education and density; 95% interval from a county bootstrap (2,000 replicates) | counties with at least one tract in the sample | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI −0.02 to 0.17 | 3,096 | votes cast in the county, 2020 presidential election | Precinct votes on census geographies |   |
| r_county_lean_dens_state | −0.07 | correlation coefficient, from −1 to +1 | correlation across counties, weighted by county votes, of county diesel exposure with the county mean residual margin after a tract model of race, income, education and density, both measured from their vote-weighted state means (within-state); 95% interval from resampling the 47 states (2,000 replicates) | counties with at least one tract in the sample | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI −0.21 to 0.16 | 3,096 | votes cast in the county, 2020 presidential election | Precinct votes on census geographies |   |
| r_county_lean_dens_unw | −0.06 | correlation coefficient, from −1 to +1 | unweighted correlation across counties (each county counts once) of county diesel exposure with the county mean residual margin after a tract model of race, income, education and density; 95% interval from a county bootstrap (2,000 replicates) | counties with at least one tract in the sample | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI −0.09 to −0.03 | 3,096 | none (each county counts once) | Precinct votes on census geographies |   |
| r_diesel_density | +0.68 | correlation coefficient, from −1 to +1 | vote-weighted correlation across tracts of diesel exposure with log population density; 95% interval from a county bootstrap (2,000 replicates) | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | EJScreen 2.3, 2020 modeled air data; ACS population | 95% CI 0.66 to 0.71 | 81,134 | votes cast in the tract, 2020 presidential election (pres_tot) | EJScreen |   |
| r_diesel_no2 | +0.72 | correlation coefficient, from −1 to +1 | vote-weighted correlation across tracts of diesel exposure with nitrogen dioxide; 95% interval from a county bootstrap (2,000 replicates) | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | EJScreen 2.3, 2020 modeled air data | 95% CI 0.66 to 0.76 | 81,134 | votes cast in the tract, 2020 presidential election (pres_tot) | EJScreen |   |
| r_diesel_traffic | +0.68 | correlation coefficient, from −1 to +1 | vote-weighted correlation across tracts of diesel exposure with traffic proximity; 95% interval from a county bootstrap (2,000 replicates) | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | EJScreen 2.3, 2020 modeled air data | 95% CI 0.58 to 0.77 | 81,134 | votes cast in the tract, 2020 presidential election (pres_tot) | EJScreen |   |
| resid_between_state | 61% | percent of the vote-weighted variance of the county residual margin | share of the vote-weighted variance of the county residual margin (net of race, income and education) that lies between states: one minus the ratio of the within-state variance to the total variance | counties with at least one tract in the sample | 2020 presidential election; EJScreen 2.3 air data for 2020 |   | 3,096 | votes cast in the county, 2020 presidential election | Precinct votes on census geographies | A descriptive ratio of variances with no interval. |
| traffic_ctrl | 12.2 | percentage points of Democratic two-party margin per standard deviation of the exposure | weighted least squares coefficient on the standardized traffic proximity exposure, with race, income and education held fixed; 95% interval clustered by county | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI 9.0 to 15.3 | 81,134 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies |   |
| traffic_dens | 8.7 | percentage points of Democratic two-party margin per standard deviation of the exposure | weighted least squares coefficient on the standardized traffic proximity exposure, with race, income, education and density held fixed; 95% interval clustered by county | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI 6.1 to 11.3 | 81,134 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies |   |
| traffic_fe | 6.6 | percentage points of Democratic two-party margin per standard deviation of the exposure | weighted least squares coefficient on the standardized traffic proximity exposure, within county, with race, income, education and density held fixed; 95% interval clustered by county | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI 4.6 to 8.6 | 81,134 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies |   |
| traffic_raw | 24.7 | percentage points of Democratic two-party margin per standard deviation of the exposure | weighted least squares coefficient on the standardized traffic proximity exposure, with no controls; 95% interval clustered by county | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | 2020 presidential election; EJScreen 2.3 air data for 2020 | 95% CI 19.2 to 30.2 | 81,134 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies |   |
| traffic_sd | 2.4 million | traffic proximity score (annual average daily traffic on major roads divided by distance) | standard deviation across tracts (unweighted) | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | EJScreen 2.3, 2020 highway counts |   |   | none (each tract counts once) | EJScreen |   |
| vote_floor | 100 | votes | a tract is kept when its estimated presidential votes exceed this number | census tracts | 2020 presidential election; EJScreen 2.3 air data for 2020 |   |   | none (constant) | Precinct votes on census geographies |   |
| votes_m | 155.1 million | votes | sum of tract presidential votes in the sample | census tracts with more than 100 votes in 2020 and complete pollution, control and land-area data | 2020 presidential election; EJScreen 2.3 air data for 2020 |   |   | none (sum of votes) | Precinct votes on census geographies |   |
| white_d1 | 79% | percent (share of residents who are white alone) | vote-weighted mean of the tract share of residents who are white alone | census tracts in decile 1 of diesel exposure | 2020 votes; ACS tract shares |   | 8,114 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies |   |
| white_d10 | 36% | percent (share of residents who are white alone) | vote-weighted mean of the tract share of residents who are white alone | census tracts in decile 10 of diesel exposure | 2020 votes; ACS tract shares |   | 8,114 | votes cast in the tract, 2020 presidential election (pres_tot) | Precinct votes on census geographies |   |

## Definitions

- Census tract: A Census Bureau neighborhood area, usually home to between 1,200 and 8,000 people. Tract boundaries were redrawn after the 2010 census and again after 2020.
- Percentage point: The unit for the difference between two percentages. A change from one share to another is stated in points, not in percent, so that absolute and relative change are not confused.
- Standard deviation: A measure of how far values typically fall from their average. A larger standard deviation means the values are more spread out.
- EJSCREEN: The Environmental Protection Agency's environmental justice screening tool. It combines pollution and hazard measures, such as fine particles and diesel exhaust, with the demographics of each neighborhood.
- Area Deprivation Index: A ranking of neighborhoods built from income, education, employment and housing measures in the American Community Survey. Higher ranks mean more deprived neighborhoods.
- Clustered standard errors: Standard errors that allow answers within the same group, such as the same county or the same week, to be related. They are wider than ordinary errors when members of a group resemble each other.
- Correlation: A number from minus 1 to plus 1 for how closely two measures move together in a straight-line pattern. Zero means no straight-line pattern; a correlation does not say that one measure causes the other.
- Fixed effects: Regression terms that give each group, such as each country or each year, its own baseline. The other coefficients then compare respondents within the same group.
- Linear probability model: A regression of a yes-or-no outcome on predictors, fitted by least squares so that each coefficient is a change in the probability of yes. The book weights it and reports robust standard errors.
- Survey weights: Numbers that scale each respondent so the sample matches the population on known traits such as age, race, education and region. A weighted average counts a respondent with a large weight for more than one with a small weight.
- Ecological inference: Drawing a conclusion about individuals from data on groups or places, such as counties. A pattern across counties can differ from the pattern among the people who live in them.

## Methods

Sample: census tracts in the tract atlas (82,765 tracts in 47 states and the District of Columbia; Alaska and Hawaii have no tract vote estimates, and the tract atlas has no rows for Connecticut) with more than 100 estimated presidential votes in 2020, a two-party margin, all four pollution measures, the five controls and a land area above zero: 81,134 tracts in 47 states and 3,096 counties, carrying 155.1 million votes. The District of Columbia drops out because the atlas has no white share for its tracts. Vote: precinct returns allocated to 2020 tracts by Regionalized Land Cover Regression (Fekrazad 2025), fractional votes; margin = 100 (D minus R) over (D plus R). Pollution: tract values of EPA EJScreen version 2.3 (July 2024) in the atlas: diesel particulate matter (micrograms per cubic meter; 2020 AirToxScreen), traffic proximity (annual average daily traffic on major roads within 10 kilometers divided by distance; 2020 highway counts), nitrogen dioxide (parts per billion; NASA satellite model, 2020) and fine particles (micrograms per cubic meter; 2020). EPA removed EJScreen from its website on 5 February 2025. The atlas does not record the version or the archived copy; version 2.3 is identified from the values (the fine-particle range and the nitrogen dioxide maximum match the 2.3 documentation, and the median diesel value is close to the documented median, which is a block-group value while the atlas holds tract values, so the atlas diesel range is narrower than the documented one). Controls: white, Black and Hispanic shares of residents, college share and median household income are American Community Survey tract values; the atlas does not record the survey years. Estimands: the vote-weighted mean margin by decile of diesel exposure (equal numbers of tracts); the coefficient of the margin on each exposure standardized with the unweighted standard deviation across tracts; the share of the raw diesel coefficient that remains after controls (a ratio of point estimates); the within-county coefficient minus the pooled coefficient with density; and, across counties, the correlation of county diesel exposure with the county residual margin (the tract margin minus the margin predicted by a weighted least squares model with no pollution term, on the demographic controls alone or with log density added, averaged over the county's tracts by votes). Weights: tract presidential votes. Estimator: weighted least squares; controls are the shares of white, Black and Hispanic residents, the college share and median household income; density is the log of people per square kilometer; the within-county estimate removes the vote-weighted county mean from every variable before fitting. Interval method: 95%, clustered by county (3,096 clusters); the retained shares and the within-county differences use a county bootstrap (2,000 replicates, seed 12345, the same resampled counties for every model); correlations across tracts and counties use a county bootstrap (2,000 replicates, seed 12345); county correlations are reported weighted by county votes and unweighted, because the weighting decides the sign of the density-adjusted one; within-state correlations (county diesel exposure and the county residual margin each measured from its vote-weighted state mean, correlated with county votes as weights) and the binned means of the county residual margin over tenths of counties ordered by diesel exposure (weighted by county votes, or counting each county once) resample the 47 states (2,000 replicates, seed 12345); the share of the variance of the county residual margin that lies between states is one minus the ratio of the vote-weighted within-state variance to the total variance and has no interval; the state-clustered interval on the diesel coefficient uses 47 clusters. Intervals are model based and do not include error in the vote allocation or in the modeled pollution. The atlas does not record how EJScreen block-group values were turned into tract values (diesel and fine particles are tract values in the source). Deprivation: Area Deprivation Index national rank. Asthma: CDC PLACES current asthma among adults, a model-based estimate that cannot vary with local air (its inputs are demographic and geographic). The release years of the ADI and PLACES values are not recorded in the atlas. CES: 2020 wave, respondents with an answer on the item on strengthening EPA enforcement of the Clean Air Act and Clean Water Act even if it costs U.S. jobs (support_epa_airwater, from the source item enviro_airwateracts, coded 1 for support), a seven-point party ID and a county in the tract sample (57,411 respondents in 2,630 counties); weighted least squares on a 0 or 100 outcome with the survey weight; county exposure is the vote-weighted county mean of tract diesel exposure. Suppression: tracts with 100 or fewer votes are dropped; no survey cell rests on fewer than 30 respondents; tract deciles and county values are full counts of tracts and counties.

## What these data cannot show

- The estimates describe places in one election.
- They do not say how the residents of a tract voted, because a pattern across areas can differ from the pattern among the people in them [6] (ecological inference).
- The vote in each tract is an allocation of precinct returns by a land-cover model and each pollution value is modeled, so the estimates carry errors that the intervals leave out.
- The exposures and the vote are both from 2020, so the data cannot say whether pollution changes how people vote, whether people who vote a certain way settle near sources, or whether the siting of sources follows political power, a claim the environmental justice literature makes [7].
- Holding traits fixed is partial.
- The controls come from the American Community Survey and carry sampling error, and density enters as one summary of urban form.
- The four exposures move together, so the data cannot say which one the coefficients reflect, and the county residual varies strongly between states, so a correlation across counties can reflect regional differences that the data cannot separate from exposure.
- Coverage is 47 states, because Alaska, Hawaii and Connecticut have no tract vote estimates and the District of Columbia lacks the white share that the controls need.
- The survey comparison assigns a county exposure to each respondent and cannot see how much air pollution a respondent breathes.
- The vote is the presidential margin in one election, so the data say nothing about turnout, down-ballot races or votes on local environmental measures.
- They hold no local political context, so they cannot say why tracts with more exposure vote as they do.

## References

1. Fekrazad, Amir (2025). A dataset of US precinct votes allocated to Census geographies with precision. Scientific Data 12: 794. https://doi.org/10.1038/s41597-025-05140-3
2. US Environmental Protection Agency (2024). EJScreen Technical Documentation for Version 2.3 (revised July 31, 2024). Office of Environmental Justice and External Civil Rights, Washington, DC. https://epa.gov/system/files/documents/2024-07/ejscreen-tech-doc-version-2-3.pdf
3. Kind, Amy J. H.; Buckingham, William R. (2018). Making Neighborhood-Disadvantage Metrics Accessible: The Neighborhood Atlas. New England Journal of Medicine 378: 2456-2458. https://doi.org/10.1056/NEJMp1802313
4. Rodden, Jonathan A. (2019). Why Cities Lose: The Deep Roots of the Urban-Rural Political Divide. Basic Books, New York.
5. Greenlund, Kurt J.; Lu, Hua; Wang, Yan; Matthews, Kevin A.; LeClercq, Jennifer M.; Lee, Benjamin; Carlson, Susan A. (2022). PLACES: Local Data for Better Health. Preventing Chronic Disease 19: 210459. https://doi.org/10.5888/pcd19.210459
6. Robinson, W. S. (1950). Ecological Correlations and the Behavior of Individuals. American Sociological Review 15(3): 351-357.
7. Mohai, Paul; Pellow, David; Roberts, J. Timmons (2009). Environmental Justice. Annual Review of Environment and Resources 34: 405-430. https://doi.org/10.1146/annurev-environ-082508-094348

## Provenance

- Pipeline version: 1.0.0
- Build script: book3/chapters/air-pollution-and-the-vote/build.py (sha256 6f9cb6aec32ee2fc9148cca85e30d7d7269fc59b148880b3f1059f207df0fd91)
- Built on: 2026-09-30
- Site commit: 16414b2c7257546a7042d0b1734657f208999f60

Inputs:

| File | Size (bytes) | SHA-256, first 1 MB | SHA-256, last 1 MB |
| --- | ---: | --- | --- |
| data/cces/cces_clean.parquet | 53,454,868 | 9430e88b3196c9ca2250bdda1908d3920e80e276ca0c529c514e2fc2bdd00806 | f61097c727c38fd8d7c8e53fe86935fb626f351a64d99ccb1ae0b56715b2c405 |
| data/precinct/census_estimates/tract_2020_atlas.parquet | 41,025,289 | 8cd40801ba81ac3d5870313f9e8772790afe7917f983dd24c15efc8719651ab8 | 01b796cc4b00f21457d93c96df76db6edfde80c66e1844919fb7510aecd5efe9 |

Outputs:

| File | SHA-256 |
| --- | --- |
| facts.json | 6f6016baa866fcd31da0491d97d2aa4ff979cf2f1a6eb9f958c7c192073fc069 |
| figures/ces_within_party.json | 20f0f70c46faeb299510e5a7013d27dbee626b0d55b93fc8a859de2ee63b4a0e |
| figures/county_diesel_scatter.json | fb6ea648c95660aa0d6d9cc810989011df1a051b286cb2c1e68a7d355ec661c8 |
| figures/county_lean_map.json | 0050505b01dbb29710408d2885ddaa352c1efcb31d6f8d23cd6aa20107c82a53 |
| figures/margin_by_diesel_decile.json | ca05ef6ebb03bbac19eebeabc258dc3596149dfab7ffc8bb2ec12b6b227a9d87 |
| figures/pollutant_ladder.json | 92d41c4867d1314aa645fa224869173be5108d3303a609a175a1887d3295dcc6 |
| figures/tract_profile.json | fb909521f477e2dce17864c7e7cf12bbbd0cef49519471f0bcf73bb52f08be1e |
| meta.json | b8627707d8a3f73ad19907d67f1ce028c13dcf74036c1bd85f22c3e4fcf4d90a |
| public/data/air-pollution-and-the-vote/county_lean.json | 7f77ad9c813c5895508e875477546b9a21988aec7a95e311e0026d32df182f86 |
| refs.json | ad7cbee147ead561f4fb81033ba38cb596d598d070aec1577990f8a7e14e28d5 |

## Machine formats

- Report (HTML): https://vishalsingh.org/politics/air-pollution-and-the-vote/report
- Report (Markdown): https://vishalsingh.org/politics/air-pollution-and-the-vote/report.md
- Every estimate (JSON): https://vishalsingh.org/politics/report/air-pollution-and-the-vote/facts.json
- Table 1, figure "margin_by_diesel_decile" (JSON): https://vishalsingh.org/politics/report/air-pollution-and-the-vote/figures/margin_by_diesel_decile.json
- Table 2, figure "tract_profile" (JSON): https://vishalsingh.org/politics/report/air-pollution-and-the-vote/figures/tract_profile.json
- Table 3, figure "pollutant_ladder" (JSON): https://vishalsingh.org/politics/report/air-pollution-and-the-vote/figures/pollutant_ladder.json
- Table 4, figure "county_lean_map" (JSON): https://vishalsingh.org/politics/report/air-pollution-and-the-vote/figures/county_lean_map.json
- Table 5, figure "county_diesel_scatter" (JSON): https://vishalsingh.org/politics/report/air-pollution-and-the-vote/figures/county_diesel_scatter.json
- Table 6, figure "ces_within_party" (JSON): https://vishalsingh.org/politics/report/air-pollution-and-the-vote/figures/ces_within_party.json
- Payload of "county_lean_map" (JSON): https://vishalsingh.org/politics/data/air-pollution-and-the-vote/county_lean.json
- Index of every report: https://vishalsingh.org/politics/llms.txt; all reports in one file: https://vishalsingh.org/politics/llms-full.txt
