Yes — Faster FEMA Disaster Declarations Are Associated With Stronger County Employment Recovery, Even After Controlling for Aid Size and County Size
FEMA disaster declarations joined to BLS QCEW county employment, 2010-2022 declarations, n=12,609 county-disaster observations
Summary
Yes, there is a real, statistically robust association: counties whose FEMA disaster declaration came faster after the disaster began saw stronger employment growth over the following three years. Counties declared within 14 days of the incident's start averaged +2.95% total employment growth over the next 3 years, versus +0.67% for counties that waited 46-120 days. In a regression that controls for the dollar amount of federal Public Assistance obligated per worker (a proxy for disaster severity) and county size, each one-tier increase in declaration delay is associated with roughly 1.16 percentage points lower 3-year employment growth (p < 0.001, n=12,609 county-disaster observations, 2010-2022). This holds up when any single state is dropped from the analysis. The relationship is real but modest in explanatory power (R²≈0.01) -- disaster speed is one of many things driving a county's post-disaster trajectory, not the dominant one.
Why declaration speed, not literal disbursement speed
The question asks about how fast aid actually arrives. This corpus's FEMA data (disasters.public_assistance_projects, 404,509 project-worksheet rows) carries an approved project amount and cumulative obligated totals, but no obligation-date or disbursement-date field -- only declaration_date, which is constant across every project tied to a disaster. There is therefore no way, from this data alone, to measure how many days after a disaster the first dollar was actually obligated to a given project. The earliest point in the pipeline that IS reliably timestamped and gates all Public Assistance funding is the presidential disaster declaration itself (declaration_date vs. incident_begin_date in disasters.disaster_declarations) -- no PA money can be obligated before a Major Disaster Declaration with the PA program activated. This is used here as the proxy for aid speed, and is disclosed as such rather than presented as literal dollar-arrival timing.
What the literature says
Existing research supports the plausibility of an aid-speed → recovery-speed link, and complicates it in ways worth naming. The Federal Reserve Bank of San Francisco's working paper on the local economic impact of natural disasters finds that disaster shocks can raise local employment and income in the short-to-medium run, driven substantially by rebuilding activity and federal aid inflows -- consistent with the positive average growth seen across every speed bucket in this analysis. Tatyana Deryugina's body of work (see her IDEAS/RePEc page), including "The Fiscal Cost of Hurricanes: Disaster Aid versus Social Insurance" (AEJ: Economic Policy, 2017) and the Katrina tax-return study with Kawano and Levitt, documents that federal disaster aid materially affects household and local economic trajectories for years after a disaster -- establishing that aid magnitude matters, which is exactly why this analysis controls for aid dollars per worker rather than letting speed proxy for aid size. A more directly on-point paper, Arora, Tran & Khaitan's "Do Politics Shape Economic Recovery through Federal Disaster Assistance?" (SSRN, could not be fetched directly -- paywalled/403 on this session, cited from its title and abstract summary in search results only), argues that the speed and generosity of federal disaster assistance is itself shaped by political alignment between a disaster-hit jurisdiction and the federal government, which in turn shapes recovery -- meaning declaration speed is not randomly assigned, an important caveat to the causal reading of the result below.
Method and what was excluded
1. Built one row per county x disaster-year for every DR-type FEMA declaration with Public Assistance activated, 2010-2022 (deduplicating multiple program rows per disaster to one row per county-year using the fastest declaration that year).
2. Bucketed declaration speed into 4 tiers by days from incident_begin_date to declaration_date: 0-14, 15-45, 46-120, 120+.
3. Measured 3-year county employment growth: (employment in declaration_year+2 minus employment in declaration_year-1) / employment in declaration_year-1, from BLS QCEW (econ.county_wages, all-industry, all-ownership).
4. Ran a regression of growth on the speed-tier code, controlling for log(1 + federal PA dollars obligated per pre-disaster worker) and log(pre-disaster employment).
5. Ran a leave-one-state-out sensitivity analysis on the speed-tier coefficient.
Exact exclusion accounting, starting from 12,782 eligible county x disaster-year rows. county_fips IS NOT NULL dropped 0 rows. A direct count confirmed every 2010-2022 DR/PA disaster-declaration row already has a non-null county_fips, so nothing was excluded by this predicate. incident_begin_date IS NOT NULL dropped 0 rows and declaration_date IS NOT NULL dropped 0 rows -- every eligible row already carried both dates, so nothing was excluded by either predicate. pre.emp IS NOT NULL dropped 165 rows and the equivalent column check emp_pre IS NOT NULL also dropped 165 rows (the same underlying BLS QCEW column, checked in two separate queries this session): BLS QCEW suppresses employment for county-industry cells dominated by one or two employers, so those 165 county-years were excluded for lacking a disclosed pre-disaster employment figure. post.emp IS NOT NULL dropped 169 rows and the equivalent column check emp_post IS NOT NULL also dropped 169 rows (again the same underlying BLS QCEW column, checked twice): those 169 county-years were excluded for the identical BLS-suppression reason, two years later. The pre.emp and post.emp null sets overlap on 161 rows, so together they excluded a net 173 of the 12,782 eligible rows, leaving 12,609 retained, which is 98.6% of the eligible rows. pre.emp > 50 dropped 0 further rows -- a direct count confirmed every non-null pre.emp value in this population already exceeded 50 workers, so nothing was excluded by that floor. Because BLS's suppression targets a small, specific set of tiny or single-employer counties rather than systematically fast- or slow-declared ones, and the exclusion rate is under 1.4%, it is unlikely to be manufacturing the fast-vs-slow gap reported below; recomputing the group means on the 173 excluded rows is not possible since their outcome variable, the employment figure itself, is exactly what BLS suppressed, but the small share excluded bounds how much they could move the headline number.
| 0-14 days | 2,711 | +2.95% |
| 15-45 days | 3,008 | +1.91% |
| 46-120 days | 6,754 | +0.67% |
| 120+ days | 136 | +1.10% |
| 0-14 days | 2,711 | +2.95% |
| 120+ days | 136 | +1.10% |
| 15-45 days | 3,008 | +1.91% |
| 46-120 days | 6,754 | +0.67% |
| 46-120 days | 6,754 | +0.67% |
| 15-45 days | 3,008 | +1.91% |
| 0-14 days | 2,711 | +2.95% |
| 120+ days | 136 | +1.10% |
| 0-14 days | 2,711 | +2.95% |
| 15-45 days | 3,008 | +1.91% |
| 120+ days | 136 | +1.10% |
| 46-120 days | 6,754 | +0.67% |
Regression result: coefficient on speed-tier = -0.0116 (SE 0.00110, robust HC1 std. errors), p < 1.99e-15, n=12,609. Coefficient on log(federal aid $/worker) = -0.0016 (p<0.001) -- more aid per worker is associated with slightly slower measured growth once severity correlates with aid size, an expected sign given aid targets the worst-hit counties. Coefficient on log(pre-disaster employment) = +0.0018 (p=0.04) -- larger counties recover marginally faster.
Robustness and limits
Leave-one-state-out testing across all 53 jurisdictions found no sign flip and no loss of significance at any omission. Texas (FIPS 48) is the most influential single state (|influence|=3.17 standard-error units) -- dropping it moves the coefficient from -0.0116 to -0.0083, still highly significant, still the same direction. No other state moves the estimate by more than 0.8 standard errors.
Caveats that matter for interpretation: (1) This is an association from observational data, not a randomized or quasi-experimental design -- declaration speed is plausibly endogenous to disaster severity, political salience, and state capacity, all of which independently affect recovery, and the Arora/Tran/Khaitan finding above suggests declaration speed itself may be politically determined. (2) The employment measure (QCEW) captures jobs, not output, wages, or business survival, and a 3-year post-declaration window may miss both very short-run disruption and very long-run divergence. (3) R²≈0.01 means this regression explains a small share of the variance in county employment growth -- declaration speed is one modest factor among many, not the dominant driver. (4) Declaration-speed is a proxy for aid speed broadly, not the same as "how many days until the check cleared," which this corpus cannot measure directly (no obligation-date field on the project-level FEMA data).
Every query behind this report
12 warehouse calls ran in this session, in order. Each is reproducible against the same snapshot.
query — 1 rows — 2537 ms
SELECT MIN(declaration_date), MAX(declaration_date), COUNT(*) FROM disasters.disaster_declarations WHERE declaration_type='DR' AND pa_program_declared = TRUEquery — 1 rows — 15607 ms
SELECT MIN(CAST(year AS INT)), MAX(CAST(year AS INT)) FROM econ.county_wages WHERE industry_code='10' AND own_code='0'query — 3 rows — 1635 ms
SELECT disaster_number, county_fips, declaration_date, incident_begin_date, "year"
FROM disasters.disaster_declarations LIMIT 3query — 5000 rows — 15408 ms
SELECT DISTINCT disaster_number, county_fips, declaration_date, incident_begin_date, incident_type, "year"
FROM disasters.disaster_declarations
WHERE declaration_type = 'DR' AND pa_program_declared = TRUE
AND incident_begin_date IS NOT NULL AND declaration_date IS NOT NULL
AND county_fips IS NOT NULL
AND CAST("year" AS INT) BETWEEN 2010 AND 2022query — 5 rows — 2855 ms
SELECT declaration_date, incident_begin_date,
CASE WHEN declaration_date <= incident_begin_date + INTERVAL '14' DAY THEN 'fast_0_14'
WHEN declaration_date <= incident_begin_date + INTERVAL '45' DAY THEN 'med_15_45'
WHEN declaration_date <= incident_begin_date + INTERVAL '120' DAY THEN 'slow_46_120'
ELSE 'very_slow_120plus' END AS lag_bucket
FROM disasters.disaster_declarations FETCH FIRST 5 ROWS ONLYquery — 4 rows — 73684 ms
WITH d AS (
SELECT DISTINCT disaster_number, county_fips,
CAST("year" AS INT) AS decl_year,
CASE WHEN declaration_date <= incident_begin_date + INTERVAL '14' DAY THEN 0
WHEN declaration_date <= incident_begin_date + INTERVAL '45' DAY THEN 1
WHEN declaration_date <= incident_begin_date + INTERVAL '120' DAY THEN 2
ELSE 3 END AS lag_code
FROM disasters.disaster_declarations
WHERE declaration_type = 'DR' AND pa_program_declared = TRUE
AND incident_begin_date IS NOT NULL AND declaration_date IS NOT NULL
AND county_fips IS NOT NULL
AND CAST("year" AS INT) BETWEEN 2010 AND 2022
),
dedup AS (
SELECT county_fips, decl_year, MIN(lag_code) AS lag_code
FROM d GROUP BY county_fips, decl_year
),
emp AS (
SELECT county_fips, CAST(year AS INT) AS yr, annual_avg_emplvl AS emp
FROM econ.county_wages WHERE industry_code='10' AND own_code='0'
),
joined AS (
SELECT dd.county_fips, dd.decl_year, dd.lag_code,
pre.emp AS emp_pre, post.emp AS emp_post
FROM dedup dd
JOIN emp pre ON pre.county_fips = dd.county_fips AND pre.yr = dd.decl_year - 1
JOIN emp post ON post.county_fips = dd.county_fips AND post.yr = dd.decl_year + 2
WHERE pre.emp IS NOT NULL AND post.emp IS NOT NULL AND pre.emp > 50
)
SELECT lag_code, COUNT(*) AS n, AVG((emp_post-emp_pre)*1.0/emp_pre) AS avg_growth,
stddev_samp((emp_post-emp_pre)*1.0/emp_pre) AS sd_growth,
median((emp_post-emp_pre)*1.0/emp_pre) AS median_growth
FROM joined
GROUP BY lag_code
ORDER BY lag_codequery — 5000 rows — 96829 ms
WITH d AS (
SELECT DISTINCT disaster_number, county_fips,
CAST("year" AS INT) AS decl_year,
CASE WHEN declaration_date <= incident_begin_date + INTERVAL '14' DAY THEN 0
WHEN declaration_date <= incident_begin_date + INTERVAL '45' DAY THEN 1
WHEN declaration_date <= incident_begin_date + INTERVAL '120' DAY THEN 2
ELSE 3 END AS lag_code,
incident_type
FROM disasters.disaster_declarations
WHERE declaration_type = 'DR' AND pa_program_declared = TRUE
AND incident_begin_date IS NOT NULL AND declaration_date IS NOT NULL
AND county_fips IS NOT NULL
AND CAST("year" AS INT) BETWEEN 2010 AND 2022
),
dedup AS (
SELECT county_fips, decl_year, MIN(lag_code) AS lag_code, MIN(incident_type) AS incident_type
FROM d GROUP BY county_fips, decl_year
),
pa AS (
SELECT county_fips, CAST(year AS INT) AS yr, SUM(federal_share_obligated) AS fed_oblig
FROM disasters.public_assistance_projects
GROUP BY county_fips, CAST(year AS INT)
),
emp AS (
SELECT county_fips, CAST(year AS INT) AS yr, annual_avg_emplvl AS emp
FROM econ.county_wages WHERE industry_code='10' AND own_code='0'
),
joined AS (
SELECT dd.county_fips, dd.decl_year, dd.lag_code, dd.incident_type,
pre.emp AS emp_pre, post.emp AS emp_post,
COALESCE(pa.fed_oblig,0) AS fed_oblig
FROM dedup dd
JOIN emp pre ON pre.county_fips = dd.county_fips AND pre.yr = dd.decl_year - 1
JOIN emp post ON post.county_fips = dd.county_fips AND post.yr = dd.decl_year + 2
LEFT JOIN pa ON pa.county_fips = dd.county_fips AND pa.yr = dd.decl_year
WHERE pre.emp IS NOT NULL AND post.emp IS NOT NULL AND pre.emp > 50
)
SELECT county_fips, decl_year, lag_code, incident_type, emp_pre, emp_post,
(emp_post-emp_pre)*1.0/emp_pre AS growth,
fed_oblig, fed_oblig/emp_pre AS oblig_per_worker
FROM joinedrobust_regression — 111273 ms
WITH d AS (
SELECT DISTINCT disaster_number, county_fips,
CAST("year" AS INT) AS decl_year,
CASE WHEN declaration_date <= incident_begin_date + INTERVAL '14' DAY THEN 0
WHEN declaration_date <= incident_begin_date + INTERVAL '45' DAY THEN 1
WHEN declaration_date <= incident_begin_date + INTERVAL '120' DAY THEN 2
ELSE 3 END AS lag_code
FROM disasters.disaster_declarations
WHERE declaration_type = 'DR' AND pa_program_declared = TRUE
AND incident_begin_date IS NOT NULL AND declaration_date IS NOT NULL
AND county_fips IS NOT NULL
AND CAST("year" AS INT) BETWEEN 2010 AND 2022
),
dedup AS (
SELECT county_fips, decl_year, MIN(lag_code) AS lag_code
FROM d GROUP BY county_fips, decl_year
),
pa AS (
SELECT county_fips, CAST(year AS INT) AS yr, SUM(federal_share_obligated) AS fed_oblig
FROM disasters.public_assistance_projects
GROUP BY county_fips, CAST(year AS INT)
),
emp AS (
SELECT county_fips, CAST(year AS INT) AS yr, annual_avg_emplvl AS emp
FROM econ.county_wages WHERE industry_code='10' AND own_code='0'
),
joined AS (
SELECT dd.county_fips, dd.decl_year, dd.lag_code,
pre.emp AS emp_pre, post.emp AS emp_post,
COALESCE(pa.fed_oblig,0) AS fed_oblig
FROM dedup dd
JOIN emp pre ON pre.county_fips = dd.county_fips AND pre.yr = dd.decl_year - 1
JOIN emp post ON post.county_fips = dd.county_fips AND post.yr = dd.decl_year + 2
LEFT JOIN pa ON pa.county_fips = dd.county_fips AND pa.yr = dd.decl_year
WHERE pre.emp IS NOT NULL AND post.emp IS NOT NULL AND pre.emp > 50
)
SELECT lag_code, (emp_post-emp_pre)*1.0/emp_pre AS growth,
LN(1+fed_oblig/emp_pre) AS log_oblig_per_worker, LN(emp_pre) AS log_emp_pre
FROM joinedsensitivity_analysis — 99180 ms
WITH d AS (
SELECT DISTINCT disaster_number, county_fips, state_fips,
CAST("year" AS INT) AS decl_year,
CASE WHEN declaration_date <= incident_begin_date + INTERVAL '14' DAY THEN 0
WHEN declaration_date <= incident_begin_date + INTERVAL '45' DAY THEN 1
WHEN declaration_date <= incident_begin_date + INTERVAL '120' DAY THEN 2
ELSE 3 END AS lag_code
FROM disasters.disaster_declarations
WHERE declaration_type = 'DR' AND pa_program_declared = TRUE
AND incident_begin_date IS NOT NULL AND declaration_date IS NOT NULL
AND county_fips IS NOT NULL
AND CAST("year" AS INT) BETWEEN 2010 AND 2022
),
dedup AS (
SELECT county_fips, state_fips, decl_year, MIN(lag_code) AS lag_code
FROM d GROUP BY county_fips, state_fips, decl_year
),
pa AS (
SELECT county_fips, CAST(year AS INT) AS yr, SUM(federal_share_obligated) AS fed_oblig
FROM disasters.public_assistance_projects
GROUP BY county_fips, CAST(year AS INT)
),
emp AS (
SELECT county_fips, CAST(year AS INT) AS yr, annual_avg_emplvl AS emp
FROM econ.county_wages WHERE industry_code='10' AND own_code='0'
),
joined AS (
SELECT dd.county_fips, dd.state_fips, dd.decl_year, dd.lag_code,
pre.emp AS emp_pre, post.emp AS emp_post,
COALESCE(pa.fed_oblig,0) AS fed_oblig
FROM dedup dd
JOIN emp pre ON pre.county_fips = dd.county_fips AND pre.yr = dd.decl_year - 1
JOIN emp post ON post.county_fips = dd.county_fips AND post.yr = dd.decl_year + 2
LEFT JOIN pa ON pa.county_fips = dd.county_fips AND pa.yr = dd.decl_year
WHERE pre.emp IS NOT NULL AND post.emp IS NOT NULL AND pre.emp > 50
)
SELECT state_fips, lag_code, (emp_post-emp_pre)*1.0/emp_pre AS growth,
LN(1+fed_oblig/emp_pre) AS log_oblig_per_worker, LN(emp_pre) AS log_emp_pre
FROM joinedquery — 1 rows — 101014 ms
WITH d AS (
SELECT DISTINCT disaster_number, county_fips,
CAST("year" AS INT) AS decl_year
FROM disasters.disaster_declarations
WHERE declaration_type = 'DR' AND pa_program_declared = TRUE
AND CAST("year" AS INT) BETWEEN 2010 AND 2022
),
missing_dates AS (
SELECT COUNT(*) AS c FROM disasters.disaster_declarations
WHERE declaration_type='DR' AND pa_program_declared=TRUE
AND CAST("year" AS INT) BETWEEN 2010 AND 2022
AND (incident_begin_date IS NULL OR declaration_date IS NULL OR county_fips IS NULL)
),
dedup_all AS (
SELECT county_fips, decl_year FROM d WHERE county_fips IS NOT NULL GROUP BY county_fips, decl_year
),
emp AS (
SELECT county_fips, CAST(year AS INT) AS yr, annual_avg_emplvl AS emp
FROM econ.county_wages WHERE industry_code='10' AND own_code='0'
)
SELECT
(SELECT COUNT(*) FROM dedup_all) AS total_county_disaster_years,
(SELECT COUNT(*) FROM dedup_all dd LEFT JOIN emp pre ON pre.county_fips=dd.county_fips AND pre.yr=dd.decl_year-1
WHERE pre.emp IS NULL) AS missing_pre_emp,
(SELECT COUNT(*) FROM dedup_all dd LEFT JOIN emp post ON post.county_fips=dd.county_fips AND post.yr=dd.decl_year+2
WHERE post.emp IS NULL) AS missing_post_empquery — 1 rows — 90491 ms
WITH d AS (
SELECT DISTINCT disaster_number, county_fips, CAST("year" AS INT) AS decl_year
FROM disasters.disaster_declarations
WHERE declaration_type = 'DR' AND pa_program_declared = TRUE
AND incident_begin_date IS NOT NULL AND declaration_date IS NOT NULL
AND county_fips IS NOT NULL
AND CAST("year" AS INT) BETWEEN 2010 AND 2022
),
dedup AS (SELECT county_fips, decl_year FROM d GROUP BY county_fips, decl_year),
emp AS (SELECT county_fips, CAST(year AS INT) AS yr, annual_avg_emplvl AS emp FROM econ.county_wages WHERE industry_code='10' AND own_code='0'),
joined AS (
SELECT dd.county_fips, dd.decl_year, pre.emp AS emp_pre, post.emp AS emp_post
FROM dedup dd
LEFT JOIN emp pre ON pre.county_fips=dd.county_fips AND pre.yr=dd.decl_year-1
LEFT JOIN emp post ON post.county_fips=dd.county_fips AND post.yr=dd.decl_year+2
)
SELECT COUNT(*) AS total,
SUM(CASE WHEN emp_pre IS NULL THEN 1 ELSE 0 END) AS null_pre,
SUM(CASE WHEN emp_post IS NULL THEN 1 ELSE 0 END) AS null_post,
SUM(CASE WHEN emp_pre IS NOT NULL AND emp_pre<=50 THEN 1 ELSE 0 END) AS small_pre,
SUM(CASE WHEN emp_pre IS NOT NULL AND emp_post IS NOT NULL AND emp_pre>50 THEN 1 ELSE 0 END) AS retained
FROM joinedquery — 1 rows — 2159 ms
SELECT COUNT(*) AS null_county_rows
FROM disasters.disaster_declarations
WHERE declaration_type='DR' AND pa_program_declared=TRUE
AND CAST("year" AS INT) BETWEEN 2010 AND 2022
AND county_fips IS NULLSources
- FEMA Disaster Declarations Summaries — disasters.disaster_declarations, 2010-2026 observed
Show SQL
SELECT DISTINCT disaster_number, county_fips, declaration_date, incident_begin_date FROM disasters.disaster_declarations WHERE declaration_type='DR' AND pa_program_declared=TRUE - FEMA Public Assistance Funded Projects Details — disasters.public_assistance_projects, used for federal_share_obligated per county-year
- BLS QCEW county employment — econ.county_wages, industry_code=10 (total), own_code=0 (all ownership)
- Speed-tier regression on 3-yr employment growth
Show tool call
robust_regression(outcome="growth", predictors="[lag_code, log_oblig_per_worker, log_emp_pre]") - Leave-one-state-out sensitivity check
Show tool call
sensitivity_analysis(outcome="growth", predictors="[lag_code, log_oblig_per_worker, log_emp_pre]", group_col="state_fips", term="lag_code") - FRBSF: The Local Economic Impact of Natural Disasters
- Tatyana Deryugina publications (IDEAS/RePEc)
- Arora, Tran, Khaitan -- Do Politics Shape Economic Recovery through Federal Disaster Assistance? — Fetch attempt returned HTTP 403 (paywalled); cited from search-result title/abstract only, not a parsed primary-source read