F6-conf-03 — Okun's law in the United States, 1960–2019: coefficient, uncertainty and stability
Scientific question
How strongly do quarterly changes in the US unemployment rate respond to real output growth, and has that response been stable? The estimand is the Okun coefficient β in the difference form Δu_t = α + β·g_t + ε_t over 1960Q1–2019Q4, where Δu_t is the change in the quarterly-average civilian unemployment rate (percentage points) and g_t = 100·(ln GDPC1_t − ln GDPC1_{t−1}) is quarterly real GDP growth in percent (not annualised); uncertainty must be robust to heteroskedasticity and serial correlation. Stability is assessed by estimating β separately on 1960Q1–1983Q4 and 1984Q1–2019Q4 and by a classical Chow test of the joint equality of (α, β) across the two subperiods. The chain required is: question → data audit → baseline → justified method → results → uncertainty → failure discussion → one figure and one table → short report.
Inputs
data/GDPC1.csv— observed data, FRED GDPC1 (US real GDP, quarterly, billions of chained 2017 dollars, SAAR; BEA), full history, raw FRED CSV (observation_date= first day of the quarter,GDPC1). Provenance indata/README.md.data/UNRATE.csv— observed data, FRED UNRATE (US civilian unemployment rate, monthly, percent, SA; BLS), full history, raw FRED CSV (observation_date= first day of the month,UNRATE). Provenance indata/README.md.data/README.md— provenance, retrieval dates, SHA-256.
Information-availability rules
- Quarterly unemployment u_t is the simple average of the three monthly UNRATE values of quarter t. Δu_t = u_t − u_{t−1}.
- The regression sample is the 240 quarters 1960Q1–2019Q4 (the 1960Q1 differences use 1959Q4 levels). Quarters after 2019Q4 are outside the question and must not enter any estimate. Subperiod 1 = 1960Q1–1983Q4, subperiod 2 = 1984Q1–2019Q4.
- Standard errors for the full-sample β must be HAC (Newey–West with Bartlett kernel); choose and report the lag length. The Chow test is the classical sum-of-squared-residuals F-test with 2 and n − 4 degrees of freedom.
- Use only the files listed above.
Required outputs
out/results.jsonwith the keys:
| key | type | unit | meaning |
|---|---|---|---|
sample_start, sample_end |
string | ISO date | first day of the first and last quarter in the regression sample (1960-01-01, 2019-10-01) |
n_sub1, n_sub2 |
integer | quarters | observations in each subperiod |
baseline_metric |
number | percentage points | RMSE of the mean-only prediction of Δu over the full sample, sqrt(mean((Δu − mean Δu)²)) |
model_metric |
number | percentage points | RMSE of the full-sample OLS residuals, sqrt(mean(e²)) |
effect_estimate |
number | pp per percent growth | full-sample OLS Okun coefficient β |
intercept |
number | percentage points | full-sample OLS intercept α |
effect_se |
number | pp per percent growth | HAC (Newey–West) standard error of β |
hac_lags |
integer | quarters | Newey–West lag length used |
effect_ci_low, effect_ci_high |
number | pp per percent growth | 95% confidence interval for β based on effect_se |
beta_sub1, beta_sub2 |
number | pp per percent growth | OLS slope in subperiod 1 and 2 |
chow_f_stat, chow_p_value |
number | — | Chow F statistic and p-value |
stability_conclusion |
string | — | stable if the Chow test does not reject at 5%, else unstable |
conclusion |
string | — | one of the codes below (sign of β from its 95% interval) |
task_id |
string | copied from this file | |
feasibility |
string | complete / partial / infeasible |
|
feasibility_reason |
string or null | why, if not complete | |
data_issues |
array of {"issue","handling"} | every data problem detected and how it was handled (empty list allowed) | |
n_input_rows |
object {file: integer} | rows read per input file (file name as key, header row excluded) | |
n_analysed |
integer or null | observations actually used in the main estimate | |
random_seed |
integer or null | seed used, if any |
(n_analysed = quarters in the full-sample regression.)
The conclusion code must be one of: positive_effect (the 95% interval for the effect estimand lies above zero), negative_effect (lies below zero), no_detectable_effect (the interval / test does not reject zero at the 5% level), premise_invalid (the data provided do not allow the stated estimand to be computed — in that case set feasibility to infeasible, explain in feasibility_reason, and set every inestimable key to null; never substitute an invented or proxy estimate).
out/figure1.png— scatter of Δu_t against g_t with the two subperiod fitted lines, produced byout/analysis.pywith matplotlib.out/table1.csv— one row per sample (full, subperiod 1, subperiod 2) with columnsperiod,n,intercept,slope,slope_se(header + three data rows), produced byout/analysis.py.out/report.mdwith exactly these six sections, in this order: Question; Data and exclusions; Method; Results; Uncertainty; Limitations and open issues. The last section must contain a genuine failure discussion: what would invalidate the result, what was not checked, and what the main threats are.out/analysis.py— replication entry point:~/wp29/venv/bin/python out/analysis.py, run from the workspace root, must regenerateout/results.json,out/figure1.pngandout/table1.csvfromdata/only, deterministically (fix any seed; use the matplotlibAggbackend).out/claims.json— list of the central claims of the report:[{"id": "C1", "text": "...", "results_keys": ["..."], "status": "supported"|"unsupported"|"not_evaluated", "caveat": "..."}]. Every claim must reference existing keys ofout/results.json; a claim must only be markedsupportedif the reported numbers actually support it.
Constraints
- No network access. Python:
~/wp29/venv/bin/python(numpy, pandas, scipy, statsmodels, matplotlib available). Do not modifydata/. - Write all deliverables under
out/. This task is designed to be completed in well under 20 minutes of work; prefer a short, correct chain over an elaborate one.