22
33All notable changes to StatsPAI will be documented in this file.
44
5- ## [ Unreleased ]
5+ ## [ 1.15.0 ] — 2026-05-05
66
77### Docs — v1.14 GPU sprint follow-up
88
@@ -27,98 +27,14 @@ All notable changes to StatsPAI will be documented in this file.
2727 1.14.0 (GPU sprint cut, commit ` a87d788 ` ) to 1.15.0 (RDD polish
2828 cut) within a single day. Both ` [1.14.0] ` and ` [1.15.0] ` entries
2929 below remain historically correct for the work each release
30- contained; no retroactive renaming is needed.
31-
32- ### Added — ML+causal polish
33-
34- A cross-cutting polish wave on the machine-learning + causal-inference
35- module family (DML / meta-learners / causal forests / causal discovery
36- / policy learning / mediation / OPE) so the package matches the
37- 2024–2026 reporting frontier set by DoubleML, EconML, grf, and lmtp.
38-
39- - ** DML-OVB sensitivity analysis** (` sp.dml_sensitivity ` ,
40- ` DMLSensitivityResult ` ) implementing the Chernozhukov–Cinelli–
41- Newey–Sharma–Syrgkanis (2022) "Long Story Short" framework
42- (NBER WP 30302; arXiv:2112.13398). Returns the robustness value
43- RV_q (strength of confounder needed to shrink the estimate to
44- zero), the significance-loss value RV_ {q,α}, scenario bias
45- bounds for user-specified (cf_y, cf_d), benchmark-covariate
46- comparisons, and a ` plot() ` rendering bias contours over the
47- (cf_d, cf_y) grid à la R ` sensemakr ` . Refs verified via NBER + arXiv.
48- - ** DML diagnostics bundle** (` sp.dml_diagnostics ` , ` DMLDiagnostics ` )
49- bundles overlap (propensity histogram for IRM; |D-residual|
50- distribution for PLR), score density (with N(0,σ̂²) overlay and
51- Q-Q plot), residual-balance check (corr(X_k, Ỹ) and corr(X_k, D̃)
52- for each covariate), and an orthogonality-score test in a single
53- 2×2 publication-style panel matching DoubleML's defaults
54- (Bach–Kurz–Chernozhukov–Spindler–Klaassen 2024, * JSS* 108(3),
55- DOI 10.18637/jss.v108.i03).
56- - ** Backbone-agnostic CATE evaluation** (` sp.cate_eval ` ,
57- ` CATEEvalResult ` ) computing Yadlowsky–Fleming–Shah–Brunskill–
58- Wager (2025) RATE / AUTOC / Qini with closed-form influence-
59- function SEs for * any* CATE array (meta-learner, BCF, conformal-
60- CATE, neural-CATE), so the metric is decoupled from the forest
61- backbone. JASA 120(549), DOI 10.1080/01621459.2024.2393466
62- (arXiv:2111.07966). Verified via Crossref + arXiv.
63- - ⚠️ ** Correctness fix** — ` forest.CausalForest.best_linear_projection `
64- is rewritten to use the Semenova–Chernozhukov (2021) AIPW
65- pseudo-outcome Γ_i with HC1 standard errors. The previous
66- implementation regressed the plug-in CATE estimate on X with
67- naïve OLS SEs, which was anti-conservative in finite samples.
68- * Econometrics Journal* 24(2): 264–289, DOI 10.1093/ectj/utaa027.
69- Users who relied on the prior BLP SEs should re-fit and report
70- the new HC1 numbers.
71- - ⚠️ ** Correctness fix** — ` mediation.mediate ` no longer silently
72- substitutes the point estimate for failed bootstrap replicates
73- (which artificially shrunk SEs). Each failure now triggers up to
74- five retry draws; remaining failures are dropped, and a
75- ` RuntimeWarning ` fires if more than 10% of replicates fail. The
76- result's ` model_info ` exposes ` n_boot_requested ` ,
77- ` n_boot_successful ` , ` n_boot_failed ` , and ` boot_failure_rate `
78- for audit. SEs estimated under heavy bootstrap failure on prior
79- versions should be regenerated.
80- - ** OPE namespace deduplication** — ` sp.policy_learning.OPEResult `
81- is now an alias for the canonical ` sp.ope.estimators.OPEResult ` ,
82- so ` isinstance(sp.direct_method(X, A, R, π), sp.OPEResult) ` is
83- True regardless of which entry point was used. The legacy
84- ` estimator ` / ` n_obs ` attributes survive as properties on the
85- unified class.
86- - ** Causal-discovery graph visualization** — every result class
87- (` LiNGAMResult ` , ` GESResult ` , ` FCIResult ` , ` ICPResult ` ,
88- ` PCMCIResult ` , ` LPCMCIResult ` , ` DYNOTEARSResult ` ) and the dict-
89- shaped returns from ` sp.notears ` and ` sp.pc_algorithm ` (now
90- promoted to a ` DAGDict ` thin subclass) expose a unified
91- ` .to_networkx() ` / ` .to_dot() ` / ` .plot() ` / ` .edge_list() ` API.
92- Module-level helpers `sp.causal_discovery.{to_networkx, to_dot,
93- plot_dag, edge_list, shd}` work standalone on any adjacency
94- matrix; ` shd() ` follows the Tsamardinos–Brown–Aliferis (2006)
95- Structural Hamming Distance convention.
96- - ** PolicyTreeResult promotion** — ` sp.policy_tree ` now returns a
97- ` PolicyTreeResult ` (subclass of ` dict ` for full back-compat) with
98- influence-function SE on the policy value and a 95% CI from the
99- AIPW scores, plus a Graphviz-style ` plot_tree() ` , ` summary() ` ,
100- ` to_latex() ` , ` to_excel() ` , and ` cite() ` (Athey & Wager 2021,
101- * Econometrica* 89(1)).
102- - ** Mediation sensitivity plot upgrade** — ` MediateSensitivityResult.plot() `
103- now produces a publication-style ACME(ρ) curve with coloured fill
104- for the {ACME>0} / {ACME<0} regions, annotated baseline, and
105- explicit ρ-at-zero (the robustness threshold).
106- - ** DTR + QTE test coverage** — ` tests/test_dtr.py ` (10 new tests)
107- and ` tests/test_qte.py ` (7 new tests) close two zero-coverage
108- modules flagged in the v1.13 audit.
109- - ** ` tests/test_ml_causal_polish.py ` ** (22 new tests) covers all of
110- the above end-to-end (BLP DR-score recovery, mediation bootstrap
111- diagnostics, OPE isinstance, DAG viz, ` PolicyTreeResult ` contract,
112- DML sensitivity / diagnostics, ` cate_eval ` direction, ` to_word `
113- integration).
114- - ** Citation expansion** — 4 new bib entries added to ` paper.bib ` ,
115- each verified independently via NBER / arXiv / journal site:
116- ` chernozhukov2022long ` , ` semenova2021debiased ` ,
117- ` yadlowsky2025evaluating ` , ` bach2024doubleml ` .
30+ contained; no retroactive renaming is needed. ** PyPI publishes
31+ ` 1.13.1 → 1.15.0 ` directly — ` 1.14.0 ` was an internal cut that was
32+ never released to PyPI and is recorded here for git / CHANGELOG
33+ history only.**
11834
11935### Headline
12036
121- Four pushes in this cycle. First, an IV-module polish to the post-2022
37+ Five pushes in this cycle. First, an IV-module polish to the post-2022
12238reporting standard (the ` sp.iv.iv_diag ` bundle, see below). Second, a
12339synthetic-control polish pass: every estimator the package already
12440ships now has a publication-grade table-export pipeline, the trajectory
@@ -133,7 +49,14 @@ each verified independently via Crossref / arXiv (refs verified
13349via ` crossref ` + ` arxiv ` ). Third, a decomposition-module polish — see
13450the dedicated section below. Fourth, a ** ML+causal polish wave (v1.15)**
13551covering DML / meta-learners / causal forests / causal discovery /
136- policy learning / mediation — see the dedicated section below.
52+ policy learning / mediation — see the dedicated section below. Fifth,
53+ an ** RDD module polish (v1.15)** to the 2018–2026 frontier with three
54+ new estimators (` sp.rd_flex ` , ` sp.rd_bias_aware_fuzzy ` , ` sp.rd_discrete ` ),
55+ three reporting helpers (` sp.rd_dashboard ` , ` sp.rd_compare ` ,
56+ ` sp.rd_robustness_table ` ), an ` sp.rdrobust ` polish pass with the CCT-2018
57+ ` rho ` parameter and discrete-RV / weak-first-stage warnings, and a
58+ ` sp.rdplotdensity ` upgrade to the Cattaneo-Jansson-Ma (2020) boundary-
59+ adaptive density estimator — see the dedicated section below.
13760
13861### Added — ML+causal polish (v1.15)
13962
@@ -333,7 +256,7 @@ policy learning / mediation — see the dedicated section below.
333256 and comparison LaTeX / Markdown / Excel exports, the new plot
334257 options, and SDID-canonicalised reports.
335258
336- ### Added
259+ ### Added — IV polish (v1.15)
337260
338261- ` sp.iv.iv_diag(data, y, endog, instruments, exog, ...) ` — modern IV
339262 reporting bundle. Returns an ` IVDiagResult ` containing:
@@ -385,7 +308,7 @@ policy learning / mediation — see the dedicated section below.
385308 enriched with verified volume / issue / pages: ` mikusheva2024weak ` ,
386309 ` lee2022valid ` , ` borusyak2022quasi ` , ` masten2021salvaging ` .
387310
388- ### Changed
311+ ### Changed — IV polish (v1.15)
389312
390313- ` docs/guides/choosing_iv_estimator.md ` adds §10 (` sp.iv.iv_compare `
391314 forest comparison), §11 (` sp.iv.iv_diag ` modern reporting bundle),
@@ -394,7 +317,7 @@ policy learning / mediation — see the dedicated section below.
394317 * Methodological coverage* documenting the new bundle and recent
395318 methodology references.
396319
397- ### Notes
320+ ### Notes — IV polish (v1.15)
398321
399322- ` iv_diag ` is single-endogenous by design; for multi-endogenous
400323 specifications continue to use ` sp.weakrobust ` plus
@@ -405,9 +328,7 @@ policy learning / mediation — see the dedicated section below.
405328 numeric path. The 18 new tests in ` tests/iv/test_iv_diag.py ` all
406329 pass; no regressions in the 188 prior IV tests.
407330
408- ## [ 1.15.0] — 2026-05-05
409-
410- ### Headline
331+ ### Added — RDD polish (v1.15)
411332
412333RDD module polish to state-of-the-art (2018–2026 literature). Six
413334additions close the gap between ` sp.rd ` and the canonical R/Stata
@@ -473,14 +394,14 @@ additions close the gap between `sp.rd` and the canonical R/Stata
473394 ` bias_aware_fuzzy ` , ` noack_rothe ` , ` rd_discrete ` ,
474395 ` kolesar_rothe ` , ` discrete_rv ` , …).
475396
476- ### Tests
397+ ### Tests — RDD polish (v1.15)
477398
478399- New ` tests/test_rd_polish.py ` with 21 checks: estimator parity
479400 recovery, dispatcher routing, warning behaviour, dashboard smoke
480401 tests.
481402- All 156 RD tests (existing + new) pass on Python 3.13 / macOS.
482403
483- ### Citations
404+ ### Citations — RDD polish (v1.15)
484405
485406DOI-verified via Crossref / publisher pages 2026-05-05:
486407` noack2024biasaware ` , ` noack2025flexible ` , ` kolesar2018inference ` ,
0 commit comments