You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: ROADMAP.md
+20-8Lines changed: 20 additions & 8 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -8,19 +8,37 @@ For past changes and release history, see [CHANGELOG.md](CHANGELOG.md).
8
8
9
9
## Current Status
10
10
11
-
diff-diff v2.6.0 is a **production-ready** DiD library with feature parity with R's `did` + `HonestDiD` + `synthdid` ecosystem for core DiD analysis:
11
+
diff-diff v2.7.5 is a **production-ready** DiD library with feature parity with R's `did` + `HonestDiD` + `synthdid` ecosystem for core DiD analysis, plus **unique survey support** — design-based variance estimation (Taylor linearization, replicate weights) integrated across all estimators. No R or Python package offers this combination:
12
12
13
13
-**Core estimators**: Basic DiD, TWFE, MultiPeriod, Callaway-Sant'Anna, Sun-Abraham, Borusyak-Jaravel-Spiess Imputation, Synthetic DiD, Triple Difference (DDD), TROP, Two-Stage DiD (Gardner 2022), Stacked DiD (Wing et al. 2024), Continuous DiD (Callaway, Goodman-Bacon & Sant'Anna 2024)
-**Sensitivity analysis**: Honest DiD (Rambachan-Roth), Pre-trends power analysis (Roth 2022)
17
17
-**Study design**: Power analysis tools
18
18
-**Data utilities**: Real-world datasets (Card-Krueger, Castle Doctrine, Divorce Laws, MPDTA), DGP functions for all supported designs
19
+
-**Survey support**: Full `SurveyDesign` with strata, PSU, FPC, weight types, replicate weights (BRR/Fay/JK1/JKn), Taylor linearization, DEFF diagnostics, subpopulation analysis — integrated across all estimators (see [survey-roadmap.md](docs/survey-roadmap.md))
19
20
-**Performance**: Optional Rust backend for accelerated computation; faster than R at scale (see [CHANGELOG.md](CHANGELOG.md) for benchmarks)
20
21
21
22
---
22
23
23
-
## Near-Term Enhancements (v2.7)
24
+
## Near-Term Enhancements (v2.8)
25
+
26
+
### Survey Phase 7: Completing the Survey Story
27
+
28
+
Close the remaining gaps for practitioners using major population surveys
29
+
(ACS, CPS, BRFSS, MEPS). See [survey-roadmap.md](docs/survey-roadmap.md) for
30
+
full details.
31
+
32
+
-**CS Covariates + IPW/DR + Survey***(Implemented)*: DRDID nuisance IF
33
+
corrections (PS + OR) under survey weights for all estimation methods.
34
+
-**Repeated Cross-Sections***(Implemented)*: `panel=False` support for
35
+
CallawaySantAnna using cross-sectional DRDID (Sant'Anna & Zhao 2020,
Copy file name to clipboardExpand all lines: TODO.md
+13-7Lines changed: 13 additions & 7 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -54,11 +54,17 @@ Deferred items from PR reviews that were not addressed before merge.
54
54
|-------|----------|----|----------|
55
55
| ImputationDiD dense `(A0'A0).toarray()` scales O((U+T+K)^2), OOM risk on large panels |`imputation.py`|#141| Medium (deferred — only triggers when sparse solver fails) |
56
56
| Multi-absorb weighted demeaning needs iterative alternating projections for N > 1 absorbed FE with survey weights; unweighted multi-absorb also uses single-pass (pre-existing, exact only for balanced panels) |`estimators.py`|#218| Medium |
57
-
| CallawaySantAnna survey + covariates + IPW/DR: DRDID panel nuisance-estimation IF corrections not implemented. Currently gated with NotImplementedError. Regression method with covariates works. |`staggered.py`|#233| Medium — tracked in Survey Phase 7a |
58
-
| EfficientDiD `control_group="last_cohort"` trims at `last_g - anticipation` but REGISTRY says `t >= last_g`. With `anticipation=0` (default) these are identical. Needs design decision for `anticipation>0`. |`efficient_did.py`|#230| Low |
59
-
| TripleDifference power: `generate_ddd_data` is a fixed 2×2×2 cross-sectional DGP — no multi-period or unbalanced-group support. |`prep_dgp.py`, `power.py`|#208| Low |
| EfficientDiD hausman_pretest() clustered covariance stale `n_cl` — **Resolved**. Recompute `n_cl` and remap indices after `row_finite` filtering via `np.unique(return_inverse=True)`. |`efficient_did.py`|#230| Resolved |
62
+
| EfficientDiD `control_group="last_cohort"` trims at `last_g - anticipation` but REGISTRY says `t >= last_g`. With `anticipation=0` (default) these are identical. With `anticipation>0`, code is arguably more conservative (excludes anticipation-contaminated periods). Either align REGISTRY with code or change code to `t < last_g` — needs design decision. |`efficient_did.py`|#230| Low |
63
+
| TripleDifference power: `generate_ddd_data` is a fixed 2×2×2 cross-sectional DGP — no multi-period or unbalanced-group support. Add a `generate_ddd_panel_data` for panel DDD power analysis. |`prep_dgp.py`, `power.py`|#208| Low |
64
+
| ContinuousDiD event-study aggregation anticipation filter — **Resolved**. `_aggregate_event_study()` now filters `e < -anticipation` when `anticipation > 0`, matching CallawaySantAnna behavior. Bootstrap paths also filtered. |`continuous_did.py`|#226| Resolved |
65
+
| Survey design resolution/collapse patterns are inconsistent across panel estimators — ContinuousDiD rebuilds unit-level design in SE code, EfficientDiD builds once in fit(), StackedDiD re-resolves on stacked data; extract shared helpers for panel-to-unit collapse, post-filter re-resolution, and metadata recomputation |`continuous_did.py`, `efficient_did.py`, `stacked_did.py`|#226| Low |
| TROP: `fit()` and `_fit_global()` share ~150 lines of near-identical data setup (panel pivoting, absorbing-state validation, first-treatment detection, effective rank, NaN warnings). Both bootstrap methods also duplicate the stratified resampling loop. Extract shared helpers to eliminate cross-file sync risk. |`trop.py`, `trop_global.py`, `trop_local.py`| — | Low |
62
68
| StaggeredTripleDifference R cross-validation: CSV fixtures not committed (gitignored); tests skip without local R + triplediff. Commit fixtures or generate deterministically. |`tests/test_methodology_staggered_triple_diff.py`|#245| Medium |
63
69
| StaggeredTripleDifference R parity: benchmark only tests no-covariate path (xformla=~1). Add covariate-adjusted scenarios and aggregation SE parity assertions. |`benchmarks/R/benchmark_staggered_triplediff.R`|#245| Medium |
64
70
| StaggeredTripleDifference: per-cohort group-effect SEs include WIF (conservative vs R's wif=NULL). Documented in REGISTRY. Could override mixin for exact R match. |`staggered_triple_diff.py`|#245| Low |
@@ -163,8 +169,8 @@ Features in R's `did` package that block porting additional tests:
163
169
164
170
| Feature | R tests blocked | Priority | Status |
165
171
|---------|----------------|----------|--------|
166
-
| Repeated cross-sections (`panel=FALSE`) |~7 tests in test-att_gt.R + test-user_bug_fixes.R | High |Planned — Survey Phase 7b |
167
-
| Sampling/population weights | 7 tests incl. all JEL replication | Medium |Mostly resolved (Phases 1-6); CS IPW/DR + covariates + survey in Phase 7a|
172
+
| Repeated cross-sections (`panel=FALSE`) |~7 tests in test-att_gt.R + test-user_bug_fixes.R | High |**Resolved** — Phase 7b: `panel=False` on CallawaySantAnna|
0 commit comments