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
{{ message }}
Repository navigation
Commit ed8d0b5
Browse filesBrowse the repository at this point in the historyBrowse files
Copy file name to clipboardExpand all lines: DEFERRED.md
+5-5Lines changed: 5 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -8,10 +8,9 @@ provenance and AI-review deviation-documentation: a row here (or in
8
8
- Shippable work lives in [TODO.md](TODO.md); the public feature roadmap in
9
9
[ROADMAP.md](ROADMAP.md); monitoring and current-state notes in
10
10
[docs/dev-status.md](docs/dev-status.md).
11
-
- Version-gated lifecycle items (deprecated-kwarg removals, v4 default flips such as
12
-
`SyntheticDiD``lambda_reg`/`zeta` and the clustered-df convention) are canonically
13
-
tracked in the CI-enforced ledger `docs/v4-deprecations.yaml`; rows here cross-link
14
-
their `M-xxx` ids where applicable.
11
+
- Version-gated lifecycle items (deprecated-kwarg removals and default flips) are
12
+
canonically tracked in the CI-enforced ledger `docs/v4-deprecations.yaml`; rows here
13
+
cross-link their `M-xxx` ids where applicable.
15
14
- The `PR` column points to the originating PR number or review tag.
16
15
17
16
---
@@ -130,7 +129,8 @@ here carry the remaining implementation work and cross-link their `M-xxx` ids.
130
129
131
130
| Issue | Location | PR | Priority |
132
131
|-------|----------|----|----------|
133
-
| Clustered inference df **default flip at v4** (lifecycle + roster: docs/v4-deprecations.yaml M-004..M-006 + M-128..M-131; knob semantics: v4-design §7). Implementation work the ledger rows do not carry: the migration note, and flipping the test expectations that pin the current default (`TestDfConvention`, `test_moderate_t_pins_residual_df_convention`, the per-estimator knob suites). |`diff_diff/linalg.py::LinearRegression`, `diff_diff/estimators.py`, `diff_diff/twfe.py`, `diff_diff/sun_abraham.py`, `diff_diff/wooldridge.py`, `diff_diff/stacked_did.py`, `diff_diff/imputation.py`| — | Medium |
132
+
133
+
No open rows: the clustered-df default flip shipped with the 4.0 cut.
| Re-execute the nine tutorials whose committed outputs still show the 3.x residual-df p-values/CIs after the `df_convention` default moved to `"cluster"` (t(G-1)): `01_basic_did`, `02_staggered_did`, `04_parallel_trends`, `05_honest_did`, `07_pretrends_power`, `09_real_world_examples`, `11_imputation_did`, `13_stacked_did`, `16_wooldridge_etwfe` (not `16_survey_did`: the survey df wins). Run under `DIFF_DIFF_BACKEND=rust` with the per-worktree kernel, reconcile any prose that restates a moved number, and `--nbmake` each; scheduled for the 4.0 release PR (`docs/v4-design.md` section 9 item 10) together with any item-7b/8/9 movers (24 was refreshed in #879; 23 belongs to 7b). |`docs/tutorials/*.ipynb`|#879| Mid | Medium |
88
89
| TWFE event-study one-way HC2-BM absorbed-FE R parity against the `mpd_absorbed_fe_did` golden (`clubSandwich::vcovCR(cluster=1:n, type="CR2")`): the within spec with hc2_bm auto-clusters at unit, so the one-way lane needs an explicit singleton-cluster column (`cluster=<row id>` + hc2_bm = CR2 with G=n, PT2018 §3.3) once the G=n CR2 path is verified; the hc2 lane is pinned by `TestTWFEEventStudyAbsorbedFERParity` and the clustered hc2_bm per-period lane by `test_twfe_event_study_cluster_hc2_bm_per_period_df_matches_clubsandwich`; the MultiPeriodDiD lanes died at the 4.0 cut (PR 4c-ii) |`tests/test_estimators_vcov_type.py`| #v4-4c-i | Mid | Medium |
89
90
| TWFE event-study power profile: `simulate_power`/`simulate_mde`/`simulate_sample_size` have no `_EstimatorProfile` for `TwoWayFixedEffects.fit(event_study=True)` since the MultiPeriodDiD registry entry went with the class (PR 4c-ii); `EventStudyResults` carries no scalar headline, so the profile needs a design (post-period average via the `tests/helpers/event_study_average.py` arithmetic, or a named period) plus its `_SURVEY_FIT_BUILDERS` twin |`diff_diff/power.py`| #v4-4c-ii | Mid | Low |
90
91
| Clustered hc2_bm Bell-McCaffrey DOF guard is batch-relative (`linalg._cr2_bm_dof_inner`: a contrast is NaN'd when its scaled max\|B\| falls below 1e-10 of the batch maximum), so the event-study core keeps the otherwise-unused post-period-average contrast column as the anchor to hold the 3.x per-period NaN masks bit-identical (PR 4c-ii, user decision 2026-10-25). Reproduction: `x_nc = treated * 1[period >= 4] + 3e-6 * default_rng(seed).normal(size=n)` as a covariate on the oracle panel flips the mask between `[eye(k), avg]` and `eye(k)` on 20/20 seeds (cond(X) ~ 9e5; 1e-7 never flips, <= 3e-8 rank-drops) - too BLAS-sensitive for a committed oracle, hence the structural pin `test_hc2_bm_contrast_batch_keeps_post_average_anchor`. Decide whether the guard should use a batch-independent anchor (the treatment contrast, or the absolute floor only) and then drop the column |`diff_diff/estimators.py`, `diff_diff/linalg.py`| #v4-4c-ii | Mid | Medium |
- **4.0 cut, `df_convention` default flip (`M-004`, `M-005`, `M-006`, `M-128`, `M-129`, `M-130`, `M-131`).** The analytical tail-df convention for CLUSTERED fits defaults to `"cluster"` (the Stata/fixest `t(G - 1)` reference) instead of `"residual"` (the fitted residual df `t(n - K_full)`) on `DifferenceInDifferences`, `TwoWayFixedEffects`, `LinearRegression`, `SunAbraham`, `WooldridgeDiD` (OLS arms), `StackedDiD` and `ImputationDiD` (pretrends leads); `LPDiD` already defaulted to `"cluster"` at 3.9. What moves: p-values and confidence intervals on clustered analytical fits - `TwoWayFixedEffects` (static, and event-study with `unit=`), `SunAbraham`, `WooldridgeDiD` OLS and `StackedDiD` cluster at `unit` by default, so their default fits move; `ImputationDiD` moves on the `pretrends=True` lead rows; `DifferenceInDifferences` / `LinearRegression` move only with an explicit `cluster=` / `cluster_ids=`; the analytical lanes inside bootstrapped fits (`WooldridgeDiD` per-cell inference and post-fit `aggregate()`, `ImputationDiD` bootstrapped leads) move too, as do the fake-timing / fake-group placebo diagnostics and the power simulators that relay those p-values. What does not: point estimates, standard errors and t-statistics; survey-design fits (survey df keeps precedence); `vcov_type="hc2_bm"` (Bell-McCaffrey DOF keep precedence); bootstrap percentile p-values / CIs; unclustered and Conley fits; the BJS overall/post inference of `ImputationDiD`; `WooldridgeDiD` logit/poisson arms; permutation and leave-one-out diagnostics. `df_convention="residual"` restores the 3.x inference bit-for-bit; on the surfaces where the knob is a documented no-op (non-`pretrends` `ImputationDiD`, `WooldridgeDiD` logit/poisson) the inert-config `UserWarning` now fires for an explicit `"residual"` rather than for an explicit `"cluster"`. `SyntheticDiD` inherits the flipped attribute from `DifferenceInDifferences` without reading it (no behaviour change).
4
+
5
+
### Internal
6
+
7
+
- Ledger rows `M-004`..`M-006` and `M-128`..`M-131` flip to `done` with `tests/test_v4_inference_defaults.py` as their `test_ref`; the spec's section 7 / item 7 SHIPPED notes and item 10 now record the deferred bulk re-execution of the nine tutorials whose clustered-default outputs moved (24 re-executed here if its outputs moved); the REGISTRY TwoWayFixedEffects clustered-CR1 inference-df note is relabelled a plain Note (the default now matches fixest) and the SunAbraham / ImputationDiD / StackedDiD / WooldridgeDiD / LPDiD tail-df notes read the 4.0 default; `TestDfConvention`, `test_moderate_t_pins_cluster_df_convention` and the per-estimator knob suites pin the G-1 default against explicit `"residual"` baselines (every default-vs-`"cluster"` comparison became default-vs-`"residual"` so none passes vacuously); `test_ci_matches_r_twfe` tightens to machine precision; the variance-conventions audit matrix keeps its residual-df rows as explicit `"residual"` arms (the K_full accounting pins) and gains eight G-1 `_default_df` twins (three in the fast set), with `docs/methodology/variance-conventions.md` regenerated; the committed TWFE event-study oracle lanes `pooled_cluster_unit` / `within_cluster_unit` and the ImputationDiD `pretrends_all` contract lanes name the `"residual"` convention they were captured under (metadata-only, no oracle number touched); the `DEFERRED.md` Version-gated (v4) row is retired.
0 commit comments