Skip to content

Commit b2047aa

Browse files
docs(release): cut v1.15.0 — fold [Unreleased] + README banner
PyPI publishes 1.13.1 → 1.15.0 directly; 1.14.0 was an internal cut never released. Five polish waves bundled under 1.15.0: IV (iv_diag / iv_compare), synth (publication exports + ribbons + SDID canonical), decomposition (Yu-Elwert + unified dispatcher), ML+causal (DML sensitivity + diagnostics + cate_eval + DAG viz + correctness fixes on forest.BLP and mediate), RDD (rd_flex / rd_bias_aware_fuzzy / rd_discrete + dashboard/compare/robustness_table + rdrobust polish + boundary-adaptive density). [Unreleased] section folded into [1.15.0] with per-wave h3 sub-scopes; README v1.15.0 banner added; citation bibtex bumped to 1.15.0.
1 parent c8567fd commit b2047aa

2 files changed

Lines changed: 58 additions & 100 deletions

File tree

CHANGELOG.md

Lines changed: 20 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
All 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
12238
reporting standard (the `sp.iv.iv_diag` bundle, see below). Second, a
12339
synthetic-control polish pass: every estimator the package already
12440
ships now has a publication-grade table-export pipeline, the trajectory
@@ -133,7 +49,14 @@ each verified independently via Crossref / arXiv (refs verified
13349
via `crossref` + `arxiv`). Third, a decomposition-module polish — see
13450
the dedicated section below. Fourth, a **ML+causal polish wave (v1.15)**
13551
covering 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

412333
RDD module polish to state-of-the-art (2018–2026 literature). Six
413334
additions 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

485406
DOI-verified via Crossref / publisher pages 2026-05-05:
486407
`noack2024biasaware`, `noack2025flexible`, `kolesar2018inference`,

README.md

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,43 @@ StatsPAI's focus is **causal inference** — and on this axis we aim to be the m
124124

125125
---
126126

127+
**📦 v1.15.0 (2026-05-06) — Five polish waves (IV / synth / decomposition / ML+causal / RDD)**
128+
129+
A bundled minor release covering five module-level polish waves on top
130+
of v1.13.1 (1.14.0 was an internal cut never released to PyPI). **IV**:
131+
a new `sp.iv.iv_diag` reporting bundle (Olea-Pflueger effective F,
132+
Lee-McCrary-Moreira-Porter `tF` adjusted CI, Anderson-Rubin / Moreira
133+
CLR / Kleibergen K weak-IV-robust sets, Conley-Hansen-Rossi LTZ
134+
sensitivity, Blandhol-Mogstad-Słoczyński TSLS-as-LATE caveat) plus
135+
`sp.iv.iv_compare` forest comparison and four IV diagnostic plots.
136+
**Synth**: every estimator gains a publication-grade
137+
`.to_latex()` / `.to_excel()` / `.to_word()` table-export pipeline,
138+
trajectory and gap plots get prediction-interval / pre-RMSPE ribbons
139+
(Cattaneo-Feng-Titiunik 2021 / Cattaneo-Feng-Palomba-Titiunik 2025), and
140+
the SDID schema is canonicalised so `sp.synth_report(method='sdid')`
141+
produces a full report. **Decomposition**: a new Yu-Elwert (2024)
142+
distributional-decomposition module + a unified `sp.decompose()`
143+
dispatcher and shared influence-function / WLS / statistic-value
144+
backbone. **ML+causal**: `sp.dml_sensitivity` (Chernozhukov-Cinelli-
145+
Newey-Sharma-Syrgkanis 2022 long-story-short framework),
146+
`sp.dml_diagnostics` (DoubleML-style 2×2 panel), `sp.cate_eval`
147+
(Yadlowsky-et-al 2025 RATE / AUTOC / Qini decoupled from the forest
148+
backbone), causal-discovery DAG visualisation, `PolicyTreeResult`
149+
promotion, and ⚠️ correctness fixes in
150+
`forest.CausalForest.best_linear_projection` (now AIPW + HC1 SEs) and
151+
`mediation.mediate` (no silent bootstrap-failure substitution). **RDD**:
152+
three new estimators (`sp.rd_flex` cross-fit ML adjustment,
153+
`sp.rd_bias_aware_fuzzy` Anderson-Rubin-style weak-IV-robust fuzzy CI,
154+
`sp.rd_discrete` Kolesár-Rothe honest CIs for discrete RVs), three
155+
reporting helpers (`sp.rd_dashboard`, `sp.rd_compare`,
156+
`sp.rd_robustness_table`), `rho` parameter + discrete-RV / weak-first-
157+
stage warnings on `sp.rdrobust`, and a Cattaneo-Jansson-Ma (2020)
158+
boundary-adaptive `sp.rdplotdensity` upgrade. Also: BJS imputation
159+
(Borusyak-Jaravel-Spiess 2024) DiD support repaired, neural-causal /
160+
synth / spatial-DID export modules added, and a `sp.iv(absorb=...)`
161+
HDFE 2SLS path. Full notes in [`CHANGELOG.md`](CHANGELOG.md) under
162+
`[1.15.0]`.
163+
127164
**📦 v1.13.1 (2026-05-05) — Stability tiers + external-validity dossier + cold-start surgery**
128165

129166
v1.13 stamps every `FunctionSpec` with a `stability` tier (`stable` /
@@ -1277,7 +1314,7 @@ resolves to the latest version):
12771314
author = {Wang, Biaoyue},
12781315
title = {StatsPAI: The Agent-Native Causal Inference \& Econometrics Toolkit for Python},
12791316
year = {2026},
1280-
version = {1.13.1},
1317+
version = {1.15.0},
12811318
doi = {10.5281/zenodo.19933900},
12821319
url = {https://doi.org/10.5281/zenodo.19933900},
12831320
license = {MIT},

0 commit comments

Comments
 (0)