Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
Next Next commit
Add Goodman-Bacon (2021) paper review
Comprehensive review of "Difference-in-differences with variation in
treatment timing" (Journal of Econometrics 225(2), 254-277,
DOI: 10.1016/j.jeconom.2021.03.014) targeting the BaconDecomposition
methodology-review promotion. Covers:

- Theorem 1 decomposition (Eqs. 10a-g) with the three 2x2 comparison
  types: treated/untreated, earlier/later, later/earlier
- Variance terms (Eqs. 7-9) and decomposition weights (Eqs. 10e-g)
  with explicit superscript-convention note on which group plays the
  treatment role
- Timing-only pair simplification (Eq. 11, μ_kℓ)
- Probability-limit decomposition VWATT + VWCT - ΔATT (Eqs. 14a-c, 15)
  with the VWCT approximation (Eq. 19) — w_k^T and w_k^C formulas
  written with paper-faithful superscripts (all `k` for treatment-role
  weights, all `j` for control-role weights)
- Linear trend-break wrong-sign case (Eqs. 17-18)
- Constant-ATT identification (Eq. 16)
- Controlled DD extension (Section 5.2, Eqs. 21-27)
- Oaxaca-Blinder-Kitagawa specification-comparison decomposition
  (Eq. 20)

Includes a "Methodology Registry Entry" block formatted to match the
REGISTRY.md structure, marked as **proposed** — not yet merged into
docs/methodology/REGISTRY.md. The audit-pass PR for diff_diff/bacon.py
(tracked in TODO.md "Tech Debt from Code Reviews" → Methodology/
Correctness) carries the REGISTRY replacement plus six concrete
follow-up items (verify Theorem 1 / Eqs 10a-g, decide on always-
treated handling, R parity fixtures, methodology test file, REGISTRY
replacement, METHODOLOGY_REVIEW.md status flip).

Documents two library-vs-paper deviations explicitly:

1. Unbalanced panels: paper Appendix A assumes balanced panels;
   diff_diff/bacon.py:491-499 accepts unbalanced panels with a
   UserWarning. The decomposition is exact only on balanced panels.

2. Always-treated unit U-bucketing: paper footnote 11 puts always-
   treated units (t_i < 1) into U alongside never-treated; diff_diff/
   bacon.py:437-439 documents only first_treat ∈ {0, np.inf} as the
   U sentinels, and bacon.py:504-507 implements only that mask.
   Genuinely always-treated units (0 < first_treat <= min(time), per
   docs/troubleshooting.rst:739-747) are not automatically remapped.
   The audit needs to decide how to handle this gap.

Adds a TODO.md row under Methodology/Correctness tech debt for the
BaconDecomposition methodology-audit follow-up, listing the six
items the audit needs to address.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
  • Loading branch information
igerber and claude committed May 16, 2026
commit 8f6ca46bfa11d8efc7d746292a94b1bc9197a826
1 change: 1 addition & 0 deletions TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ Deferred items from PR reviews that were not addressed before merge.

| Issue | Location | PR | Priority |
|-------|----------|----|----------|
| BaconDecomposition: substantive methodology audit pass against Goodman-Bacon (2021). Paper review on file at `docs/methodology/papers/goodman-bacon-2021-review.md` includes a proposed Methodology Registry Entry, but the `REGISTRY.md` `## BaconDecomposition` section (lines ~2598-2654) still carries the older contract. Audit pass needs to (a) verify `bacon.py` matches Theorem 1 / Eqs. 10a-g exactly, (b) decide how to handle genuinely always-treated units (`0 < first_treat <= min(time)`) — paper convention puts them in `U`, but `bacon.py` currently treats only `first_treat ∈ {0, np.inf}` as the `U` bucket, (c) generate R parity fixtures via `bacondecomp::bacon()`, (d) write `tests/test_methodology_bacon.py`, (e) replace the REGISTRY entry with the proposed text, (f) populate Verified Components / Corrections Made / Deviations in `METHODOLOGY_REVIEW.md` and flip status to Complete. | `diff_diff/bacon.py`, `docs/methodology/REGISTRY.md`, `tests/test_methodology_bacon.py`, `METHODOLOGY_REVIEW.md` | follow-up | Medium |
| dCDH: Phase 1 per-period placebo DID_M^pl has NaN SE (no IF derivation for the per-period aggregation path). Multi-horizon placebos (L_max >= 1) have valid SE. | `chaisemartin_dhaultfoeuille.py` | #294 | Low |
| dCDH: Survey cell-period allocator's post-period attribution is a library convention, not derived from the observation-level survey linearization. MC coverage is empirically close to nominal on the test DGP; a formal derivation (or a covariance-aware two-cell alternative) is deferred. Documented in REGISTRY.md survey IF expansion Note. | `chaisemartin_dhaultfoeuille.py`, `docs/methodology/REGISTRY.md` | #408 | Medium |
| dCDH: Parity test SE/CI assertions only cover pure-direction scenarios; mixed-direction SE comparison is structurally apples-to-oranges (cell-count vs obs-count weighting). | `test_chaisemartin_dhaultfoeuille_parity.py` | #294 | Low |
Expand Down
Loading
Loading