Skip to content

Commit 0eca784

Browse files
docs(citations): correct upstream attributions for 5 estimators
Verified each reference via arXiv / NBER primary sources. Changes are metadata-only — algorithm paths, signatures, and numerics unchanged. * bcf_longitudinal (arXiv:2508.08418): "Alessi, Zorzetto et al." -> Prevot, Haring, Nichols, Holmes & Ganjgahi (2025) * surrogate_index (NBER WP 26463): "Pollmann, Taubinsky" -> Athey, Chetty, Imbens & Kang (2019) * proximal_surrogate_index + bridge(surrogate_pci): Imbens-Kallus-Mao arXiv:2601.17712 (2026) -> Imbens, Kallus, Mao & Wang, JRSS-B 87(2) 2025, arXiv:2202.07234 (fix arXiv ID + add Wang) * bayes_dml (arXiv:2508.12688): "Chernozhukov et al." -> DiTraglia & Liu (2025); DML framework attribution kept * causal_bandit (NeurIPS 2015): "Bareinboim & Pearl" -> Bareinboim, Forney & Pearl pytest on touched modules (bcf_longitudinal / surrogate / bayes_dml / causal_rl_core / bridge / bridge_full): 43 passed / 0 failed. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 5e4152a commit 0eca784

11 files changed

Lines changed: 88 additions & 71 deletions

File tree

docs/guides/bridging_theorems.md

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,14 @@ disagree beyond sampling error.
2525

2626
## The six bridges
2727

28-
| `kind` | Theorem | Reference |
29-
|-------------------|--------------------------------------------------|-------------------------------------------|
30-
| `did_sc` | DiD ≡ Synthetic Control | Shi & Athey, arXiv:2503.11375 (2025) |
31-
| `ewm_cate` | EWM ≡ CATE-max policy | Ferman et al., arXiv:2510.26723 (2025) |
32-
| `cb_ipw` | Covariate Balancing ≡ IPW ≡ DR | Zhao & Percival, arXiv:2310.18563 v6 (2025)|
33-
| `kink_rdd` | Bunching ≡ Kink RDD first-order expansion | Lu, Wang, Xie, arXiv:2404.09117 (2025) |
34-
| `dr_calib` | Doubly-robust ≡ outcome + Riesz joint calibration | Zhang et al., arXiv:2411.02771 (2025) |
35-
| `surrogate_pci` | Long-term Surrogate Index ≡ PCI | Kallus & Mao, arXiv:2601.17712 (2026) |
28+
| `kind` | Theorem | Reference |
29+
|-----------------|---------------------------------------------------|-----------------------------------------------------------------|
30+
| `did_sc` | DiD ≡ Synthetic Control | Shi & Athey, arXiv:2503.11375 (2025) |
31+
| `ewm_cate` | EWM ≡ CATE-max policy | Ferman et al., arXiv:2510.26723 (2025) |
32+
| `cb_ipw` | Covariate Balancing ≡ IPW ≡ DR | Zhao & Percival, arXiv:2310.18563 v6 (2025) |
33+
| `kink_rdd` | Bunching ≡ Kink RDD first-order expansion | Lu, Wang, Xie, arXiv:2404.09117 (2025) |
34+
| `dr_calib` | Doubly-robust ≡ outcome + Riesz joint calibration | Zhang et al., arXiv:2411.02771 (2025) |
35+
| `surrogate_pci` | Long-term Surrogate Index ≡ PCI | Imbens, Kallus, Mao & Wang, JRSS-B 87(2) 2025; arXiv:2202.07234 |
3636

3737
Each bridge is importable at top level as `sp.bridge(kind="..." ...)` or
3838
via the per-module function in `statspai.bridge.*`.
@@ -186,13 +186,14 @@ explicit.
186186

187187
---
188188

189-
## 6. Long-term Surrogate Index ≡ Proximal Causal Inference — Kallus-Mao (2026)
189+
## 6. Long-term Surrogate Index ≡ Proximal Causal Inference — Imbens-Kallus-Mao-Wang (2025)
190190

191-
Surrogate indices (Athey-Chetty-Imbens, 2020) use short-term
192-
measurements as proxies for long-term outcomes. Kallus-Mao show that
193-
under a completeness condition, the surrogate-index estimand is
194-
*identical* to a proximal-causal-inference (PCI) estimand using the
195-
same short-term variables as proxies for an unobserved confounder.
191+
Surrogate indices (Athey-Chetty-Imbens-Kang, NBER WP 26463, 2019) use
192+
short-term measurements as proxies for long-term outcomes. Imbens,
193+
Kallus, Mao & Wang show that under a completeness condition, the
194+
surrogate-index estimand is *identical* to a proximal-causal-inference
195+
(PCI) estimand using the same short-term variables as proxies for an
196+
unobserved confounder.
196197

197198
```python
198199
r = sp.bridge(

docs/guides/proximal_family.md

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -155,12 +155,13 @@ single-control versions.
155155

156156
---
157157

158-
## Long-term surrogate + PCI — `sp.proximal_surrogate_index` (Kallus-Mao, 2026)
158+
## Long-term surrogate + PCI — `sp.proximal_surrogate_index` (Imbens-Kallus-Mao-Wang, 2025)
159159

160160
You ran a randomised experiment for 3 months but care about the 2-year
161-
outcome. The classical solution (Athey-Chetty-Imbens 2020 surrogate index)
162-
needs the surrogates to fully mediate the long-term effect — a strong
163-
assumption. Kallus-Mao show that combining the surrogate index with a PCI
161+
outcome. The classical solution (Athey-Chetty-Imbens-Kang, NBER WP 26463,
162+
2019 surrogate index) needs the surrogates to fully mediate the long-term
163+
effect — a strong assumption. Imbens, Kallus, Mao & Wang show that
164+
combining the surrogate index with a PCI
164165
layer on the **observational** data lets you drop the full-mediation
165166
requirement: short-term surrogates play the role of `W`, observational
166167
proxies play the role of `Z`, and the two together identify the long-term
@@ -181,7 +182,9 @@ r = sp.proximal_surrogate_index(
181182
This is also available as the `surrogate_pci` bridge in `sp.bridge` — see
182183
[Bridging theorems](bridging_theorems.md).
183184

184-
Citation: Kallus & Mao (2026), arXiv:2601.17712.
185+
Citation: Imbens, Kallus, Mao & Wang (2025). "Long-term Causal Inference
186+
Under Persistent Confounding via Data Combination." *Journal of the Royal
187+
Statistical Society Series B* 87(2), 362-388. arXiv:2202.07234.
185188

186189
---
187190

src/statspai/bayes/dml.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
"""Bayesian Double Machine Learning (arXiv:2508.12688, 2025).
1+
"""Bayesian Double Machine Learning (DiTraglia & Liu, arXiv:2508.12688, 2025).
22
33
Wraps :func:`sp.dml` cross-fitted residuals in a Normal-Normal conjugate
44
posterior, turning frequentist DML into a fully Bayesian analogue with
@@ -120,7 +120,10 @@ def bayes_dml(
120120
121121
References
122122
----------
123-
Chernozhukov et al. (arXiv:2508.12688, 2025).
123+
DiTraglia, F. J., & Liu, L. (2025). "Bayesian Double Machine
124+
Learning for Causal Inference." arXiv:2508.12688.
125+
(The underlying orthogonal-moments DML construction is due to
126+
Chernozhukov et al. 2018, Econometrics Journal.)
124127
"""
125128
if mode not in ("conjugate", "full"):
126129
raise ValueError(f"mode must be 'conjugate' or 'full'; got {mode!r}.")

src/statspai/bcf/longitudinal.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
"""
22
BCFLong — hierarchical Bayesian Causal Forest for longitudinal data.
33
4-
Alessi, Zorzetto et al. (arXiv:2508.08418, 2025) extend BCF to
5-
longitudinal/panel data with a two-level hierarchy:
4+
Prevot, Häring, Nichols, Holmes & Ganjgahi (arXiv:2508.08418, 2025)
5+
extend BCF to longitudinal/panel data with a two-level hierarchy:
66
77
* Level 1 (observation): ``Y_{it} = mu_t(X_{it}) + tau_t(X_{it}) D_{it} + u_i + e_{it}``
88
* Level 2 (subject) : ``u_i ~ Normal(0, sigma_u^2)`` (random intercept)
@@ -15,7 +15,10 @@
1515
1616
References
1717
----------
18-
Alessi, Zorzetto et al. (arXiv:2508.08418, 2025).
18+
Prevot, E., Häring, D. A., Nichols, T. E., Holmes, C. C., & Ganjgahi, H.
19+
(2025). "A hierarchical modelling approach for Bayesian Causal Forests
20+
on longitudinal data: A Case Study in Multiple Sclerosis Clinical
21+
Trials." arXiv:2508.08418.
1922
"""
2023

2124
from __future__ import annotations
@@ -178,7 +181,7 @@ def bcf_longitudinal(
178181
179182
References
180183
----------
181-
Alessi, Zorzetto et al. (arXiv:2508.08418, 2025).
184+
Prevot, Häring, Nichols, Holmes & Ganjgahi (arXiv:2508.08418, 2025).
182185
Hahn, Murray, Carvalho (2020), Bayesian Analysis.
183186
"""
184187
if not isinstance(data, pd.DataFrame):
@@ -354,6 +357,6 @@ def _single_pass(df_in: pd.DataFrame, seed: int) -> tuple:
354357
"n_trees_mu": n_trees_mu,
355358
"n_trees_tau": n_trees_tau,
356359
"n_bootstrap_effective": len(boot_point),
357-
"reference": "Alessi, Zorzetto et al. (arXiv:2508.08418, 2025)",
360+
"reference": "Prevot, Häring, Nichols, Holmes & Ganjgahi (arXiv:2508.08418, 2025)",
358361
},
359362
)

src/statspai/bridge/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@
88
the estimate is consistent.
99
1010
Six bridges shipped (per arXiv 2503.11375 / 2510.26723 / 2310.18563 v6 /
11-
2404.09117 / 2411.02771 / 2601.17712, all 2025-2026):
11+
2404.09117 / 2411.02771 / 2202.07234, 2022-2025):
1212
1313
* ``did_sc`` — DiD ≡ Synthetic Control (Shi-Athey 2025)
1414
* ``ewm_cate`` — EWM ≡ CATE → policy (Ferman et al. 2025)
1515
* ``cb_ipw`` — Covariate Balancing ≡ IPW × DR (Zhao-Percival 2025)
1616
* ``kink_rdd`` — Kink-Bunching ≡ RDD (Lu-Wang-Xie 2025)
1717
* ``dr_calib`` — Doubly Robust via Calibration (Zhang 2025)
18-
* ``surrogate_pci`` — Long-term Surrogate ≡ PCI (Kallus-Mao 2026)
18+
* ``surrogate_pci`` — Long-term Surrogate ≡ PCI (Imbens-Kallus-Mao-Wang 2025, JRSS-B)
1919
2020
The unified entry point is ``sp.bridge(data, kind=..., **kwargs)``,
2121
returning a :class:`BridgeResult` reporting the two path estimates,

src/statspai/bridge/surrogate_pci.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""
2-
Bridge: Long-term Surrogate ≡ Proximal Causal Inference (Kallus-Mao
3-
2026, arXiv 2601.17712).
2+
Bridge: Long-term Surrogate ≡ Proximal Causal Inference (Imbens, Kallus,
3+
Mao & Wang 2025, JRSS-B 87(2) 362-388; arXiv 2202.07234).
44
55
Both paths target the long-term ATT under unobserved confounding via
66
short-term proxy variables. Surrogate Index assumes the proxy fully
@@ -85,7 +85,7 @@ def _surrogate(Yi, Di, Si, Xi):
8585
att_surr = np.nan
8686

8787
# ---------- Path B: PCI bridge (two-model counterfactual) ---------- #
88-
# Kallus-Mao (2026) show that under proxy completeness the bridge
88+
# Imbens-Kallus-Mao-Wang (2025) show that under proxy completeness the bridge
8989
# function b(W, X) = E[Y | W, X, D = 0] identifies the ATT via
9090
# ATT = E[b(W, X) | D = 1] - E[Y | D = 0].
9191
# We go one step further and fit a symmetric bridge on BOTH arms —
@@ -159,5 +159,5 @@ def _pci(Yi, Di, Si, Xi):
159159
se_dr=se_dr,
160160
n_obs=n,
161161
detail={"n_short_term": len(short_term)},
162-
reference="Kallus-Mao (2026), arXiv 2601.17712",
162+
reference="Imbens, Kallus, Mao & Wang (2025), JRSS-B 87(2); arXiv 2202.07234",
163163
)

src/statspai/causal_rl/core.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
44
Three building blocks on top of :mod:`statspai.causal_rl`:
55
6-
- :func:`causal_bandit` — Bareinboim-Pearl contextual causal bandit.
6+
- :func:`causal_bandit` — Bareinboim-Forney-Pearl contextual causal bandit.
77
- :func:`counterfactual_policy_optimization` — Oberst-Sontag 2019 style
88
counterfactual policy evaluation via SCM noise inversion (Gaussian
99
linear special case).
@@ -124,7 +124,7 @@ def causal_bandit(
124124
n_samples: int = 500,
125125
rng_seed: int = 0,
126126
) -> CausalBanditResult:
127-
"""Bareinboim-Pearl contextual causal bandit.
127+
"""Bareinboim-Forney-Pearl contextual causal bandit.
128128
129129
Given a callable ``reward_fn(arm, context)`` that samples the
130130
potential outcome of an arm under the current context, Monte Carlo

src/statspai/registry.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2652,7 +2652,7 @@ def _build_registry():
26522652
name="surrogate_index",
26532653
category="surrogate",
26542654
description=(
2655-
"Athey-Chetty-Imbens surrogate-index estimator for the "
2655+
"Athey-Chetty-Imbens-Kang surrogate-index estimator for the "
26562656
"long-term ATE: combines an experimental sample (treatment + "
26572657
"short-term surrogate) with an observational sample "
26582658
"(surrogate + long-term outcome) to extrapolate the effect on "
@@ -2677,7 +2677,7 @@ def _build_registry():
26772677
),
26782678
tags=["surrogate", "long_term", "causal", "ate"],
26792679
reference=(
2680-
"Athey, Chetty, Imbens, Pollmann, Taubinsky (2019). NBER WP 26463."
2680+
"Athey, Chetty, Imbens & Kang (2019). NBER WP 26463."
26812681
),
26822682
))
26832683

@@ -2799,7 +2799,7 @@ def _build_registry():
27992799
name="causal_bandit",
28002800
category="causal_rl",
28012801
description=(
2802-
"Bareinboim-Pearl contextual causal bandit: pick the optimal "
2802+
"Bareinboim-Forney-Pearl contextual causal bandit: pick the optimal "
28032803
"arm by Monte-Carlo estimation of E[Y(a) | context]."
28042804
),
28052805
params=[
@@ -2810,7 +2810,7 @@ def _build_registry():
28102810
],
28112811
returns="CausalBanditResult",
28122812
tags=["causal_rl", "bandit", "pearl"],
2813-
reference="Bareinboim & Pearl (NIPS 2015).",
2813+
reference="Bareinboim, Forney & Pearl (NeurIPS 2015). 'Bandits with Unobserved Confounders: A Causal Approach.'",
28142814
))
28152815
register(FunctionSpec(
28162816
name="counterfactual_policy_optimization",
@@ -3017,7 +3017,7 @@ def _build_registry():
30173017
name="bayes_dml",
30183018
category="bayes",
30193019
description=(
3020-
"Bayesian Double Machine Learning (Chernozhukov et al. 2025): "
3020+
"Bayesian Double Machine Learning (DiTraglia & Liu 2025): "
30213021
"Normal-Normal conjugate update on a DML point estimate, with "
30223022
"optional full PyMC MCMC over the orthogonal moment equation."
30233023
),
@@ -3039,7 +3039,7 @@ def _build_registry():
30393039
"covariates=['x1','x2'])"
30403040
),
30413041
tags=["bayes", "dml", "double_ml", "posterior"],
3042-
reference="Chernozhukov et al. (arXiv:2508.12688, 2025).",
3042+
reference="DiTraglia & Liu (arXiv:2508.12688, 2025). DML framework: Chernozhukov et al. (2018).",
30433043
pre_conditions=[
30443044
"prior_sd is weakly informative relative to the expected effect scale",
30453045
"for mode='full': pymc installed (sp.bayes extra)",
@@ -3443,7 +3443,7 @@ def _build_registry():
34433443
"unit='id', time='t', covariates=['x1','x2'])"
34443444
),
34453445
tags=["bcf", "longitudinal", "panel", "hte"],
3446-
reference="Alessi, Zorzetto et al. (arXiv:2508.08418, 2025).",
3446+
reference="Prevot, Häring, Nichols, Holmes & Ganjgahi (arXiv:2508.08418, 2025).",
34473447
))
34483448

34493449
# -- Time-series causal discovery extensions --------------------- #
@@ -3632,7 +3632,7 @@ def _build_registry():
36323632
description=(
36333633
"Proximal surrogate-index estimator: long-term ATE when an "
36343634
"unobserved U confounds S→Y, using a proxy W and 2SLS-style "
3635-
"bridge-function identification (Imbens-Kallus-Mao 2026)."
3635+
"bridge-function identification (Imbens-Kallus-Mao-Wang 2025, JRSS-B)."
36363636
),
36373637
params=[
36383638
ParamSpec("experimental", "DataFrame", True),
@@ -3650,7 +3650,7 @@ def _build_registry():
36503650
"surrogates=['s'], proxies=['w'], long_term_outcome='Y')"
36513651
),
36523652
tags=["surrogate", "long_term", "proximal", "unobserved_confounding"],
3653-
reference="Imbens, Kallus, Mao (arXiv:2601.17712, 2026).",
3653+
reference="Imbens, Kallus, Mao & Wang (2025). JRSS-B 87(2), 362-388. arXiv:2202.07234.",
36543654
))
36553655

36563656
# ------------------------------------------------------------------
@@ -3924,7 +3924,7 @@ def _build_registry():
39243924
"Unified dispatcher for six causal-inference bridging theorems "
39253925
"(2025-2026): DiD≡SC (Shi-Athey), EWM≡CATE (Ferman), "
39263926
"IPW≡DR≡CB (Zhao-Percival), Bunching≡RDD (Lu-Wang-Xie), "
3927-
"DR-via-Calibration (Zhang), Long-term-surrogate≡PCI (Kallus-Mao). "
3927+
"DR-via-Calibration (Zhang), Long-term-surrogate≡PCI (Imbens-Kallus-Mao-Wang). "
39283928
"Reports both path estimates + doubly-robust recommendation."
39293929
),
39303930
params=[
@@ -3940,7 +3940,7 @@ def _build_registry():
39403940
reference=(
39413941
"Shi-Athey (2503.11375); Ferman et al. (2510.26723); "
39423942
"Zhao-Percival (2310.18563); Lu-Wang-Xie (2404.09117); "
3943-
"Zhang et al. (2411.02771); Kallus-Mao (2601.17712)."
3943+
"Zhang et al. (2411.02771); Imbens-Kallus-Mao-Wang (2202.07234, JRSS-B 2025)."
39443944
),
39453945
))
39463946

src/statspai/surrogate/__init__.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,25 @@
99
1010
Estimators
1111
----------
12-
- :func:`surrogate_index` — Athey, Chetty, Imbens, Pollmann & Taubinsky (2019).
12+
- :func:`surrogate_index` — Athey, Chetty, Imbens & Kang (2019).
1313
Classical single-wave surrogate index.
1414
- :func:`long_term_from_short` — Ghassami, Yang, Shpitser, Tchetgen Tchetgen
1515
(arXiv:2311.08527, 2024). Long-term effect of long-term treatments from
1616
short-term experiments.
17-
- :func:`proximal_surrogate_index` — Imbens, Kallus, Mao (arXiv:2601.17712,
18-
2026). Proximal identification when unobserved confounders link surrogate
19-
and long-term outcome.
17+
- :func:`proximal_surrogate_index` — Imbens, Kallus, Mao & Wang (2025, JRSS-B
18+
87(2); arXiv:2202.07234). Proximal identification when unobserved
19+
confounders link surrogate and long-term outcome.
2020
2121
References
2222
----------
23-
Athey, S., Chetty, R., Imbens, G., Pollmann, M., & Taubinsky, D. (2019).
23+
Athey, S., Chetty, R., Imbens, G. W., & Kang, H. (2019).
2424
"The Surrogate Index: Combining Short-Term Proxies to Estimate Long-Term
25-
Treatment Effects More Rapidly and Precisely." NBER WP 26463.
25+
Treatment Effects More Rapidly and Precisely." NBER Working Paper 26463.
2626
27-
Imbens, G., Kallus, N., Mao, X. (2026).
28-
"The Proximal Surrogate Index: Long-Term Treatment Effects under
29-
Unobserved Confounding." arXiv:2601.17712.
27+
Imbens, G., Kallus, N., Mao, X., & Wang, Y. (2025).
28+
"Long-term Causal Inference Under Persistent Confounding via Data
29+
Combination." Journal of the Royal Statistical Society Series B,
30+
87(2), 362-388. arXiv:2202.07234.
3031
"""
3132

3233
from .index import (

0 commit comments

Comments
 (0)