Okun's law in the United States, 1960–2019 (task F6-conf-03)
Question
How strongly does the quarterly change in the US unemployment rate respond to real GDP growth, and has the response been stable? We estimate β in Δu_t = α + β·g_t + ε_t for 1960Q1–2019Q4. Here u_t is the quarterly average of monthly UNRATE (percent) and g_t = 100·Δln GDPC1 (quarterly percent, not annualised). We check stability with separate fits for 1960Q1–1983Q4 and 1984Q1–2019Q4 and with a classical Chow test.
Data and exclusions
Inputs are the raw FRED files data/GDPC1.csv (319 rows) and data/UNRATE.csv (945 rows) (n_input_rows). Their SHA-256 hashes match data/README.md (details in out/state/data_audit.md). Neither file has gaps in its date grid or duplicate dates. The one missing value is UNRATE for 2025-10, which is outside the sample. The full exclusion ledger is in out/exclusions.csv:
- drop 1 blank month;
- keep months 1959-10 to 2019-12 (723 months), which become 241 complete quarters;
- keep GDP quarters 1959Q4–2019Q4 (241);
- take first differences, which drops 1959Q4.
That leaves 240 regression quarters (n_analysed), from sample_start = 1960-01-01 to sample_end = 2019-10-01. Subperiods have n_sub1 = 96 and n_sub2 = 144 quarters. No data after 2019Q4 enter any estimate. Data issues and how each was handled are listed under data_issues.
Method
- Baseline: the mean-only prediction of Δu, scored by RMSE (
baseline_metric). - Main model: OLS of Δu_t on a constant and g_t over the full sample.
- Inference: Newey–West HAC standard errors with a Bartlett kernel. The lag length is the Newey–West (1994) rule floor(4·(T/100)^{2/9}), which gives 4 for T = 240 (
hac_lags). statsmodels' small-sample correction n/(n−k) is applied. The 95% CI is β ± 1.96·SE. - Subperiods: the same regression is fitted on each subperiod. Table 1 reports HAC standard errors using the same lag rule: 3 lags for subperiod 1 and 4 for subperiod 2 (
hac_lags_sub1,hac_lags_sub2). - Chow test: F = [(SSR_pooled − SSR_1 − SSR_2)/2] / [(SSR_1 + SSR_2)/(n−4)], compared with F(2, 236) (
chow_df). - Supplementary check (not required by the task): a dummy-interaction regression with HAC errors. It tests the slope difference, the intercept difference, and both jointly without assuming equal error variances.
No randomness is used (random_seed = null). Everything is produced by out/analysis.py, including out/table1.csv and out/figure1.png.
Results
- Okun coefficient (full sample): β = −0.256 (
effect_estimate), with intercept α = 0.184 pp (intercept). Each extra 1% of quarterly real growth goes with a quarter-on-quarter change in unemployment about 0.26 pp lower. On these point estimates, unemployment is flat at roughly 0.7% quarterly growth (0.184/0.256, computed frominterceptandeffect_estimate). - Fit: the residual RMSE is 0.250 pp (
model_metric), against 0.325 pp for the mean-only baseline (baseline_metric). R² is 0.41 (r_squared_full). - Subperiod slopes: −0.259 for 1960–83 (
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). Equality of (α, β) is rejected at 5%, sostability_conclusion=unstable. - What drives the rejection: it is not a change in the slope. A HAC test of the slope difference gives p = 0.85 (
hac_wald_slope_diff_p). Figure 1 shows two nearly parallel fitted lines, with the post-1984 line shifted down. The intercept difference alone is not significant under HAC (p = 0.26,hac_wald_intercept_diff_p), but the HAC joint test rejects (p = 0.005,hac_wald_joint_p). The two coefficients are estimated with correlated errors, so the break appears in (α, β) jointly. Saying it is an intercept shift is our reading of the point estimates, not something we tested. - Conclusion code:
conclusion=negative_effect.
Table 1 (out/table1.csv):
| period | n | intercept | slope | slope_se (HAC) |
|---|---|---|---|---|
| full 1960Q1–2019Q4 | 240 | 0.184 | −0.256 | 0.036 |
| 1960Q1–1983Q4 | 96 | 0.254 | −0.259 | 0.039 |
| 1984Q1–2019Q4 | 144 | 0.152 | −0.273 | 0.069 |
Uncertainty
- HAC standard error and CI: the HAC SE of β is 0.036 (
effect_se), giving a 95% CI of [−0.326, −0.185] (effect_ci_low,effect_ci_high). The interval is well below zero. - Comparison with classical OLS: the classical OLS SE is 0.020 (
effect_se_ols_classical). Correcting for heteroskedasticity and autocorrelation therefore widens the interval by about 80%. - Lag sensitivity: with 8 lags the SE is 0.037 (
effect_se_hac_lags8), so the result does not depend much on the lag choice. - Subperiods: the post-1984 slope is estimated less precisely (Table 1).
- Chow p-value: its validity rests on the classical assumptions discussed below.
Limitations and open issues
- The classical Chow test's assumptions are violated. It assumes homoskedastic, serially uncorrelated errors with the same variance in both regimes. The residual variance falls from 0.079 to 0.048 between subperiods (
resid_var_sub1,resid_var_sub2; this is the Great Moderation), and the gap between the HAC and classical SEs points to serial correlation. The nominal p-value may therefore be miscalibrated. The HAC joint Wald test reaches the same answer (hac_wald_joint_p), which is reassuring. However, it is a single asymptotic test with a rule-of-thumb lag length. - The break date is fixed in advance (1984Q1), not estimated. We did not run unknown-break tests (Quandt–Andrews/sup-F) or rolling regressions. Rejecting equality at 1984 does not show that the break happened then, or only once.
- "Unstable" is mostly about the intercept, not Okun's coefficient. The slope itself looks stable (
hac_wald_slope_diff_p). A lower intercept is consistent with slower trend growth or labour-force changes after 1984, but we did not test either explanation. Readingunstableas "Okun's coefficient changed" would be wrong. - Specification and causality. The static difference form leaves out lagged growth: unemployment responds to output with a lag, and jobless recoveries matter here. It also ignores possible asymmetry between recessions and expansions and simultaneity between output and unemployment. β is a reduced-form association, not a structural effect, and OLS would be biased for any structural parameter. We did not run residual diagnostics beyond the SE comparison: no formal autocorrelation or normality tests, and no check of influential observations. The large 1980 and 2008–09 quarters visible in Figure 1 could be influential.
- Data vintage. The data are the 2026 vintage: revised, in chained 2017 dollars, with seasonal factors as of retrieval. Estimates could differ with real-time data or earlier vintages. Averaging monthly UNRATE into quarters is as the task specifies.
- What would invalidate the result. The result would be wrong if either input file did not match its README description, if quarters had been misaligned, or if growth had been annualised. Code assertions and the checks in
out/state/checks.mdguard against these failures.