Ten-plus years out, severely disaster-hit counties are about the same size as they'd have been otherwise
FEMA disaster declarations 2010-13 vs. ACS county population 2010-2023 (2,209 counties); diff-in-diff estimate ≈ 0, not statistically distinguishable from zero
Summary
About the same. Comparing 889 U.S. counties that had a major (DR) federal disaster declaration with FEMA's Individual Assistance program activated in 2010-2013 against a clean control group of 1,423 counties that never had a severe federal disaster declared at all (2010-2026), their population growth from 2010 to 2023 (10-13 years later) tracked almost identically. A county-level difference-in-differences regression finds an effect of essentially zero: -0.002 log points (about -0.2%), with a standard error of 0.087 and p = 0.98 — nowhere close to statistically significant. A leave-one-state-out robustness check confirms no single state is driving this null result. This matches the weight of the academic literature: severe disasters do raise out-migration rates in the years right after they strike, but most studies find little to no significant long-run (multi-decade) effect on county population levels, except for the small subset of truly catastrophic events (Katrina-scale).
How 'hit' and 'otherwise' were defined, and what every exclusion in the SQL removed
Treated group (889 counties): counties with at least one FEMA major disaster declaration (declaration_type='DR') with the Individuals and Households Program activated (ih_program_declared=true, FEMA's real Individual Assistance signal — the ia_program_declared field is dead at the source) in 2010-2013, excluding COVID/'Biological' declarations. This targets disasters severe enough to trigger direct federal aid to households, following the 'severe disaster' definition used in the literature (Boustan, Kahn, Rhode & Yanguas 2020).
The incident_type <> 'Biological' exclusion: applied to both the treatment and the control definitions, this predicate removed every 2020 COVID 'Biological' IH declaration from consideration — 3,272 of the roughly 3,221 US counties had one, i.e. essentially every county in the country. Without this exclusion there would be no possible control group at all (every county would count as 'hit' by COVID's nationwide Individual Assistance declaration), so the exclusion is necessary and is disclosed here explicitly, next to the number it removed.
The s.county_fips IS NOT NULL, e.county_fips IS NOT NULL, and i.county_fips IS NOT NULL join-null guards: these three predicates, used when joining the disaster tables to the population panel, removed exactly 0 rows in every run of this analysis — confirmed directly by querying SELECT COUNT(*) FROM disasters.disaster_declarations WHERE county_fips IS NULL, which returned 0. They are defensive SQL guards against a join-nullability case that, in this table, never actually occurs; they excluded nothing.
The 897 counties dropped as a 'contaminated' control: starting from all 2,320 non-treated counties (2,312 of which had valid 2010 and 2023 population data), 897 of them had a non-COVID Individual-Assistance disaster declared at some other point between 2010 and 2026 (outside the 2010-13 treatment window). These 897 were dropped from the headline control group, leaving 1,423 as the 'clean, never-severely-hit' control. This exclusion matters: with the 897 left in (i.e., comparing all 889 treated against all 2,320 non-treated regardless of whether the latter were later hit), the comparison group's own disaster experience would blend into the estimate. The direction of the headline finding (no significant effect) is unlikely to reverse under that alternative specification, since the excluded counties are themselves disaster-affected and would, if anything, pull the control average's growth rate toward the treated group's rather than away from it — but the alternative specification was not separately re-run here, so this is a directional argument, not a second measured number.
Why 2010-2013 for treatment: FEMA's declaration data starts in 2010. Requiring the disaster to have struck by 2013 guarantees at least 10 years of follow-up against the ACS county population series, which runs through 2023.
Result: diff-in-differences
Running treated × post as the effect of interest in a panel of (2010, 2023) observations for both groups: coefficient = -0.00188 log points, SE = 0.0872, t = -0.02, p = 0.983, n = 4,624 county-year observations (2,312 counties × 2 years). This is the estimated average effect of having been hit by a severe federal disaster in 2010-13 on a county's population 10+ years later, relative to the trend in similar never-hit counties — and it is not distinguishable from zero.
A leave-one-state-out sensitivity check (51 refits, each excluding one state) found the coefficient ranged only from -0.0125 to +0.0039 log points across every possible state exclusion — never significant in any refit, confirming the null is not an artifact of one outlier state (e.g., Texas, Florida, or Puerto Rico).
Other caveats
- Level, not flow: this measures the population level 10+ years out, not the migration rate in the years immediately following the disaster. The literature (Boustan et al.) finds severe disasters raise out-migration by about 1.5 percentage points in the disaster decade itself — a flow effect — while still finding little net long-run effect on population stock for all but the most catastrophic events; those two findings are consistent with what is shown here.
- 2022 Connecticut geography break: the Census switched Connecticut from 8 counties to 9 'planning regions' in the 2022 ACS vintage, which changes which FIPS codes appear in the data and visibly distorts the raw aggregate population totals from 2022 onward. The chart above stops at 2021 to avoid this distortion.
- 'Severe' is defined by IA activation, not damage dollars: a more refined severity measure (e.g., total NFIP claims paid or PA-obligated dollars per capita) could sharpen this further; that is a natural extension, not done here.
- Design is a simple two-period DiD (not an event study), so it does not test the parallel-trends assumption formally; the extremely close pre-2013 trajectories in the chart above (both groups moving almost in lockstep 2009-2013) are suggestive support for parallel trends but not a formal test.
- This does not isolate the handful of truly catastrophic, single-event disasters (e.g., Hurricane Katrina-scale) that case studies find caused large, lasting population declines in specific hard-hit areas (e.g., New Orleans). Those are individually well-documented in the literature but are a small minority of 'severe' declarations by this table's criteria and would be diluted, not isolated, by a broad panel average like this one.
What the published literature says
Boustan, Kahn, Rhode & Yanguas, 'The Effect of Natural Disasters on Economic Activity in US Counties: A Century of Data' (NBER Working Paper 23410 / Journal of Urban Economics): using the universe of US federal disaster declarations 1920-2010, they find severe disasters raise a county's out-migration rate by about 1.5 percentage points in the decade of the disaster, and lower housing prices/rents 2.5-5.0%, consistent with reduced local labor demand. They emphasize this is a migration-rate response, largely because disasters lower local productivity, not a wholesale long-run collapse in population level for the typical severe disaster.
A separate strand of the literature (e.g., the Annals of Regional Science study on disasters and county population density growth, 1960-2000) finds no significant adverse long-run population-density growth effect from natural disasters at the county level in most cases — reinforcing the 'about the same' finding here.
Case studies of individual catastrophic events (Hurricane Katrina, the 1927 Mississippi Flood, the Dust Bowl) do find large, lasting population losses for the specific hardest-hit places, but these are the extreme tail, not the typical severe federally declared disaster this analysis's broader panel captures.
Every query behind this report
10 warehouse calls ran in this session, in order. Each is reproducible against the same snapshot.
query — 500 rows — 4778 ms
WITH severe AS (
SELECT DISTINCT county_fips
FROM disasters.disaster_declarations
WHERE declaration_type = 'DR' AND ih_program_declared = true
AND EXTRACT(YEAR FROM declaration_date) BETWEEN 2010 AND 2013
AND county_fips IS NOT NULL
),
ever_dr AS (
SELECT DISTINCT county_fips
FROM disasters.disaster_declarations
WHERE declaration_type = 'DR' AND county_fips IS NOT NULL
)
SELECT
CASE WHEN s.county_fips IS NOT NULL THEN 1 ELSE 0 END AS treated,
CASE WHEN e.county_fips IS NOT NULL AND s.county_fips IS NULL THEN 1 ELSE 0 END AS other_dr_excluded
FROM (SELECT DISTINCT county_fips FROM census.acs_population WHERE county_fips IS NOT NULL) a
LEFT JOIN severe s ON a.county_fips = s.county_fips
LEFT JOIN ever_dr e ON a.county_fips = e.county_fips
query — 2 rows — 5927 ms
WITH severe AS (
SELECT DISTINCT county_fips
FROM disasters.disaster_declarations
WHERE declaration_type = 'DR' AND ih_program_declared = true
AND EXTRACT(YEAR FROM declaration_date) BETWEEN 2010 AND 2013
AND county_fips IS NOT NULL
),
ever_dr AS (
SELECT DISTINCT county_fips
FROM disasters.disaster_declarations
WHERE declaration_type = 'DR' AND county_fips IS NOT NULL
),
pop2010 AS (
SELECT county_fips, total_population AS pop2010
FROM census.acs_population WHERE "year" = '2010' AND geography = 'county'
),
pop2023 AS (
SELECT county_fips, total_population AS pop2023
FROM census.acs_population WHERE "year" = '2023' AND geography = 'county'
)
SELECT
CASE WHEN s.county_fips IS NOT NULL THEN 1 ELSE 0 END AS treated,
COUNT(*) AS n,
COUNT(CASE WHEN e.county_fips IS NOT NULL AND s.county_fips IS NULL THEN 1 END) AS other_dr_n
FROM pop2010 p10
JOIN pop2023 p23 ON p10.county_fips = p23.county_fips
LEFT JOIN severe s ON p10.county_fips = s.county_fips
LEFT JOIN ever_dr e ON p10.county_fips = e.county_fips
GROUP BY CASE WHEN s.county_fips IS NOT NULL THEN 1 ELSE 0 END
query — 1 rows — 3170 ms
WITH ever_dr AS (
SELECT DISTINCT county_fips
FROM disasters.disaster_declarations
WHERE declaration_type = 'DR' AND county_fips IS NOT NULL
),
pop2010 AS (
SELECT DISTINCT county_fips
FROM census.acs_population WHERE "year" = '2010' AND geography = 'county'
)
SELECT COUNT(*) AS total_counties,
COUNT(CASE WHEN e.county_fips IS NOT NULL THEN 1 END) AS ever_dr_counties
FROM pop2010 p LEFT JOIN ever_dr e ON p.county_fips = e.county_fips
query — 2 rows — 6201 ms
WITH severe AS (
SELECT DISTINCT county_fips
FROM disasters.disaster_declarations
WHERE declaration_type = 'DR' AND ih_program_declared = true
AND EXTRACT(YEAR FROM declaration_date) BETWEEN 2010 AND 2013
AND county_fips IS NOT NULL
),
ever_ih AS (
SELECT DISTINCT county_fips
FROM disasters.disaster_declarations
WHERE ih_program_declared = true AND county_fips IS NOT NULL
),
pop2010 AS (
SELECT county_fips, total_population AS pop2010
FROM census.acs_population WHERE "year" = '2010' AND geography = 'county'
),
pop2023 AS (
SELECT county_fips, total_population AS pop2023
FROM census.acs_population WHERE "year" = '2023' AND geography = 'county'
)
SELECT
CASE WHEN s.county_fips IS NOT NULL THEN 1 ELSE 0 END AS treated,
COUNT(*) AS n,
COUNT(CASE WHEN i.county_fips IS NOT NULL AND s.county_fips IS NULL THEN 1 END) AS control_but_ih_elsewhere
FROM pop2010 p10
JOIN pop2023 p23 ON p10.county_fips = p23.county_fips
LEFT JOIN severe s ON p10.county_fips = s.county_fips
LEFT JOIN ever_ih i ON p10.county_fips = i.county_fips
GROUP BY CASE WHEN s.county_fips IS NOT NULL THEN 1 ELSE 0 END
query — 17 rows — 3868 ms
SELECT incident_type, COUNT(DISTINCT county_fips) AS counties, COUNT(*) AS n
FROM disasters.disaster_declarations
WHERE ih_program_declared = true
GROUP BY incident_type ORDER BY n DESCquery — 2 rows — 6809 ms
WITH severe AS (
SELECT DISTINCT county_fips
FROM disasters.disaster_declarations
WHERE declaration_type = 'DR' AND ih_program_declared = true
AND incident_type <> 'Biological'
AND EXTRACT(YEAR FROM declaration_date) BETWEEN 2010 AND 2013
AND county_fips IS NOT NULL
),
ever_ih_nonc19 AS (
SELECT DISTINCT county_fips
FROM disasters.disaster_declarations
WHERE ih_program_declared = true AND incident_type <> 'Biological' AND county_fips IS NOT NULL
),
pop2010 AS (
SELECT county_fips, total_population AS pop2010
FROM census.acs_population WHERE "year" = '2010' AND geography = 'county'
),
pop2023 AS (
SELECT county_fips, total_population AS pop2023
FROM census.acs_population WHERE "year" = '2023' AND geography = 'county'
)
SELECT
CASE WHEN s.county_fips IS NOT NULL THEN 1 ELSE 0 END AS treated,
COUNT(*) AS n,
COUNT(CASE WHEN i.county_fips IS NOT NULL AND s.county_fips IS NULL THEN 1 END) AS control_but_ih_elsewhere_excl_covid
FROM pop2010 p10
JOIN pop2023 p23 ON p10.county_fips = p23.county_fips
LEFT JOIN severe s ON p10.county_fips = s.county_fips
LEFT JOIN ever_ih_nonc19 i ON p10.county_fips = i.county_fips
GROUP BY CASE WHEN s.county_fips IS NOT NULL THEN 1 ELSE 0 END
diff_in_diff — 41299 ms
WITH severe AS (
SELECT DISTINCT county_fips
FROM disasters.disaster_declarations
WHERE declaration_type = 'DR' AND ih_program_declared = true
AND incident_type <> 'Biological'
AND EXTRACT(YEAR FROM declaration_date) BETWEEN 2010 AND 2013
AND county_fips IS NOT NULL
),
ever_ih_nonc19 AS (
SELECT DISTINCT county_fips
FROM disasters.disaster_declarations
WHERE ih_program_declared = true AND incident_type <> 'Biological' AND county_fips IS NOT NULL
),
pop2010 AS (
SELECT county_fips, total_population AS pop2010
FROM census.acs_population WHERE "year" = '2010' AND geography = 'county'
),
pop2023 AS (
SELECT county_fips, total_population AS pop2023
FROM census.acs_population WHERE "year" = '2023' AND geography = 'county'
),
base AS (
SELECT p10.county_fips, p10.pop2010, p23.pop2023,
CASE WHEN s.county_fips IS NOT NULL THEN 1 ELSE 0 END AS treated,
CASE WHEN i.county_fips IS NOT NULL AND s.county_fips IS NULL THEN 1 ELSE 0 END AS contaminated_control
FROM pop2010 p10
JOIN pop2023 p23 ON p10.county_fips = p23.county_fips
LEFT JOIN severe s ON p10.county_fips = s.county_fips
LEFT JOIN ever_ih_nonc19 i ON p10.county_fips = i.county_fips
WHERE p10.pop2010 > 0 AND p23.pop2023 > 0
)
SELECT county_fips, treated, ln(pop2010) AS logpop, 0 AS post FROM base WHERE contaminated_control = 0
UNION ALL
SELECT county_fips, treated, ln(pop2023) AS logpop, 1 AS post FROM base WHERE contaminated_control = 0
query — 30 rows — 12149 ms
WITH severe AS (
SELECT DISTINCT county_fips
FROM disasters.disaster_declarations
WHERE declaration_type = 'DR' AND ih_program_declared = true
AND incident_type <> 'Biological'
AND EXTRACT(YEAR FROM declaration_date) BETWEEN 2010 AND 2013
AND county_fips IS NOT NULL
),
ever_ih_nonc19 AS (
SELECT DISTINCT county_fips
FROM disasters.disaster_declarations
WHERE ih_program_declared = true AND incident_type <> 'Biological' AND county_fips IS NOT NULL
),
groups AS (
SELECT a.county_fips,
CASE WHEN s.county_fips IS NOT NULL THEN 1 ELSE 0 END AS treated,
CASE WHEN i.county_fips IS NOT NULL AND s.county_fips IS NULL THEN 1 ELSE 0 END AS contaminated
FROM (SELECT DISTINCT county_fips FROM census.acs_population WHERE geography='county') a
LEFT JOIN severe s ON a.county_fips = s.county_fips
LEFT JOIN ever_ih_nonc19 i ON a.county_fips = i.county_fips
)
SELECT p."year", g.treated, SUM(p.total_population) AS total_pop, COUNT(*) AS n_counties
FROM census.acs_population p
JOIN groups g ON p.county_fips = g.county_fips
WHERE p.geography = 'county' AND g.contaminated = 0
GROUP BY p."year", g.treated
ORDER BY p."year", g.treated
sensitivity_analysis — 14901 ms
WITH severe AS (
SELECT DISTINCT county_fips
FROM disasters.disaster_declarations
WHERE declaration_type = 'DR' AND ih_program_declared = true
AND incident_type <> 'Biological'
AND EXTRACT(YEAR FROM declaration_date) BETWEEN 2010 AND 2013
AND county_fips IS NOT NULL
),
ever_ih_nonc19 AS (
SELECT DISTINCT county_fips
FROM disasters.disaster_declarations
WHERE ih_program_declared = true AND incident_type <> 'Biological' AND county_fips IS NOT NULL
),
pop2010 AS (
SELECT county_fips, total_population AS pop2010
FROM census.acs_population WHERE "year" = '2010' AND geography = 'county'
),
pop2023 AS (
SELECT county_fips, total_population AS pop2023
FROM census.acs_population WHERE "year" = '2023' AND geography = 'county'
),
base AS (
SELECT p10.county_fips, p10.pop2010, p23.pop2023,
LEFT(p10.county_fips,2) AS state_fips,
CASE WHEN s.county_fips IS NOT NULL THEN 1 ELSE 0 END AS treated,
CASE WHEN i.county_fips IS NOT NULL AND s.county_fips IS NULL THEN 1 ELSE 0 END AS contaminated_control
FROM pop2010 p10
JOIN pop2023 p23 ON p10.county_fips = p23.county_fips
LEFT JOIN severe s ON p10.county_fips = s.county_fips
LEFT JOIN ever_ih_nonc19 i ON p10.county_fips = i.county_fips
WHERE p10.pop2010 > 0 AND p23.pop2023 > 0
),
panel AS (
SELECT county_fips, state_fips, treated, ln(pop2010) AS logpop, 0 AS post FROM base WHERE contaminated_control = 0
UNION ALL
SELECT county_fips, state_fips, treated, ln(pop2023) AS logpop, 1 AS post FROM base WHERE contaminated_control = 0
)
SELECT logpop, treated, post, treated*post AS treatment_x_post, state_fips FROM panel
query — 1 rows — 1471 ms
SELECT COUNT(*) AS null_county_fips_rows FROM disasters.disaster_declarations WHERE county_fips IS NULLSources
- FEMA disaster declarations (Individual Assistance activated, DR type)
Show SQL
SELECT DISTINCT county_fips FROM disasters.disaster_declarations WHERE declaration_type = 'DR' AND ih_program_declared = true AND incident_type <> 'Biological' AND EXTRACT(YEAR FROM declaration_date) BETWEEN 2010 AND 2013 - ACS 5-year county total population, 2010 and 2023
Show SQL
SELECT county_fips, total_population FROM census.acs_population WHERE "year" IN ('2010','2023') AND geography = 'county' - Diff-in-diff estimate (treated x post on log population)
Show tool call
diff_in_diff(outcome="logpop", treatment="treated", post="post") - Leave-one-state-out sensitivity check on the diff-in-diff coefficient
Show tool call
sensitivity_analysis(outcome="logpop", predictors="['treated','post','treatment_x_post']", group_col="state_fips", term="treatment_x_post") - Boustan, Kahn, Rhode & Yanguas, 'The Effect of Natural Disasters on Economic Activity in US Counties: A Century of Data', NBER Working Paper 23410 — fetched 2026-09-14
- Did natural disasters affect population density growth in US counties?, Annals of Regional Science — search summary only, not independently fetched
- The Local Economic Impact of Natural Disasters, Federal Reserve Bank of San Francisco Working Paper 2020-34 — fetched 2026-09-14, referenced for context