Clean re-run (deleted results/figure/table/exclusions, re-ran analysis.py): results.json byte-identical (cmp) |
PASS |
| Independent numpy re-implementation (OLS + manual HC3 sandwich): β, α, SE, RMSEs, R² match to <1e-9 |
PASS |
| r² = pearson_r² |
PASS (diff < 1e-12) |
| model_metric = baseline_metric·sqrt(1−R²) (OLS-with-intercept identity) |
PASS |
| model_metric (3.59) < baseline_metric (7.08) |
PASS |
| effect_se > 0; CI [4.85, 5.68] contains β = 5.27 |
PASS |
| Exclusion ledger: 2349 −396 −1736 −20 = 197 = n_analysed; n_excluded_missing = 20 = 217−197 |
PASS |
| table1 n_countries sums to 20+46+58+73 = 197 = n_analysed |
PASS |
| Analysis year rule: complete counts 199 (2015–2022), 197 (2023) ≥150 ⇒ 2023 latest |
PASS |
| All GDP > 0 before log (assert in script) |
PASS |
| SE robustness: HC0 0.207, HC1 0.208, HC2 0.209, HC3 0.211, classical 0.222 — conclusion unchanged |
PASS |
| Trim-5 largest residuals: β = 5.32 (vs 5.27) |
PASS (stable) |
| Figure visually inspected: scatter + fitted line, 197 points, labels correct |
PASS |