Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
each a deferred follow-up. `LPDiDResults` gains `survey_metadata` / `n_strata` / `n_psu`, a
`"survey_tsl"` `vcov_type`, and a Survey Design block in `summary()`. The non-survey path is
byte-for-byte unchanged. Validated against `survey::svyglm` on the stacked long difference
(numeric golden parity is the D2 follow-up).
(full numeric golden parity in Phase D2, below).
- **`LPDiD` complex-survey R-parity validation** (Phase D2). Pins the D1 survey path end-to-end
against `survey::svyglm` (Lumley) goldens on a dedicated staggered-absorbing survey panel:
per-horizon point/SE/df + pooled-post/pre for three variance paths: the variance-weighted full
design (strata+PSU+FPC), the weights-only unit-injected-PSU design, and the direct-covariate
variant (point ~1e-6, SE ~1e-5, df exact via the per-design `n_PSU - n_strata` / `n_PSU - 1`
formula). Each horizon uses a fresh `svydesign` over that horizon's clean sample, matching the
library's per-sample resolution; `svyglm` is the reference implementation of the Binder TSL
sandwich so it anchors the variance directly, and the clean-sample construction is independently
cross-checked against `alexCardazzi/lpdid` (the unweighted variance-weighted event study matches
to <1e-8). New `tests/test_methodology_lpdid.py::TestLPDiDSurveyParityR` +
`benchmarks/R/generate_lpdid_survey_golden.R` + `lpdid_survey_panel.csv` /
`lpdid_survey_golden.json` (own seed, so the absorbing / non-absorbing goldens stay
byte-identical). No estimator change.
- **`TROP` non-absorbing (on/off) treatment support** (Athey, Imbens, Qu & Viviano 2025,
§2.1 / Eq. 12 / Algorithm 2). New `non_absorbing` parameter (default `False`). The paper
supports general assignment patterns ("units moving into and out of treatment"), not only
Expand Down
1 change: 0 additions & 1 deletion TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,6 @@ generic sparse-FE, QR+SVD rank-detection redundancy, `check_finite` bypass — m
| `ImputationDiD` covariate-path variance lacks a dedicated parity anchor — only the no-covariate staggered panel is R-parity'd, though the covariate path shares the same validated projection code. Add a small dense-design **hand-calc** for the covariate projection (no external tooling), or a covariate (time-varying X) R `didimputation` golden asserting overall/ES SE parity (the golden variant needs local R). | `tests/test_methodology_imputation.py`, `benchmarks/R/generate_didimputation_golden.R` | imputation-validation | Mid | Low |
| Add true half-sample BRR replicate-weight regressions per estimator family (current tests use Fay-like 0.5/1.5 perturbations; `test_survey_phase6.py` covers true BRR at the helper level). | `tests/test_replicate_weight_expansion.py` | #253 | Mid | Low |
| Port the CI `<notebook-prose>` extraction into the reviewer-eval harness so `docs/tutorials/*.ipynb` cases (currently guarded out of `verify-corpus`/`run`) can be reviewed with CI-equivalent context. | `tools/reviewer-eval/adapters/ci_prompt.py` | local-review | Mid | Low |
| **`LPDiD` survey-design R-parity (PR-D2)** — pin the stratified-PSU Taylor-linearization standard errors against `survey::svyglm` on the stacked long difference (per-horizon + pooled-post point/SE/df), mirroring `benchmark_survey_estimators.R`. The D1 build ships the survey path validated by pure-Python invariants (reduction/FPC/stratification/lonely-PSU/NaN-consistency); D2 adds the numeric `svyglm` golden + parity test. | `benchmarks/R/`, `tests/test_methodology_lpdid.py` | PR-D1 | Mid | Low |

---

Expand Down
Loading
Loading