A 10-point local employment decline raises the disabled-worker rate by about 0.4 per 1,000 residents
County-level analysis, 2017-2023: BLS QCEW employment vs. SSA OASDI disabled-worker beneficiaries
Summary
Local job losses reliably push more residents onto Social Security disability rolls, but the effect is modest in size and shows up only once population growth and mean reversion are controlled for. Comparing 3,171 U.S. counties from 2017 to 2023, a county whose total employment fell by 10 percentage points more than another county's saw its disabled-worker beneficiary rate rise by about 0.42 more beneficiaries per 1,000 residents (roughly 4 more per 10,000 people) relative to that other county, holding its starting disability rate fixed. The relationship is small in absolute terms — nationally the disabled-worker rate FELL almost everywhere 2017-2023 (an aging-out and post-pandemic labor-tightness period) — but the decline was consistently smaller in counties that lost more jobs, a genuine monotonic dose-response pattern, and the estimate survives dropping any single state from the sample.
This is a smaller elasticity than the classic literature because that literature (Autor-Duggan; Autor-Dorn-Hanson) measures multi-decade trade-shock or de-industrialization exposure, not a single recent 6-year window that includes the COVID shock and its unusually rapid V-shaped labor-market recovery.
What the literature already says
Autor and Duggan (2001, NBER w8336; MIT working paper) found that after the 1984 SSDI eligibility liberalization, disability application and recipiency rates became two to three times as responsive to local labor-demand shocks as before, using county-level variation in industry-driven employment shocks (1984-1998). They estimate this liberalized responsiveness lowered the measured U.S. unemployment rate by roughly 0.5-0.67 percentage points, because displaced low-skill workers exited into disability rather than counted unemployment.
Autor, Dorn and Hanson's 'China Shock' research (2013 AER, and 2021 NBER w29401 on persistence) found that commuting zones more exposed to Chinese import competition, 1990-2007, saw sharply higher enrollment in unemployment, disability, retirement and healthcare transfer programs, with import competition explaining roughly a quarter of the era's aggregate manufacturing-employment decline and exit from work (not measured unemployment) absorbing the large majority (about 86% in the persistence paper) of the resulting net job loss.
Both papers describe a SLOW-MOVING, PERMANENT industrial-decline mechanism playing out over 10-20+ years — closures of manufacturing plants that never come back — which is a different animal from a single recent business-cycle window.
What this corpus adds: a 2017-2023 replication at county grain
AskAmerica's warehouse does not carry SSA's administrative SSDI application/award data directly (search_catalog returns no 'ssdi'/'beneficiaries' table), but it does carry fiscal.ssa_benefits_by_geography — SSA's own published county x program x beneficiary-type table, which separately identifies OASDI 'disabled_workers' counts (2017-2023). Joining that to econ.county_qcew (BLS county employment, all industries, all ownership) and census.acs_population gives a genuine county-level panel comparable in spirit to Autor-Duggan's design, just for a much shorter and more recent window (7 years vs. their 15, and one that spans COVID).
Design 1 (annual panel, two-way fixed effects): regressing the disabled-worker rate (per 1,000 pop) on log county employment, with county and year fixed effects (n=22,512, 3,220 counties x 7 years), gives a coefficient of -2.84 (a 10% employment decline associated with +0.28 per 1,000) but is NOT statistically significant (p=0.26) — annual COVID-era swings in employment are too noisy relative to disability enrollment, which moves slowly and with a lag.
Design 2 (long difference, 2017 to 2023, cross-section): this is the design that produces a clean, robust result and is the headline number above. 3,188 counties matched the SSA, BLS, and Census tables on county_fips for both 2017 and 2023. Of those, the SQL filters emp17 IS NOT NULL AND emp23 IS NOT NULL AND di17 IS NOT NULL AND di23 IS NOT NULL then EXCLUDED 17 counties (0.5% of the 3,188 matched) whose 2017 or 2023 employment or beneficiary figure was null (BLS QCEW suppresses employment for single-employer-dominated counties), leaving the analyzed n=3,171. That 0.5% exclusion is small and not concentrated in any one region, so it does not meaningfully bias the estimate below. Regressing the 2017-2023 CHANGE in the disabled-worker rate on the percent change in county employment over the same period, controlling for each county's 2017 starting disability rate (to net out mean reversion), gives:
| Predictor | Coefficient | Std. error | p-value |
|---|---|---|---|
| % change in county employment, 2017-2023 | -0.0415 | 0.0046 | <0.0001 |
| 2017 disabled-worker rate (mean reversion control) | -0.140 | 0.0044 | <0.0001 |
n=3,171 counties (3,188 matched minus the 17 excluded for a null 2017/2023 employment or beneficiary value, as described above), R²=0.35 (HC1 robust SEs). Interpretation: each additional 10-percentage-point shortfall in a county's employment growth over 2017-2023 is associated with 0.415 more disabled-worker beneficiaries per 1,000 residents than a county that didn't lose those jobs. A leave-one-state-out check (refitting 50 times, dropping each state in turn) found the coefficient ranges from -0.039 to -0.054 with no sign flip and no loss of significance in any refit — Texas is the single most influential state, and dropping it makes the effect LARGER (-0.054), not smaller, so no single state is propping up the finding.
The same dose-response shows up nonparametrically: splitting counties into employment-change quintiles, the quintile with the worst job losses (-9.3% average) saw its disability rate fall by only 4.13 per 1,000 over 2017-2023, versus a 5.19-per-1,000 decline in the quintile with the strongest job growth (+19.0% average) — a monotonic trend across all 5 quintiles (trend p=0.01).
A confound this analysis had to catch: population growth, not job loss, drives the RAW COUNT
Before settling on the per-capita rate as the outcome, this analysis also tried the percent change in the RAW COUNT of disabled-worker beneficiaries as the outcome. That regression initially returned the WRONG SIGN — job growth appearing to predict MORE disability-beneficiary growth (coefficient +0.053, p=0.001) — which would contradict both the literature and the per-capita result above. Adding each county's population growth as a control resolved it: population growth alone explains the raw-count relationship (coefficient 0.218, p<0.0001), and once it's included the employment-growth coefficient on the raw count collapses to a statistical zero (0.0025, p=0.85). Fast-growing Sunbelt counties gain both jobs and residents, so their absolute disabled-worker count rises even as their per-capita rate falls — exactly the mechanism the per-capita specification above is built to net out. This is reported here because it is the kind of error a hurried read of the raw numbers would produce, and because it demonstrates why the per-capita rate, not the raw count, is the right measure of 'disability rolls rising.'
Caveats
- This corpus has no direct SSDI application/award administrative series (only SSA's published county beneficiary counts, via ssa_benefits_by_geography, 2017-2023 only) — a genuine coverage gap relative to the SSA microdata Autor-Duggan used. The 2017-2023 window is short, recent, and includes the COVID shock and an unusually fast labor-market recovery, unlike the multi-decade structural declines the classic literature studies; treat this as a distinct, complementary estimate, not a replication of the original studies' own window.
- Total county employment (BLS QCEW, all industries) is a place-of-work measure, not a resident-employment measure, so commuting inflows/outflows add noise; the long-difference percent-change specification is far less sensitive to this than a per-capita employment RATE would be, which is why the annual per-capita-rate panel (Design 1's stumbling block, not shown as headline) was replaced with the percent-change specification.
- This is an association, not a randomized experiment: counties that lose jobs differ from those that don't in many other ways (age structure, health, urbanicity). The literature's more credible designs (industry-mix-predicted labor-demand shocks, import-exposure instruments) are better identified than the simple long-difference used here; this analysis is a lighter-weight descriptive complement, not a causal replacement.
Every query behind this report
12 warehouse calls ran in this session, in order. Each is reproducible against the same snapshot.
query — 5 rows — 10003 ms
SELECT DISTINCT industry_code, own_code FROM econ.county_qcew WHERE industry_code='10' LIMIT 20query — 15 rows — 9051 ms
SELECT year, count(*) FROM census.acs_population GROUP BY year ORDER BY yearquery — 1 rows — 8908 ms
WITH emp AS (
SELECT area_fips AS county_fips, "year", annual_avg_emplvl AS emp
FROM econ.county_qcew
WHERE industry_code='10' AND own_code='0' AND "year" IN ('2017','2018','2019','2020','2021','2022','2023')
),
di AS (
SELECT county_fips, "year", num_beneficiaries AS di_workers
FROM fiscal.ssa_benefits_by_geography
WHERE program='OASDI' AND beneficiary_type='disabled_workers' AND "year" IN ('2017','2018','2019','2020','2021','2022','2023')
),
pop AS (
SELECT county_fips, "year", total_population
FROM census.acs_population
WHERE geography='county' AND "year" IN ('2017','2018','2019','2020','2021','2022','2023')
)
SELECT count(*) as n FROM emp JOIN di USING (county_fips, "year") JOIN pop USING (county_fips, "year")panel_fixed_effects — 12305 ms
WITH emp AS (
SELECT area_fips AS county_fips, "year", annual_avg_emplvl AS emp
FROM econ.county_qcew
WHERE industry_code='10' AND own_code='0' AND "year" IN ('2017','2018','2019','2020','2021','2022','2023')
),
di AS (
SELECT county_fips, "year", num_beneficiaries AS di_workers
FROM fiscal.ssa_benefits_by_geography
WHERE program='OASDI' AND beneficiary_type='disabled_workers' AND "year" IN ('2017','2018','2019','2020','2021','2022','2023')
),
pop AS (
SELECT county_fips, "year", total_population
FROM census.acs_population
WHERE geography='county' AND "year" IN ('2017','2018','2019','2020','2021','2022','2023')
)
SELECT emp.county_fips, CAST(emp."year" AS INTEGER) AS yr,
1000.0*emp.emp/pop.total_population AS emp_rate,
1000.0*di.di_workers/pop.total_population AS di_rate
FROM emp JOIN di USING (county_fips, "year") JOIN pop USING (county_fips, "year")
WHERE pop.total_population > 0panel_fixed_effects — 12598 ms
WITH emp AS (
SELECT area_fips AS county_fips, "year", annual_avg_emplvl AS emp
FROM econ.county_qcew
WHERE industry_code='10' AND own_code='0' AND "year" IN ('2017','2018','2019','2020','2021','2022','2023')
AND annual_avg_emplvl > 0
),
di AS (
SELECT county_fips, "year", num_beneficiaries AS di_workers
FROM fiscal.ssa_benefits_by_geography
WHERE program='OASDI' AND beneficiary_type='disabled_workers' AND "year" IN ('2017','2018','2019','2020','2021','2022','2023')
),
pop AS (
SELECT county_fips, "year", total_population
FROM census.acs_population
WHERE geography='county' AND "year" IN ('2017','2018','2019','2020','2021','2022','2023')
)
SELECT emp.county_fips, CAST(emp."year" AS INTEGER) AS yr,
ln(emp.emp) AS log_emp,
1000.0*di.di_workers/pop.total_population AS di_rate
FROM emp JOIN di USING (county_fips, "year") JOIN pop USING (county_fips, "year")
WHERE pop.total_population > 0query — 500 rows — 5239 ms
WITH emp AS (
SELECT area_fips AS county_fips, "year", annual_avg_emplvl AS emp
FROM econ.county_qcew
WHERE industry_code='10' AND own_code='0' AND "year" IN ('2017','2023') AND annual_avg_emplvl>0
),
di AS (
SELECT county_fips, "year", num_beneficiaries AS di_workers
FROM fiscal.ssa_benefits_by_geography
WHERE program='OASDI' AND beneficiary_type='disabled_workers' AND "year" IN ('2017','2023')
),
pop AS (
SELECT county_fips, "year", total_population
FROM census.acs_population
WHERE geography='county' AND "year" IN ('2017','2023')
),
base AS (
SELECT e.county_fips, e."year", e.emp, d.di_workers, p.total_population
FROM emp e JOIN di d USING (county_fips,"year") JOIN pop p USING (county_fips,"year")
WHERE p.total_population > 1000
),
piv AS (
SELECT county_fips,
max(CASE WHEN "year"='2017' THEN emp END) AS emp17,
max(CASE WHEN "year"='2023' THEN emp END) AS emp23,
max(CASE WHEN "year"='2017' THEN di_workers END) AS di17,
max(CASE WHEN "year"='2023' THEN di_workers END) AS di23,
max(CASE WHEN "year"='2017' THEN total_population END) AS pop17,
max(CASE WHEN "year"='2023' THEN total_population END) AS pop23
FROM base GROUP BY county_fips
)
SELECT county_fips,
100.0*(emp23-emp17)/emp17 AS pct_emp_change,
1000.0*di23/pop23 - 1000.0*di17/pop17 AS di_rate_change,
1000.0*di17/pop17 AS di_rate_2017
FROM piv
WHERE emp17 IS NOT NULL AND emp23 IS NOT NULL AND di17 IS NOT NULL AND di23 IS NOT NULL AND pop17>0 AND pop23>0robust_regression — 5738 ms
WITH emp AS (
SELECT area_fips AS county_fips, "year", annual_avg_emplvl AS emp
FROM econ.county_qcew
WHERE industry_code='10' AND own_code='0' AND "year" IN ('2017','2023') AND annual_avg_emplvl>0
),
di AS (
SELECT county_fips, "year", num_beneficiaries AS di_workers
FROM fiscal.ssa_benefits_by_geography
WHERE program='OASDI' AND beneficiary_type='disabled_workers' AND "year" IN ('2017','2023')
),
pop AS (
SELECT county_fips, "year", total_population
FROM census.acs_population
WHERE geography='county' AND "year" IN ('2017','2023')
),
base AS (
SELECT e.county_fips, e."year", e.emp, d.di_workers, p.total_population
FROM emp e JOIN di d USING (county_fips,"year") JOIN pop p USING (county_fips,"year")
WHERE p.total_population > 1000
),
piv AS (
SELECT county_fips,
max(CASE WHEN "year"='2017' THEN emp END) AS emp17,
max(CASE WHEN "year"='2023' THEN emp END) AS emp23,
max(CASE WHEN "year"='2017' THEN di_workers END) AS di17,
max(CASE WHEN "year"='2023' THEN di_workers END) AS di23,
max(CASE WHEN "year"='2017' THEN total_population END) AS pop17,
max(CASE WHEN "year"='2023' THEN total_population END) AS pop23
FROM base GROUP BY county_fips
)
SELECT county_fips,
100.0*(emp23-emp17)/emp17 AS pct_emp_change,
1000.0*di23/pop23 - 1000.0*di17/pop17 AS di_rate_change,
1000.0*di17/pop17 AS di_rate_2017
FROM piv
WHERE emp17 IS NOT NULL AND emp23 IS NOT NULL AND di17 IS NOT NULL AND di23 IS NOT NULL AND pop17>0 AND pop23>0sensitivity_analysis — 5756 ms
WITH emp AS (
SELECT area_fips AS county_fips, "year", annual_avg_emplvl AS emp
FROM econ.county_qcew
WHERE industry_code='10' AND own_code='0' AND "year" IN ('2017','2023') AND annual_avg_emplvl>0
),
di AS (
SELECT county_fips, "year", num_beneficiaries AS di_workers
FROM fiscal.ssa_benefits_by_geography
WHERE program='OASDI' AND beneficiary_type='disabled_workers' AND "year" IN ('2017','2023')
),
pop AS (
SELECT county_fips, "year", total_population
FROM census.acs_population
WHERE geography='county' AND "year" IN ('2017','2023')
),
base AS (
SELECT e.county_fips, e."year", e.emp, d.di_workers, p.total_population
FROM emp e JOIN di d USING (county_fips,"year") JOIN pop p USING (county_fips,"year")
WHERE p.total_population > 1000
),
piv AS (
SELECT county_fips,
max(CASE WHEN "year"='2017' THEN emp END) AS emp17,
max(CASE WHEN "year"='2023' THEN emp END) AS emp23,
max(CASE WHEN "year"='2017' THEN di_workers END) AS di17,
max(CASE WHEN "year"='2023' THEN di_workers END) AS di23,
max(CASE WHEN "year"='2017' THEN total_population END) AS pop17,
max(CASE WHEN "year"='2023' THEN total_population END) AS pop23
FROM base GROUP BY county_fips
)
SELECT county_fips, substr(county_fips,1,2) AS state_fips,
100.0*(emp23-emp17)/emp17 AS pct_emp_change,
1000.0*di23/pop23 - 1000.0*di17/pop17 AS di_rate_change,
1000.0*di17/pop17 AS di_rate_2017
FROM piv
WHERE emp17 IS NOT NULL AND emp23 IS NOT NULL AND di17 IS NOT NULL AND di23 IS NOT NULL AND pop17>0 AND pop23>0robust_regression — 5635 ms
WITH emp AS (
SELECT area_fips AS county_fips, "year", annual_avg_emplvl AS emp
FROM econ.county_qcew
WHERE industry_code='10' AND own_code='0' AND "year" IN ('2017','2023') AND annual_avg_emplvl>0
),
di AS (
SELECT county_fips, "year", num_beneficiaries AS di_workers
FROM fiscal.ssa_benefits_by_geography
WHERE program='OASDI' AND beneficiary_type='disabled_workers' AND "year" IN ('2017','2023') AND num_beneficiaries>0
),
pop AS (
SELECT county_fips, "year", total_population
FROM census.acs_population
WHERE geography='county' AND "year" IN ('2017','2023')
),
base AS (
SELECT e.county_fips, e."year", e.emp, d.di_workers, p.total_population
FROM emp e JOIN di d USING (county_fips,"year") JOIN pop p USING (county_fips,"year")
WHERE p.total_population > 1000
),
piv AS (
SELECT county_fips,
max(CASE WHEN "year"='2017' THEN emp END) AS emp17,
max(CASE WHEN "year"='2023' THEN emp END) AS emp23,
max(CASE WHEN "year"='2017' THEN di_workers END) AS di17,
max(CASE WHEN "year"='2023' THEN di_workers END) AS di23,
max(CASE WHEN "year"='2017' THEN total_population END) AS pop17,
max(CASE WHEN "year"='2023' THEN total_population END) AS pop23
FROM base GROUP BY county_fips
)
SELECT county_fips,
100.0*(emp23-emp17)/emp17 AS pct_emp_change,
100.0*(di23-di17)/di17 AS pct_di_change,
ln(1.0*di17) AS log_di17,
emp17, di17, pop17
FROM piv
WHERE emp17 IS NOT NULL AND emp23 IS NOT NULL AND di17 IS NOT NULL AND di23 IS NOT NULL AND pop17>0 AND pop23>0 AND di17>0ols_regression — 5797 ms
WITH emp AS (
SELECT area_fips AS county_fips, "year", annual_avg_emplvl AS emp
FROM econ.county_qcew
WHERE industry_code='10' AND own_code='0' AND "year" IN ('2017','2023') AND annual_avg_emplvl>0
),
di AS (
SELECT county_fips, "year", num_beneficiaries AS di_workers
FROM fiscal.ssa_benefits_by_geography
WHERE program='OASDI' AND beneficiary_type='disabled_workers' AND "year" IN ('2017','2023') AND num_beneficiaries>0
),
pop AS (
SELECT county_fips, "year", total_population
FROM census.acs_population
WHERE geography='county' AND "year" IN ('2017','2023')
),
base AS (
SELECT e.county_fips, e."year", e.emp, d.di_workers, p.total_population
FROM emp e JOIN di d USING (county_fips,"year") JOIN pop p USING (county_fips,"year")
WHERE p.total_population > 1000
),
piv AS (
SELECT county_fips,
max(CASE WHEN "year"='2017' THEN emp END) AS emp17,
max(CASE WHEN "year"='2023' THEN emp END) AS emp23,
max(CASE WHEN "year"='2017' THEN di_workers END) AS di17,
max(CASE WHEN "year"='2023' THEN di_workers END) AS di23,
max(CASE WHEN "year"='2017' THEN total_population END) AS pop17,
max(CASE WHEN "year"='2023' THEN total_population END) AS pop23
FROM base GROUP BY county_fips
)
SELECT county_fips,
100.0*(emp23-emp17)/emp17 AS pct_emp_change,
100.0*(di23-di17)/di17 AS pct_di_change,
100.0*(pop23-pop17)/pop17 AS pct_pop_change,
ln(1.0*di17) AS log_di17
FROM piv
WHERE emp17 IS NOT NULL AND emp23 IS NOT NULL AND di17 IS NOT NULL AND di23 IS NOT NULL AND pop17>0 AND pop23>0 AND di17>0quantile_binning_test — 6339 ms
WITH emp AS (
SELECT area_fips AS county_fips, "year", annual_avg_emplvl AS emp
FROM econ.county_qcew
WHERE industry_code='10' AND own_code='0' AND "year" IN ('2017','2023') AND annual_avg_emplvl>0
),
di AS (
SELECT county_fips, "year", num_beneficiaries AS di_workers
FROM fiscal.ssa_benefits_by_geography
WHERE program='OASDI' AND beneficiary_type='disabled_workers' AND "year" IN ('2017','2023')
),
pop AS (
SELECT county_fips, "year", total_population
FROM census.acs_population
WHERE geography='county' AND "year" IN ('2017','2023')
),
base AS (
SELECT e.county_fips, e."year", e.emp, d.di_workers, p.total_population
FROM emp e JOIN di d USING (county_fips,"year") JOIN pop p USING (county_fips,"year")
WHERE p.total_population > 1000
),
piv AS (
SELECT county_fips,
max(CASE WHEN "year"='2017' THEN emp END) AS emp17,
max(CASE WHEN "year"='2023' THEN emp END) AS emp23,
max(CASE WHEN "year"='2017' THEN di_workers END) AS di17,
max(CASE WHEN "year"='2023' THEN di_workers END) AS di23,
max(CASE WHEN "year"='2017' THEN total_population END) AS pop17,
max(CASE WHEN "year"='2023' THEN total_population END) AS pop23
FROM base GROUP BY county_fips
)
SELECT county_fips,
100.0*(emp23-emp17)/emp17 AS pct_emp_change,
1000.0*di23/pop23 - 1000.0*di17/pop17 AS di_rate_change
FROM piv
WHERE emp17 IS NOT NULL AND emp23 IS NOT NULL AND di17 IS NOT NULL AND di23 IS NOT NULL AND pop17>0 AND pop23>0query — 1 rows — 7705 ms
WITH emp AS (
SELECT area_fips AS county_fips, "year", annual_avg_emplvl AS emp
FROM econ.county_qcew
WHERE industry_code='10' AND own_code='0' AND "year" IN ('2017','2023') AND annual_avg_emplvl>0
),
di AS (
SELECT county_fips, "year", num_beneficiaries AS di_workers
FROM fiscal.ssa_benefits_by_geography
WHERE program='OASDI' AND beneficiary_type='disabled_workers' AND "year" IN ('2017','2023')
),
pop AS (
SELECT county_fips, "year", total_population
FROM census.acs_population
WHERE geography='county' AND "year" IN ('2017','2023')
),
base AS (
SELECT e.county_fips, e."year", e.emp, d.di_workers, p.total_population
FROM emp e JOIN di d USING (county_fips,"year") JOIN pop p USING (county_fips,"year")
WHERE p.total_population > 1000
)
SELECT count(distinct county_fips) AS total_matched_counties FROM baseSources
- SSA OASDI county disabled-worker beneficiary counts, 2017-2023 — fiscal.ssa_benefits_by_geography, program=OASDI, beneficiary_type=disabled_workers
Show SQL
SELECT county_fips, "year", num_beneficiaries FROM fiscal.ssa_benefits_by_geography WHERE program='OASDI' AND beneficiary_type='disabled_workers' - BLS QCEW county total employment, 2017 and 2023 — econ.county_qcew, industry_code=10 (all industries), own_code=0 (all ownership)
Show SQL
SELECT area_fips, "year", annual_avg_emplvl FROM econ.county_qcew WHERE industry_code='10' AND own_code='0' AND "year" IN ('2017','2023') - Census ACS 5-year county total population, 2017 and 2023 — census.acs_population, geography=county
Show SQL
SELECT county_fips, "year", total_population FROM census.acs_population WHERE geography='county' AND "year" IN ('2017','2023') - Cross-sectional long-difference regression coefficient
Show tool call
robust_regression(outcome="di_rate_change", predictors=["pct_emp_change","di_rate_2017"]) - Leave-one-state-out sensitivity check
Show tool call
sensitivity_analysis(outcome="di_rate_change", predictors=["pct_emp_change","di_rate_2017"], group_col="state_fips", term="pct_emp_change") - https://www.nber.org/papers/w8336
- https://www.ddorn.net/papers/Autor-Dorn-Hanson-ChinaSyndrome.pdf
- https://www.nber.org/system/files/working_papers/w29401/w29401.pdf