Skip to content

Commit 4990800

Browse files
docs(citations): fix 49 wrong attributions + add automated auditor
Systematic audit of all arXiv / NBER / DOI references in src/ and docs/ found 49 unique IDs attributed to the wrong authors — predominantly in post-2024 citations where LLM-generated attributions diverged from arXiv / NBER primary sources. Build: new tools/audit_citations.py (stdlib-only, ~790 lines) - EXTRACT regex over src/ + docs/ (arXiv IDs, NBER WP, DOIs) - VERIFY batch arXiv API, NBER meta scrape, Crossref JSON, all cached on disk under tools/.citation_cache/ - DIFF unicode-aware last-name match, hyphen/apostrophe-tolerant, paragraph + bullet scope isolation, multi-citation-line narrowing, bibtex + markdown-table special cases - REPORT audit_report.md with OK / MISMATCH / UNRESOLVED sections Final audit: 298 citations, 298 OK, 0 mismatches, 0 unresolved. Fix examples (metadata only, no numerical path touched): * 1905.12741 Veitch-Wang-Blei (2020) -> Veitch-Sridhar-Blei (2019) * 2111.07966 Tibshirani swap -> Brunskill; 2023 -> 2021 * 2311.08527 Ghassami et al. 2024 -> Tran-Bibaut-Kallus 2023 * 2503.11375 Shi-Athey -> Sun-Xie-Zhang * 2503.13323 Roth-Sant'Anna-Bilinski-Poe -> Baker-Callaway- Cunningham-Goodman-Bacon-Sant'Anna * 2506.17214 Qian-van der Laan -> Li-Qiu-Wang-van der Laan * 2510.21110 Fu-Zhou -> Li-Zhang-Bareinboim * 2510.26723 Ferman et al. -> Kato * 2511.14133 Agarwal-Shah -> Han-Shah * 2512.00566 Cattaneo-Jansson-Ma 2026 -> Cavaliere-Goncalves- Nielsen-Zanelli 2025 * 2512.12038 Park-Ying -> Olivas-Martinez-Gilbert-Rotnitzky * NBER 34550 Borusyak-Hull-Jaravel -> Abadie-Angrist-Frandsen- Pischke (a different paper shares the "Harvesting DiD" title family; Borusyak-Hull-Jaravel are on w24997/w33236) * 10.1002/jae.3103 remove phantom "Kurz" — JAE paper has 4 authors not 5 Verification: pytest on 19 touched test modules -> 188 passed / 0 failed. Re-running tools/audit_citations.py confirms 298/298 OK. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 0eca784 commit 4990800

63 files changed

Lines changed: 973 additions & 169 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,3 +179,11 @@ test-notebooks/demo_causal_inference.ipynb
179179
# Claude Code session state (local only)
180180
.claude/
181181
CLAUDE.md
182+
183+
# Citation auditor artefacts (tools/audit_citations.py)
184+
tools/.citation_cache/
185+
audit_report.md
186+
audit_report.json
187+
188+
# Ad-hoc citation-audit scratch (not from the tool)
189+
.citation_audit/

CHANGELOG.md

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -752,13 +752,13 @@ surfaces through `sp.list_functions`, `sp.describe_function`, and
752752
[`synth/experimental_design.py`]
753753

754754
- **`sp.rdrobust(..., bootstrap='rbc', n_boot=999, random_state=...)`**
755-
Cattaneo, Jansson & Ma (arXiv:2512.00566, 2026) robust-bias-corrected
755+
Cavaliere, Gonçalves, Nielsen & Zanelli (arXiv:2512.00566, 2025) robust-bias-corrected
756756
studentised percentile bootstrap. Empirically delivers CIs ~3–15%
757757
shorter than the analytic robust CI without sacrificing coverage.
758758
New ``model_info['rbc_bootstrap']`` block exposes the CI, p-value,
759759
length-ratio, and effective replicate count.
760760

761-
- **`sp.fairness.evidence_without_injustice`**Kwak & Pleasants
761+
- **`sp.fairness.evidence_without_injustice`**Loi, Di Bello & Cangiotti
762762
(arXiv:2510.12822, 2025) counterfactual-fairness test that freezes
763763
admissible-evidence features at their factual values and tests
764764
whether predictions still change under ``do(A = a')``. Returns a
@@ -774,7 +774,7 @@ surfaces through `sp.list_functions`, `sp.describe_function`, and
774774

775775
### Added — P1 frontier (4 methods, within-sprint week 2)
776776

777-
- **`sp.harvest_did`**Borusyak et al. MIT/NBER WP 34550 (2025)
777+
- **`sp.harvest_did`**Abadie, Angrist, Frandsen & Pischke, NBER WP 34550 (2025)
778778
Harvesting DID + event-study framework: extracts every valid 2×2
779779
DID comparison from a staggered panel, combines them via
780780
inverse-variance weights, and reports event-study + pretrend Wald
@@ -881,23 +881,23 @@ parameter docs, examples, references, and tags.
881881
- `sp.kernel_iv` (top-level alias of `sp.iv.kernel_iv`) — Lob et al.
882882
(2025, arXiv:2511.21603) kernel IV regression with wild-bootstrap
883883
uniform confidence band over the structural function `h*(d)`.
884-
- `sp.continuous_iv_late` (top-level alias) — Xie et al. (2025,
884+
- `sp.continuous_iv_late` (top-level alias) — Zeng et al. (2025,
885885
arXiv:2504.03063) LATE on the maximal complier class for continuous
886886
instruments via quantile-bin Wald estimator. (Also fixed a summary
887887
formatting bug — see below.)
888888

889889
**TMLE**
890890

891891
- `sp.hal_tmle` + `sp.HALRegressor` / `sp.HALClassifier` — TMLE with
892-
Highly Adaptive Lasso nuisance learners (Qian & van der Laan, 2025,
893-
arXiv:2506.17214). Two variants: `"delta"` (plug HAL into standard
892+
Highly Adaptive Lasso nuisance learners (Li, Qiu, Wang & van der
893+
Laan, 2025, arXiv:2506.17214). Two variants: `"delta"` (plug HAL into standard
894894
TMLE) and `"projection"` (apply tangent-space shrinkage to the
895895
targeting epsilon). Recovers ATE within ~3% on n=400 with rich
896896
nuisance.
897897

898898
**Synthetic Control**
899899

900-
- `sp.synth_survival` — Synthetic Survival Control (Agarwal & Shah,
900+
- `sp.synth_survival` — Synthetic Survival Control (Han & Shah,
901901
2025, arXiv:2511.14133). Donor convex combination on the
902902
complementary log-log scale matches the treated arm's pre-treatment
903903
Kaplan-Meier, then projects forward and reports the survival gap
@@ -1065,9 +1065,10 @@ all routed through `sp.*` and registered in `sp.list_functions()`.
10651065
`llm_unobserved_confounders`, `llm_sensitivity_priors` — all with
10661066
deterministic heuristic backends (no API key required); accept a
10671067
`client` arg for real LLM injection.
1068-
- **`sp.causal_rl`** (NEW namespace): `causal_dqn` (Confounding-Robust
1069-
Deep Q, arXiv 2510.21110), `causal_rl_benchmark` (5 benchmarks per
1070-
arXiv 2512.18135), `offline_safe_policy` (arXiv 2510.22027).
1068+
- **`sp.causal_rl`** (NEW namespace): `causal_dqn` (Li-Zhang-Bareinboim
1069+
confounding-robust Deep Q, arXiv 2510.21110), `causal_rl_benchmark`
1070+
(5 benchmarks per Cunha-Liu-French-Mian, arXiv 2512.18135),
1071+
`offline_safe_policy` (Chemingui et al., arXiv 2510.22027).
10711072
- **Cluster RCT × interference** (`sp.cluster_*`, `sp.dnc_gnn_did`):
10721073
matched-pair, cross-cluster, staggered-rollout, DNC+GNN+DiD
10731074
(arXiv 2211.14903 / 2310.18836 / 2502.10939 / 2601.00603).

docs/guides/bridging_theorems.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,11 @@ disagree beyond sampling error.
2727

2828
| `kind` | Theorem | Reference |
2929
|-----------------|---------------------------------------------------|-----------------------------------------------------------------|
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) |
30+
| `did_sc` | DiD ≡ Synthetic Control | Sun, Xie & Zhang, arXiv:2503.11375 (2025) |
31+
| `ewm_cate` | EWM ≡ CATE-max policy | Kato, arXiv:2510.26723 (2025) |
32+
| `cb_ipw` | Covariate Balancing ≡ IPW ≡ DR | Słoczyński, Uysal & Wooldridge, arXiv:2310.18563 (2023) |
3333
| `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) |
34+
| `dr_calib` | Doubly-robust ≡ outcome + Riesz joint calibration | van der Laan, Luedtke & Carone, arXiv:2411.02771 (2024) |
3535
| `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

docs/guides/causal_mas.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ Explicit kwargs always win over the name heuristic.
193193
- arXiv:2509.00987 (2025/09).
194194
*Causal MAS: A Survey of Large Language Model Architectures for
195195
Discovery and Effect Estimation.*
196-
- Kiciman, E. & Sharma, A. (2025).
197-
*Causal Reasoning with Large Language Models.* arXiv:2402.11068.
196+
- Wan, G., Lu, Y., Wu, Y., Hu, M. & Li, S. (2024).
197+
*Enhancing Causal Discovery with Large Language Models.* arXiv:2402.11068.
198198
- Anthropic (2025).
199199
*Extended Thinking in Claude 4.5 / Opus 4.7.* Technical report.

docs/guides/causal_rl_family.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ data will happily converge to a Q-function that is biased in the direction
8181
of the logging policy's mistakes. `causal_dqn` explicitly caps how much
8282
the confounding can distort Q and returns a sensitivity range.
8383

84-
Citation: Fu & Zhou (2025), arXiv:2510.21110.
84+
Citation: Li, Zhang & Bareinboim (2025), arXiv:2510.21110.
8585

8686
---
8787

@@ -174,8 +174,8 @@ bench.regret_curves # dict: algorithm → regret over time
174174
bench.best # algorithm with lowest cumulative regret
175175
```
176176

177-
Reference: Zhou-Bareinboim (2025), arXiv:2512.18135 — the canonical
178-
unified causal-RL benchmark taxonomy.
177+
Reference: Cunha, Liu, French & Mian (2025), arXiv:2512.18135 — a
178+
canonical unified causal-RL benchmark taxonomy.
179179

180180
---
181181

docs/guides/causal_text_family.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ and human labels exist, then divide:
169169

170170
## References
171171

172-
- Veitch, V., Wang, Y., & Blei, D. M. (2020). "Adapting text embeddings for causal inference." *UAI*. [arXiv:1905.12741](https://arxiv.org/abs/1905.12741).
172+
- Veitch, V., Sridhar, D., & Blei, D. M. (2019). "Adapting text embeddings for causal inference." *UAI*. [arXiv:1905.12741](https://arxiv.org/abs/1905.12741).
173173
- Egami, N., Hinck, M., Stewart, B., & Wei, H. (2024). "Using imperfect surrogates for downstream inference: Design-based supervised learning for social science applications of large language models." *NeurIPS*. [arXiv:2306.04746](https://arxiv.org/abs/2306.04746).
174174
- Hausman, J., Abrevaya, J., & Scott-Morton, F. (1998). "Misclassification of the dependent variable in a discrete-response setting." *Journal of Econometrics*, 87, 239–269.
175175
- Aigner, D. J. (1973). "Regression with a binary independent variable subject to errors of observation." *Journal of Econometrics*, 1(1), 49–59.

docs/guides/choosing_iv_estimator.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ too restrictive, v1.2 ships two non-parametric alternatives:
144144

145145
- `sp.kernel_iv` (Lob et al. 2025, arXiv:2511.21603) delivers a uniform
146146
confidence band over the whole `D`-grid, not just pointwise.
147-
- `sp.continuous_iv_late` (Xie et al. 2025, arXiv:2504.03063) identifies
147+
- `sp.continuous_iv_late` (Zeng et al. 2025, arXiv:2504.03063) identifies
148148
the LATE on the subpopulation most responsive to the instrument —
149149
the natural generalisation of Angrist-Imbens LATE beyond binary `Z`.
150150

docs/guides/conformal_family.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ print(r.dose_curves) # full curve per test row across the grid
295295
fertilizer application, time-in-app. Returns a point estimate + band
296296
at each `(test_row, dose)` pair in the grid.
297297

298-
Citation: Kim, Jeong, Barber, Lee (arXiv:2407.03094, 2024).
298+
Citation: Schröder et al. (arXiv:2407.03094, 2024).
299299

300300
---
301301

docs/guides/harvest_did.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Harvesting DID + Event-Study Designs
22

3-
> Borusyak, Hull & Jaravel (MIT/NBER WP 34550, 2025).
3+
> Abadie, Angrist, Frandsen & Pischke (NBER WP 34550, 2025).
44
55
## 1. What "harvesting" means
66

@@ -112,11 +112,11 @@ boot = bootstrap(df, stat, n_boot=500, cluster='unit', random_state=0)
112112

113113
## 7. References
114114

115-
- Borusyak, Hull & Jaravel (MIT/NBER WP 34550, 2025).
116-
"Harvesting Differences-in-Differences and Event-Study Designs."
115+
- Abadie, Angrist, Frandsen & Pischke (NBER WP 34550, 2025).
116+
"Harvesting Differences-in-Differences and Event-Study Evidence."
117117
- Callaway & Sant'Anna (2021). "Difference-in-Differences with
118118
multiple time periods." *JoE* 225.
119-
- Roth, Sant'Anna, Bilinski & Poe (2025).
119+
- Baker, Callaway, Cunningham, Goodman-Bacon & Sant'Anna (2025).
120120
"Difference-in-Differences Designs: A Practitioner's Guide."
121121
arXiv:2503.13323.
122122

docs/guides/interference_family.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ first-order nuisance misspecification. Requires a **pre-computed
149149
scalar neighbor exposure summary** — you control the mapping (share of
150150
treated neighbors is the usual choice). Needs `n ≥ 10 * n_folds`.
151151

152-
Citation: Parmigiani et al. (arXiv:2509.18484, 2025).
152+
Citation: Wu & Yuan (arXiv:2509.18484, 2025).
153153

154154
### `sp.inward_outward_spillover` — directed networks
155155

@@ -172,7 +172,7 @@ print(r.inward_effect, r.outward_effect, r.ratio_in_out)
172172
influence flow the same way both directions?" A `ratio_in_out` far
173173
from 1 is the signal of directional asymmetry.
174174

175-
Citation: Li, Ratkovic et al. (arXiv:2506.06615, 2025).
175+
Citation: Fang, Airoldi & Forastiere (arXiv:2506.06615, 2025).
176176

177177
---
178178

@@ -218,9 +218,9 @@ print(r.spillover_effect, r.spillover_se)
218218
adjacent and leakage is plausible. The neighbor treatment share must
219219
be pre-computed from user-supplied adjacency.
220220

221-
Reference: Ding et al. (2025), arXiv:2310.18836.
221+
Reference: Leung (2023), arXiv:2310.18836.
222222

223-
### `sp.cluster_staggered_rollout`Zhou et al. (2025)
223+
### `sp.cluster_staggered_rollout`Chen & Li (2025)
224224

225225
Cluster RCT with **staggered** treatment adoption — different clusters
226226
turn on at different calendar times. Produces a dynamic event-study
@@ -242,9 +242,9 @@ print(r.event_study) # rel_time, att, ci_low, ci_high
242242
For individual-level staggered DiD without clustering, use
243243
`sp.callaway_santanna` instead.
244244

245-
Reference: Zhou et al. (2025), arXiv:2502.10939.
245+
Reference: Chen & Li (2025), arXiv:2502.10939.
246246

247-
### `sp.dnc_gnn_did` — double negative controls + GNN (Zhao et al. 2026)
247+
### `sp.dnc_gnn_did` — double negative controls + GNN (Zhang, Fu & Wang 2026)
248248

249249
When you suspect **unmeasured** network confounding (e.g. latent
250250
homophily), combine double negative controls with a GNN embedding of
@@ -268,7 +268,7 @@ rooted in network structure (position, centrality, latent communities).
268268
Requires at least one valid negative-control outcome and one valid
269269
negative-control exposure — chosen from domain knowledge.
270270

271-
Reference: Zhao et al. (2026), arXiv:2601.00603.
271+
Reference: Zhang, Fu & Wang (2026), arXiv:2601.00603.
272272

273273
---
274274

0 commit comments

Comments
 (0)