SPB Git

spb/wp29_uqo

Public

# Verification checks (P4) — 2026-10-30

# check outcome
1 Delete results.json, forecasts.csv, table1.csv, figure1.png, exclusions.csv; re-run analysis.py; SHA-256 of results.json/forecasts.csv/table1.csv identical to previous run PASS (IDENTICAL)
2 forecasts.csv: 80 rows, exactly one per (origin, horizon, model), 10 origins PASS
3 vintage_used == origin_date for every row (only vintage V used at origin V) PASS
4 Every target month's first-release vintage is strictly after the origin (actual not observable at the origin) PASS
5 Naive h=1 forecast equals the first-release YoY of last(V) for all 10 origins (independent cross-check vintage vs first_release.csv) PASS
6 RMSE/MAE recomputed from forecasts.csv match results.json (1e-9), RMSE ≥ MAE > 0 for all 8 cells PASS
7 DM statistic reproduced independently with statsmodels OLS-on-constant HAC (Bartlett, maxlags=h−1, no small-sample correction; HC0 at h=1): 2.4290 (h1), 1.5466 (h3) PASS
8 Long-run variances positive (0.809 at h1, 2.119 at h3) PASS
9 rel_improvement = 1 − RMSE_model/RMSE_naive identity PASS
10 conclusion codes consistent with RMSE ordering and p<0.05 PASS
11 Bootstrap 95% intervals contain their point estimates (h1, h3) PASS
12 n_analysed = 20 = 10 origins × 2 horizons; exclusions ledger: 20 − 0 = 20 PASS
13 n_input_rows has 23 entries (10 RSAFS + 10 PAYEMS vintages + UMCSENT + RSAFS_current + first_release) matching README row counts PASS (initial assertion "24" in my check script was my own miscount; 23 is the correct number of CSVs)
14 mean_abs_revision recomputed from per-target revisions PASS
15 Magnitude: model RMSE between 0.3× and 2× naive; all errors in percent units, comparable to YoY range 2.4–6.7% PASS
16 Code inspection: RSAFS_current.csv read only after all forecasts are written, used only for estimand (d); PAYEMS/UMCSENT not used in forecasts PASS
17 Model specification fixed (log.md entry) before any out-of-sample error was computed; single run, no tuning PASS (documented)
Files · main
Menu

Theme