← All studies · askamerica.ai

Rural counties have a widening, but highly state-dependent, health disadvantage

County Health Rankings premature-death rates (YPLL/100k, ages under 75), 2003-2022, by USDA Rural-Urban Continuum Code

The rural-urban health gap has widened nationally — but its size swings wildly by state Premature death rate (YPLL per 100,000, ages <75), CHR/NCHS county trends, 2003-2022; RUCC 2023 vintage classification National nonmetro vs metro gap, 2022 +1,692 YPLL/100k +18.1% higher Unweighted county average, all counties with a reported rate Gap in 2003 vs 2022 +975 -> +1,692 +74% wider Ratio rose from 1.12x to 1.18x over 20 years Premature death rate: metro vs nonmetro counties, 2003-2022 0 2,000 4,000 6,000 8,000 10,000 12,000 Year YPLL per 100k 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 Metro counties Nonmetro counties Simple (unweighted) average YPLL rate across all counties reporting a value each year, by USDA RUCC metro/nonmetro status Within-state rural-minus-urban gap, selected states (2020-22 avg) -2,000 -1,000 0 1,000 2,000 3,000 4,000 5,000 6,000 State Gap, YPLL/100k MA WY ID OH TX LA VA CA SC SD AZ 47 states have both metro and nonmetro counties; gap ranges from -1,015 (MA, rural healthier) to +5,698 (AZ). Mean +1,580, paired… CHR Premature Death (YPLL before age 75) is a truncated mortality measure appropriate for county-comparison trends, not a full all-ages age-adjusted rate. RUCC classification is the single 2023 vintage applied across the whole 2003-2022 window. DC and states with only one RUCC category excluded from the paired state analysis. AskAmerica · askamerica.ai
SVG

Summary

Rural (nonmetro) US counties have consistently worse health than urban (metro) counties over the last twenty years, measured by premature death (years of life lost before age 75, per 100,000 people) — and the gap has been widening, not shrinking. In 2003 the average nonmetro county's rate was about 12% higher than the average metro county's (975 more YPLL/100k); by 2022 that gap had grown to 18% (1,692 more YPLL/100k), a 74% increase in the absolute gap. But the gap is not the same everywhere: within individual states it ranges from essentially reversed (rural counties in Massachusetts and Wyoming are actually somewhat healthier than their state's metro counties) to enormous (Arizona's rural counties run nearly 6,000 YPLL/100k worse than its metro counties — more than triple the national average gap). A paired test across the 47 states with both county types confirms the rural penalty is real and not just a byproduct of which states happen to have more rural land (mean gap +1,580 YPLL/100k, p<0.0001), but the size of that penalty varies almost as much across states as overall health levels do between states — so 'how much worse is rural health' has no single answer; it depends heavily on which state you're in.

Data and method

Source: County Health Rankings & Roadmaps (University of Wisconsin / RWJF) 'Premature Death' trend file, which reports Years of Potential Life Lost before age 75 per 100,000 population at the county level for 1999-2022 (this analysis uses 2003-2022, the last twenty full years available). Rural/urban status comes from the USDA Economic Research Service's Rural-Urban Continuum Code (RUCC), which is updated only once a decade (this corpus carries the 2023 vintage, applied across the full 20-year window — a modest source of noise since a handful of counties get reclassified between decennial updates, but RUCC assignment is generally stable).

Two separate computations were run, matching the two parts of the question:

  1. National trend: each year, the simple (unweighted) average premature-death rate was computed separately across all metro counties and all nonmetro counties, then compared year over year, 2003-2022.
  2. Within-state vs. between-state: for 2020-2022 (averaged to smooth annual noise), each of the 47 states with at least one metro AND one nonmetro county got its own metro average and nonmetro average; the within-state gap (nonmetro minus metro) was computed for each state and tested against zero with a one-sample t-test. This paired approach avoids the trap of a single national ratio being driven by which states happen to have more rural counties.

Excluded rows, named explicitly, with and without: every county-average query in this analysis applies the filter t.premature_death_rate IS NOT NULL, because CHR leaves a county-year's rate null (never a fabricated zero) when the underlying death count is too small to report reliably or is privacy-suppressed. In 2003 this excluded 16 of 1,179 metro counties (1.4%) and 254 of 1,950 nonmetro counties (13.0%); by 2022 the exclusion had shrunk to a small handful in both groups (CHR's small-area estimation has improved over time). We cannot compute a true 'without exclusion' headline number — a null rate cannot be averaged in either direction, and the population-weighted alternative (numerator/denominator) is unavailable for 2003 as well, since CHR did not publish a denominator that far back either (checked directly: both are null for every 2003 row). What we can and do report as the practical bound: the excluded nonmetro counties are disproportionately small-population counties, and small-population counties skew toward more extreme (both higher and lower) mortality rates precisely because their numerators are small; excluding 13% of nonmetro counties in 2003 versus a negligible share in 2022 means the 2003 nonmetro figure rests on a systematically less-complete, likely somewhat larger-population-skewed set of counties than the 2022 figure. If the excluded small rural counties in 2003 ran hotter on average (plausible, since suppression is a symptom of a small denominator that a struggling county is more likely to have), the true 2003 gap was understated here, and the 74% growth in the gap over 20 years is a conservative (understated 2003 baseline pulls the growth estimate up) to at-worst-overstated bound — not a number to treat as precise to the last percentage point, though the direction (widening) is corroborated independently by the 2020-2022 acceleration, a period with minimal suppression.

How much worse is rural health, and is the gap growing?

Nationally, unweighted across all reporting counties, the rural penalty in premature death has been persistent and growing:

Both metro and nonmetro rates rose over the period (notably a sharp jump in 2020-2022, consistent with COVID-19 and the opioid/overdose crisis both of which hit some rural areas especially hard), but nonmetro counties rose faster in both absolute and relative terms. The absolute gap grew 74% over the twenty years and the relative gap grew from a 1.12x to a 1.18x ratio.

Does the gap look the same within a state as it does between states?

No. Two different comparisons are being conflated in the question, and they behave very differently:

Within-state (paired) comparison: for each of the 47 states with both metro and nonmetro counties (DC, being a single metro-only unit with no nonmetro counties, has no rural/urban gap to compute by construction and is excluded from this specific paired test for that reason, not a data quality problem), the nonmetro-minus-metro gap in 2020-22 averaged +1,580 YPLL/100k with a standard deviation of about 1,205 — and a one-sample t-test against zero returns t=8.89, p<0.0001, confirming the rural penalty is a real, broadly consistent pattern (43 of 47 states show rural counties worse off). But the gap's own size varies enormously by state: it runs from -1,015 in Massachusetts and -543 in Wyoming (rural counties there are actually somewhat healthier than the state's urban centers, plausibly reflecting wealthy rural/exurban populations and troubled small industrial cities respectively) up to +5,698 in Arizona, +4,110 in South Dakota, +3,793 in Alaska, +3,600 in South Carolina, and +3,449 in California.

Between-state comparison: the overall level of premature death (pooling metro and nonmetro counties within each state) varies from state to state with a standard deviation of about 1,977 YPLL/100k around a mean of 9,212 — driven mostly by each state's baseline health profile (the Deep South and parts of Appalachia run persistently high; New England, the Upper Midwest, and the Mountain West/Pacific run persistently low), largely independent of rural/urban composition.

The within-state rural-penalty standard deviation (1,205) is about 61% as large as the between-state overall-level standard deviation (1,977) — meaning which state you live in, on average, still explains more variation in health outcomes than the rural/urban split alone. But the rural penalty itself is far from a fixed, portable number: its coefficient of variation across states (0.76) is more than triple the between-state CV of overall health levels (0.21). In practical terms, a policy analysis that assumes 'rural is X% worse than urban' as a single national constant will be badly wrong for many individual states — sometimes even wrong in direction.

Caveats

Every query behind this report

11 warehouse calls ran in this session, in order. Each is reproducible against the same snapshot.

query — 24 rows — 5010 ms
SELECT DISTINCT period_end_year FROM health.chr_premature_death_trends WHERE geo_level='county' ORDER BY period_end_year
query — 40 rows — 3950 ms

WITH ru AS (
  SELECT county_fips, metro_nonmetro FROM geo.rural_urban_continuum
)
SELECT t.period_end_year,
       ru.metro_nonmetro,
       SUM(t.premature_death_numerator) / NULLIF(SUM(t.premature_death_denominator),0) * 100000 AS pop_weighted_rate,
       AVG(t.premature_death_rate) AS simple_avg_rate,
       COUNT(*) AS n_counties
FROM health.chr_premature_death_trends t
JOIN ru ON t.fips_code = ru.county_fips
WHERE t.geo_level='county' AND t.period_end_year BETWEEN 2003 AND 2022
  AND t.premature_death_rate IS NOT NULL
GROUP BY t.period_end_year, ru.metro_nonmetro
ORDER BY t.period_end_year, ru.metro_nonmetro
query — 97 rows — 3776 ms

WITH ru AS (SELECT county_fips, metro_nonmetro FROM geo.rural_urban_continuum),
county_avg AS (
  SELECT t.state_abbr, t.fips_code, ru.metro_nonmetro,
         AVG(t.premature_death_rate) AS rate_2020_22
  FROM health.chr_premature_death_trends t
  JOIN ru ON t.fips_code = ru.county_fips
  WHERE t.geo_level='county' AND t.period_end_year BETWEEN 2020 AND 2022
    AND t.premature_death_rate IS NOT NULL
  GROUP BY t.state_abbr, t.fips_code, ru.metro_nonmetro
)
SELECT state_abbr, metro_nonmetro,
       AVG(rate_2020_22) AS avg_rate,
       COUNT(*) AS n_counties
FROM county_avg
GROUP BY state_abbr, metro_nonmetro
ORDER BY state_abbr, metro_nonmetro
query — 4 rows — 1701 ms
SELECT DISTINCT hpi_type, hpi_flavor, frequency, level FROM housing.house_price_index WHERE level='MSA' LIMIT 20
query — 1 rows — 1534 ms
SELECT min(data_year), max(data_year) FROM housing.house_price_index WHERE level='MSA'
query — 20 rows — 9863 ms

WITH ann AS (
  SELECT place_id, place_name, data_year, avg(index_nsa) AS idx
  FROM housing.house_price_index
  WHERE level='MSA' AND hpi_type='traditional' AND hpi_flavor='purchase-only' AND frequency='quarterly'
  GROUP BY place_id, place_name, data_year
),
peak AS (
  SELECT place_id, place_name, max(idx) AS peak_idx,
         (SELECT data_year FROM ann a2 WHERE a2.place_id=a.place_id AND a2.data_year BETWEEN 2004 AND 2008 ORDER BY idx DESC FETCH FIRST 1 ROW ONLY) AS peak_year
  FROM ann a WHERE data_year BETWEEN 2004 AND 2008
  GROUP BY place_id, place_name
),
trough AS (
  SELECT place_id, min(idx) AS trough_idx,
         (SELECT data_year FROM ann a2 WHERE a2.place_id=a.place_id AND a2.data_year BETWEEN 2008 AND 2013 ORDER BY idx ASC FETCH FIRST 1 ROW ONLY) AS trough_year
  FROM ann a WHERE data_year BETWEEN 2008 AND 2013
  GROUP BY place_id
),
latest AS (
  SELECT place_id, idx AS latest_idx, data_year AS latest_year
  FROM ann a
  WHERE data_year = (SELECT max(data_year) FROM ann a2 WHERE a2.place_id=a.place_id)
)
SELECT p.place_id, p.place_name, p.peak_idx, p.peak_year, t.trough_idx, t.trough_year, l.latest_idx, l.latest_year,
  round(100.0*(t.trough_idx/p.peak_idx-1),1) AS pct_decline_peak_to_trough,
  round(100.0*(l.latest_idx/p.peak_idx-1),1) AS pct_change_peak_to_latest
FROM peak p JOIN trough t ON p.place_id=t.place_id JOIN latest l ON p.place_id=l.place_id
ORDER BY pct_decline_peak_to_trough ASC
FETCH FIRST 20 ROWS ONLY
adjust_inflation — 39325 ms
SELECT * FROM (VALUES (2004),(2005),(2006),(2007)) AS t(yr)
query — 47 rows — 9942 ms

WITH ru AS (SELECT county_fips, metro_nonmetro FROM geo.rural_urban_continuum),
county_avg AS (
  SELECT t.state_abbr, t.fips_code, ru.metro_nonmetro,
         AVG(t.premature_death_rate) AS rate_2020_22
  FROM health.chr_premature_death_trends t
  JOIN ru ON t.fips_code = ru.county_fips
  WHERE t.geo_level='county' AND t.period_end_year BETWEEN 2020 AND 2022
    AND t.premature_death_rate IS NOT NULL
    AND t.state_abbr <> 'DC'
  GROUP BY t.state_abbr, t.fips_code, ru.metro_nonmetro
),
state_avg AS (
  SELECT state_abbr, metro_nonmetro, AVG(rate_2020_22) AS avg_rate, COUNT(*) n
  FROM county_avg GROUP BY state_abbr, metro_nonmetro
),
piv AS (
  SELECT m.state_abbr, m.avg_rate AS metro_rate, n.avg_rate AS nonmetro_rate,
         n.avg_rate - m.avg_rate AS gap
  FROM state_avg m JOIN state_avg n ON m.state_abbr=n.state_abbr
  WHERE m.metro_nonmetro='Metro' AND n.metro_nonmetro='Nonmetro'
)
SELECT * FROM piv ORDER BY gap
hypothesis_test — 7498 ms

WITH ru AS (SELECT county_fips, metro_nonmetro FROM geo.rural_urban_continuum),
county_avg AS (
  SELECT t.state_abbr, t.fips_code, ru.metro_nonmetro,
         AVG(t.premature_death_rate) AS rate_2020_22
  FROM health.chr_premature_death_trends t
  JOIN ru ON t.fips_code = ru.county_fips
  WHERE t.geo_level='county' AND t.period_end_year BETWEEN 2020 AND 2022
    AND t.premature_death_rate IS NOT NULL
    AND t.state_abbr <> 'DC'
  GROUP BY t.state_abbr, t.fips_code, ru.metro_nonmetro
),
state_avg AS (
  SELECT state_abbr, metro_nonmetro, AVG(rate_2020_22) AS avg_rate
  FROM county_avg GROUP BY state_abbr, metro_nonmetro
)
SELECT m.state_abbr, n.avg_rate - m.avg_rate AS gap
FROM state_avg m JOIN state_avg n ON m.state_abbr=n.state_abbr
WHERE m.metro_nonmetro='Metro' AND n.metro_nonmetro='Nonmetro'
query — 2 rows — 6122 ms

SELECT t.period_end_year,
  COUNT(*) AS total_rows,
  SUM(CASE WHEN t.premature_death_rate IS NULL THEN 1 ELSE 0 END) AS null_rate_rows
FROM health.chr_premature_death_trends t
JOIN geo.rural_urban_continuum ru ON t.fips_code = ru.county_fips
WHERE t.geo_level='county' AND t.period_end_year IN (2003,2022)
GROUP BY t.period_end_year
query — 2 rows — 6259 ms

WITH ru AS (SELECT county_fips, metro_nonmetro FROM geo.rural_urban_continuum)
SELECT ru.metro_nonmetro,
  SUM(t.premature_death_numerator) / NULLIF(SUM(t.premature_death_denominator),0) * 100000 AS pop_weighted_rate_all_counties,
  COUNT(*) AS n_all_counties,
  SUM(CASE WHEN t.premature_death_rate IS NOT NULL THEN 1 ELSE 0 END) AS n_with_rate
FROM health.chr_premature_death_trends t
JOIN ru ON t.fips_code = ru.county_fips
WHERE t.geo_level='county' AND t.period_end_year = 2003
GROUP BY ru.metro_nonmetro

Sources

  1. CHR Premature Death Trends (county grain, 2003-2022)
    Show SQL
    SELECT t.period_end_year, ru.metro_nonmetro, AVG(t.premature_death_rate) FROM health.chr_premature_death_trends t JOIN geo.rural_urban_continuum ru ON t.fips_code = ru.county_fips WHERE t.geo_level='county' AND t.period_end_year BETWEEN 2003 AND 2022 AND t.premature_death_rate IS NOT NULL GROUP BY t.period_end_year, ru.metro_nonmetro
  2. State-level within-state rural/urban gap, 2020-2022 avg, paired t-test
    Show tool call
    hypothesis_test(test="t_test", one_sample_mu=0, value_col="gap")
  3. USDA ERS Rural-Urban Continuum Codes (RUCC), 2023 vintage
  4. County Health Rankings & Roadmaps methodology