# Okun's law in the United States, 1960Q1–2019Q4 (task F6-conf-03) ## Question How strongly do quarterly changes in the US unemployment rate respond to quarterly real GDP growth, and is the relationship stable? Estimand: β in Δu_t = α + β·g_t + ε_t over 1960Q1–2019Q4, with u_t the quarterly average of monthly UNRATE (pp) and g_t = 100·Δln GDPC1 (%, not annualised). Stability: β estimated separately for 1960Q1–1983Q4 and 1984Q1–2019Q4, plus a classical Chow F-test of joint equality of (α, β). ## Data and exclusions - `data/GDPC1.csv` (319 rows, 1947Q1–2026Q3) and `data/UNRATE.csv` (945 rows, 1948-01 to 2026-09) (`n_input_rows`). SHA-256 hashes match the provenance README (see `out/state/data_audit.md`). - Quarterly u_t = mean of the three months; only complete quarters kept. One UNRATE value is missing (2025-10), which is outside the window and has no effect (`data_issues`). - Exclusion ledger (`out/exclusions.csv`): 314 merged quarters (`n_merged_quarters`) → drop 26 quarters after 2019Q4 (information rule) → drop 48 quarters before 1960Q1 (they only provide lagged levels; 1959Q4 levels feed the 1960Q1 differences) → 240 quarters analysed (`n_analysed`), 1960-01-01 to 2019-10-01 (`sample_start`, `sample_end`); subperiods have 96 and 144 quarters (`n_sub1`, `n_sub2`). - GDPC1 is the current (2026) vintage, i.e. revised data rather than real-time data (`data_issues`). ## Method - Baseline: mean-only prediction of Δu; its RMSE is `baseline_metric`. - Main model: OLS of Δu_t on a constant and g_t over the full sample. Standard errors: Newey–West HAC, Bartlett kernel. The lag was set in advance by the rule floor(4·(n/100)^(2/9)), which gives 4 for n = 240 (`hac_lags`), with no small-sample correction. 95% CI = β ± 1.96·SE (normal critical value). - Subperiods: the same OLS on each subperiod. `out/table1.csv` reports HAC(4) slope SEs for them as well. - Chow test: F = [(SSR_pooled − SSR_1 − SSR_2)/2] / [(SSR_1 + SSR_2)/(n − 4)], compared with F(2, 236) (`chow_df`). - No randomness is used (`random_seed` = null). `out/analysis.py` regenerates `results.json`, `table1.csv` and `figure1.png`. ## Results - Full-sample Okun coefficient: β = −0.256 pp of unemployment per 1% of quarterly real GDP growth (`effect_estimate`). Intercept α = 0.184 pp (`intercept`). With these estimates, unemployment stays flat at about 0.72% quarterly growth (`implied_breakeven_growth_full`). - Fit: residual RMSE 0.250 pp (`model_metric`), against 0.325 pp for the mean-only baseline (`baseline_metric`); R² = 0.408 (`r_squared`). - Subperiod slopes: −0.259 for 1960–1983 (`beta_sub1`) and −0.273 for 1984–2019 (`beta_sub2`). The intercepts are 0.254 (`intercept_sub1`) and 0.152 (`intercept_sub2`). - Chow test: F = 6.09 (`chow_f_stat`), p = 0.0026 (`chow_p_value`). Joint equality of (α, β) is rejected at 5%, so `stability_conclusion` = `unstable`. - Reading: the two slopes differ by only 0.014, much less than either subperiod SE (`beta_sub1_hac_se` = 0.039, `beta_sub2_hac_se` = 0.068). The figure shows that the rejection mainly reflects a lower intercept after 1984, which corresponds to a lower break-even growth rate. It does not show a clear change in the slope. I did not run a slope-only test, so this split is descriptive. - Figure: `out/figure1.png` (scatter with the two subperiod fitted lines). Table: `out/table1.csv`. ## Uncertainty - HAC SE of β = 0.0358 (`effect_se`). 95% CI [−0.326, −0.186] (`effect_ci_low`, `effect_ci_high`). The interval lies entirely below zero, so `conclusion` = `negative_effect`. - The classical OLS SE is 0.020 (`ols_classical_se_beta`), so allowing for serial correlation and heteroskedasticity widens the SE by about 80%. - The HAC SE barely moves with the lag choice: 0.029 at lag 0 (White) and 0.034–0.037 for lags 2–12 (`effect_se_lag_sensitivity`). The sign conclusion holds for every lag tried. ## Limitations and open issues - **The Chow test may over-reject.** The classical Chow F-test assumes homoskedastic, serially uncorrelated errors with the same variance in both subperiods. Residual RMSE falls from 0.277 to 0.218 (`resid_rmse_sub1`, `resid_rmse_sub2`), which fits the Great Moderation, and the full-sample residuals are autocorrelated (HAC SE > OLS SE). Both problems can distort the test's size. A HAC/Wald or variance-robust break test was not run, so the `unstable` verdict depends on the classical test the task prescribes and should not be read as decisive. - **The break date is imposed, not estimated.** 1984Q1 was fixed in advance. No sup-F/Andrews or Bai–Perron test was run, so the true break could be elsewhere or there could be several breaks. The 2008–09 recession, which falls in subperiod 2, likely has a large influence on `beta_sub2` and its wide SE; influence diagnostics were not run. - **The estimate is not causal.** β is a reduced-form association. Output and unemployment are determined jointly, there are no controls (productivity, labour-force participation), and the static specification leaves out lags of g. With lags included, the cumulative response could differ from the contemporaneous β. - **Data vintage and measurement.** The data are revised (2026 vintage, chained 2017 dollars) and do not match what was known in real time. Benchmark revisions and measurement error in GDP growth bias β toward zero (attenuation). Averaging monthly to quarterly unemployment smooths the series and is one source of autocorrelation. - **Linearity and symmetry are assumed.** Possible asymmetry between recessions and expansions, and nonlinearity, were not checked. - **What would invalidate the result.** A coding error in the averaging or the growth scaling (checked: the 1960Q1 values were hand-recomputed and an independent OLS matches exactly, see `out/state/checks.md`), leakage of post-2019 data (checked: the last quarter is 2019Q4), or a lag/kernel choice driving the inference (checked: not the case for the sign of β).