Commit 8f6ca46
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>1 parent e67bbc0 commit 8f6ca46
2 files changed
Lines changed: 334 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
74 | 74 | | |
75 | 75 | | |
76 | 76 | | |
| 77 | + | |
77 | 78 | | |
78 | 79 | | |
79 | 80 | | |
| |||
0 commit comments