Okun's law in U.S. quarterly data, 1960Q1–2019Q4 (F2-conf-04)
Question
How strongly does the change in the U.S. unemployment rate co-move with quarterly real GDP growth? We estimate the slope β of the linear projection Δu_t = α + β g_t + e_t, where u_t is the quarterly mean of monthly UNRATE (pp), Δu_t = u_t − u_{t−1}, and g_t = 100·ln(GDPC1_t/GDPC1_{t−1}) (percent, quarter-on-quarter, not annualised), and ask whether β is negative and significantly different from zero at 5% using autocorrelation-robust (Newey–West) inference.
Data and exclusions
data/UNRATE.csv: 945 monthly rows;data/GDPC1.csv: 319 quarterly rows (n_input_rows). Both SHA-256 checksums matchdata/README.md. Current vintage, used as given.- One data issue (
data_issues): UNRATE for 2025-10 is empty. It lies outside the window used and is dropped without affecting any analysed quarter. Every quarter 1959Q4–2019Q4 has all three monthly unemployment observations and a GDP value (asserted in the script). - Exclusions (
out/exclusions.csv, quarterly units): 319 quarters in the union of both series → 240 after restricting to 1960Q1–2019Q4 (79 removed; 1959Q4 levels used only to form the 1960Q1 differences) → 240 after dropping missing differences (0 removed). Sample:first_quarter= 1960Q1,last_quarter= 2019Q4,n_analysed= 240.
Method
- OLS of Δu_t on a constant and g_t (statsmodels). The conventional homoskedastic/independent SE (
se_iid) is the naïve baseline. - Newey–West HAC SE with Bartlett kernel (
se_hac), no small-sample degrees-of-freedom correction. Bandwidthhac_lags= 4 from the Newey–West (1994) rule of thumb for the Bartlett kernel, L = floor(4·(T/100)^{2/9}) with T = 240 (= floor(4.86)); the alternative common rule 0.75·T^{1/3} ≈ 4.66 gives the same order. The choice is supported by the residual autocorrelations, which are sizeable at lags 1–2 and small by lag 4 (resid_acf_lags1to4). - 95% CI = β̂ ± 1.96·
se_hac(normal critical value,z_crit_95); two-sided test of H0: β = 0 with the HAC t-statistic. - Deterministic; no random numbers (
random_seed= null). Results were verified by an independent numpy re-implementation (agreement < 1e-14) and by a byte-identical re-run (out/state/checks.md).
Results
- Okun coefficient
beta_hat= −0.256: a 1 percentage point higher quarterly (non-annualised) real GDP growth is associated with a 0.256 pp larger fall in the unemployment rate in the same quarter. - Intercept
alpha_hat= 0.184 pp;r_squared= 0.408. Mean quarterly growthmean_growth= 0.754%, so the implied growth rate consistent with unchanged unemployment is about −α̂/β̂ ≈ 0.72% per quarter (derived fromalpha_hatandbeta_hat). okun_negative_5pct= true: β̂ < 0 and the HAC t-statistic is −7.14 (t_stat_hac, p ≈ 1e-12,p_value_hac).- Figure:
out/figure1.png(scatter of Δu_t against g_t with the fitted OLS line).
Uncertainty
se_iid= 0.0200 (baseline) vsse_hac= 0.0358 (L = 4): the HAC SE is about 1.8 times the naïve SE, consistent with positively autocorrelated residuals (lag-1 autocorrelation 0.39,resid_acf_lags1to4).- 95% HAC CI: [
beta_ci_low,beta_ci_high] = [−0.326, −0.186]. The naïve interval would be [−0.295, −0.217] (baseline_ci_iid_low,baseline_ci_iid_high), i.e. too narrow. - Bandwidth sensitivity (
se_hac_by_lag): SE ranges from 0.029 (L = 0, heteroskedasticity-robust only) to 0.037 (L = 8); with L = 12 it is 0.036. At the largest of these (≈0.037) |t| ≈ 6.9, so the significance conclusion does not depend on the bandwidth.
Limitations and open issues
- β is a reduced-form linear projection coefficient, not a causal effect; it is a full-sample average and ignores possible structural change over 1960–2019 and asymmetries between expansions and recessions.
- Data are the current vintage, not real-time; GDP revisions mean results describe today's view of history.
- Newey–West inference is asymptotic; with strong persistence, fixed-b critical values would widen the CI somewhat, but given |t| ≈ 7 the conclusion would not change. This was not computed.
- The bandwidth is a rule of thumb rather than a data-dependent (Andrews/Newey–West automatic) selection; sensitivity over 0–12 lags is reported instead.
- No other limitations: the task was completed as specified (
feasibility= "complete").