Skip to content

Commit 64d8ea9

Browse files
igerberclaude
andauthored
Add LP-DiD launch carousel (local-projections crossover narrative) (#597)
* Add LPDiD launch carousel (one-regression-to-rule-them-all narrative) 11-slide LinkedIn deck for the LP-DiD estimator (Dube, Girardi, Jorda & Taylor 2025). Horizon palette (violet/cyan/amber), spillover-deck architecture. Claim discipline: CS/Cengiz-stacked equivalences marked exact (Sec. 3.7), BJS scoped to exact-single-cohort (fn. 10-11), no speed claims (paper's Table 2 speedups are Stata artifacts; diff-diff's vectorized CS outbenchmarks LPDiD, verified empirically). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Scope carousel unification claims to the four documented equivalences Cover/shelf/equivalence-map now name exactly the estimators the paper proves LP-DiD nests (CS, Cengiz stacked, classic 2x2, single-cohort BJS); Sun-Abraham removed from the unification arc (no documented equivalence). "Whole zoo is a keyword argument" scoped to CS. Footer version derived from pyproject.toml (was hard-coded, stale at v3.6.0). Non-absorbing/survey code comments made caveat-precise. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Polish carousel claim precision (Cengiz qualifier, covariate caveat, default-path survey) Cover names Cengiz-style stacking (the paper's actual equivalence target, not StackedDiD generically); non-negative-weights card scoped to the clean-control baseline with RA-preferred note; survey cards on slides 9/10 marked default-path. Version parse switched from tomllib (3.11+) to a stdlib regex so the generator runs on Python >=3.9. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Fix slide-6 estimand sum to treated cohorts only; scope composability claim E(beta_h) now sums over g != 0 (paper Eq. 9; never-treated is the control cohort, not an ATT recipient). Slide-9 footer scoped: survey_design composes on the default path only (rejects reweight=True). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Scope fixest-parity card to VW variants; precision + cleanup polish Slide-10 fixest card scoped to variance-weighted point+SE parity (the reweighted effect-stabilization SE is pinned, not parity). Composition card says post-window sample; shelf caption "Same causal question." Removed unused _render_equations helper; documented carousel-only generation deps (fpdf2/Pillow/matplotlib) in the docstring. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Qualify BJS as BJS-style on cover/shelf; add carousel README (regen contract) The single-cohort-PMD equivalence scope now travels with the name on every user-visible surface ("BJS-style imputation"), matching the slide-6 and slide-10 qualifiers. carousel/README.md documents the regenerate-with-the-script contract, generation-only deps, and the claim-discipline convention for methodology copy. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Correct parity tolerance to ~1e-12 (registry B2 bundle); fix README deps wording The authors'-recipes card claimed ~1e-13; the registry records the absorbing R-parity bundle at ~1e-12 (only pooled specifically ~1e-13). README: matplotlib is already in dev/docs extras; only fpdf2/Pillow are carousel-only. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Scope slide-5 clean-control caption to the absorbing path Eq. 13 effect-stabilization admits stabilized already-treated units as clean controls, so the unqualified "never serve as controls" was too broad. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Rename shelf card to Cengiz-Style Stacking (never the library's StackedDiD name) diff-diff's StackedDiD implements Wing-Freedman-Hollingsworth (2024) Q-weights, a different (corrected) scheme LP-DiD does not nest; the paper's Sec. 3.7 equivalence target is the Cengiz et al. (2019) literature design. The shelf card previously juxtaposed the library estimator name with the Cengiz citation, inviting a false identification. Claim-discipline docstring now carries the rule. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Rebuild carousel on the paper's own novelty spine (IRF crossover narrative) New arc per Dube-Girardi-Jorda-Taylor (2025) pp. 741-742, quotes verbatim: macro built LPs for dynamic effects of shocks (cover, IRF motif) -> negative weighting via contamination schematic + pull quote -> dark twist slide (naive LP inherits the bias, Eqs. 6-7) -> the "underappreciated feature" fusion (LP + clean controls) -> "unclean" mechanism grid -> non-negative weights + "subsumes" equivalence map -> symmetric pre-trends (Roth 2024, authors' claim) -> code/production/ validated/CTA. Visual flair: amber kickers, serif pull quotes, card shadows, one dark slide; type floored at ~13pt body / 38-52pt headlines for phone-width legibility. All prior claim discipline retained (BJS-style single-cohort, Cengiz-style literature naming, default-path survey, ~1e-12 tolerance, no speed claims, Sum over g != 0). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Rename slide-9 card to Non-Absorbing Entry Effects; add README install command Card title now matches the registry's entry-effect scope (exit-event dynamics are deferred). README gains the pip install line for the carousel-only deps. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Cover motif polish: anchor shock dash at curve baseline, label hugs the line The dashed shock marker no longer extends below the pre-period line (read as a rendering mistake); the "shock" label sits directly beside its dash. Slide-6 lead-in rephrased to a plain sentence. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Cover: punchline contained above the motif baseline Trimmed the below-baseline padding so the curve's flat line is the motif's bottom edge, and raised the punchline so no text hangs under the chart. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
1 parent d895ade commit 64d8ea9

3 files changed

Lines changed: 1451 additions & 0 deletions

File tree

carousel/README.md

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# Carousel decks
2+
3+
LinkedIn launch carousels for diff-diff estimators. Each deck is a
4+
`generate_*.py` script that renders its committed PDF; the PDF is a build
5+
artifact of the script and must never be edited independently.
6+
7+
## Regenerating
8+
9+
```bash
10+
python carousel/generate_lpdid_carousel.py # -> diff-diff-lpdid-carousel.pdf
11+
python carousel/generate_spillover_carousel.py # -> diff-diff-spillover-carousel.pdf
12+
# ... one generator per deck, same pattern
13+
```
14+
15+
**Whenever a generator changes, regenerate its PDF in the same commit.** The
16+
decks carry methodology claims (equivalences, parity tolerances, validation
17+
scope), so a stale PDF can ship an overclaim that the script no longer makes.
18+
19+
## Dependencies
20+
21+
Carousel generation additionally requires `fpdf2` and `Pillow`, which are
22+
intentionally NOT part of the library's install or dev extras; `matplotlib`
23+
is already available through the dev/docs extras but is not a runtime
24+
install dependency. Python >= 3.9.
25+
26+
```bash
27+
python -m pip install fpdf2 Pillow
28+
```
29+
30+
## Claim discipline
31+
32+
Slide copy that states methodology facts (equivalence targets, tolerances,
33+
validated scope) must match `docs/methodology/REGISTRY.md` and the paper
34+
review under `docs/methodology/papers/`. Qualifiers are part of the claim --
35+
e.g. "Cengiz-style" stacking, "BJS-style" imputation (exact only in the
36+
single-cohort PMD case), "default path" for LPDiD survey support. See the
37+
"Claim discipline" section in each generator's module docstring for the
38+
deck-specific rules, and keep footer version labels derived from
39+
`pyproject.toml` (never hard-coded).
351 KB
Binary file not shown.

0 commit comments

Comments
 (0)