Okun's law in the United States, 1960–2019 (task F6-conf-03)
Question
How strongly do quarterly changes in the US unemployment rate (Δu_t, pp) respond to quarterly real GDP growth (g_t = 100·Δln GDPC1, % q/q, not annualised), in Δu_t = α + β·g_t + ε_t over 1960Q1–2019Q4, and is the relation stable between 1960Q1–1983Q4 and 1984Q1–2019Q4?
Data and exclusions
data/GDPC1.csv(319 rows, 1947Q1–2026Q3) anddata/UNRATE.csv(945 rows, 1948-01–2026-09) (n_input_rows); SHA-256 checksums matchdata/README.md(seeout/state/data_audit.md).- Quarterly u_t = mean of the three monthly UNRATE values; quarters with fewer than 3 months are set to missing. Only one month is missing (2025-10), and it lies outside the sample (
data_issues). - Exclusions (
out/exclusions.csv): the 319 quarters were restricted to 1960Q1–2019Q4 (79 removed; 1959Q4 levels are used only to form the 1960Q1 differences). No missing values were found inside the window, which leavesn_analysed= 240 quarters,n_sub1= 96 andn_sub2= 144. No data after 2019Q4 enters any estimate, and the script asserts this.
Method
- Baseline: a 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 (
effect_estimate,intercept), scored by in-sample residual RMSE (model_metric). - Uncertainty: Newey–West HAC standard error with a Bartlett kernel. The lag is set by the rule floor(4·(n/100)^{2/9}) = 4 (
hac_lags). The 95% CI is β ± 1.96·SE (normal approximation). - Stability: separate OLS fits on each subperiod (
beta_sub1,beta_sub2; subperiod slope SEs intable1.csvare also HAC, with lags 3 and 4). A classical Chow SSR F-test of equal (α, β), with F(2, 236) (chow_f_stat,chow_p_value). - Supplementary checks I added (
supp_*keys): a HAC-robust Wald test using subperiod-2 dummy and interaction terms, run jointly and for the slope alone, plus a residual-variance ratio test. - There is no randomness (
random_seed= null).out/analysis.pyregenerates every output deterministically.
Results
| period | n | α | β | HAC SE(β) |
|---|---|---|---|---|
| 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 |
(Source: out/table1.csv, and intercept, effect_estimate, effect_se, beta_sub1, beta_sub2, intercept_sub1, intercept_sub2, se_sub1_hac, se_sub2_hac.) |
- Coefficient: β = −0.256 (
effect_estimate). A 1 percentage-point higher quarterly real GDP growth (about 4 pp annualised) goes with a quarter-on-quarter fall of about 0.26 pp in the unemployment rate. The implied growth rate that keeps unemployment unchanged is −α/β ≈ 0.72% per quarter (frominterceptandeffect_estimate). - Fit: the residual RMSE is 0.250 pp (
model_metric), against 0.325 pp for the mean-only baseline (baseline_metric); R² = 0.41 (r_squared). - Conclusion code:
negative_effect(conclusion), because the 95% CI lies entirely below zero. - Stability: the Chow test rejects equality of (α, β): F = 6.09, p = 0.0026 (
chow_f_stat,chow_p_value), sostability_conclusion=unstable. The rejection comes from the intercept, not the slope:- The subperiod slopes are almost identical: −0.259 vs −0.273 (
beta_sub1,beta_sub2). - The HAC Wald test of slope equality alone gives p = 0.85 (
supp_hac_wald_slope_p). - The intercept falls from 0.254 to 0.152 (
intercept_sub1,intercept_sub2). - The joint HAC Wald test also rejects, p = 0.005 (
supp_hac_wald_joint_p).
- The subperiod slopes are almost identical: −0.259 vs −0.273 (
- Figure:
out/figure1.pngshows the scatter of Δu against g with the two subperiod fitted lines.
Uncertainty
- HAC SE(β) = 0.036 (
effect_se); 95% CI [−0.326, −0.185] (effect_ci_low,effect_ci_high). The HAC SE is about 1.8 times the classical OLS SE of 0.020 (ols_classical_se). - The SE barely depends on the lag choice: 0.029 at lag 0 and 0.034–0.037 at lags 2–12 (
sensitivity_effect_se_by_lag). The sign conclusion holds at every lag tried. - The subperiod-2 slope is estimated less precisely (HAC SE 0.069,
se_sub2_hac).
Limitations and open issues
- Validity of the classical Chow test. It assumes homoskedastic, serially uncorrelated errors with the same variance in both subperiods. That assumption fails here: the residual variance in subperiod 1 is about 1.63 times that in subperiod 2, and a variance-ratio F-test gives p = 0.009 (
supp_resid_var_ratio_sub1_over_sub2,supp_var_ratio_F_p_two_sided). The classical p-value (chow_p_value) may therefore be miscalibrated. The HAC Wald test (supp_hac_wald_joint_p= 0.005) supports the same rejection, which makes it more credible, but neither test allows for unequal variances explicitly in the classical form required by the task. - What "unstable" means. The instability is in the intercept, i.e. the growth rate that keeps unemployment unchanged, which reflects trend productivity and labour-force growth. There is no evidence that the Okun slope itself changed. Reading
unstableas "the output–unemployment sensitivity changed" would be wrong. - Fixed, chosen break date. The 1984Q1 break was imposed, not estimated. A Chow test at a chosen date says nothing about whether this is the best break date, or whether there are several breaks or gradual drift. No sup-F or rolling analysis was done (it is outside the task).
- Reduced form, not causal. β is a contemporaneous association. Omitted dynamics, such as lagged growth, would change it, and simultaneity rules out a causal reading. Residual serial correlation is handled only through the HAC SEs; the model was not re-specified.
- Data vintage. GDPC1 is the 2026 vintage. Revised data can differ from real-time data, and the BLS household-survey methodology changed over the period (e.g. 1994). Neither was examined.
- Inference approximations. The HAC lag uses a rule of thumb; small-sample HAC bias was not corrected beyond the degrees-of-freedom correction, and the CI uses a normal critical value. Large recession outliers, such as 1980 and 2008–09, were not tested for influence.
- What would invalidate the result. A misaligned quarterly average, data after 2019 leaking into the sample, or a non-stationary relation. The first two were checked (
out/state/checks.md); the third was not tested formally.