Skip to content

Add LP-DiD launch carousel (local-projections crossover narrative)#597

Merged
igerber merged 13 commits into
mainfrom
docs/lpdid-carousel
Jul 2, 2026
Merged

Add LP-DiD launch carousel (local-projections crossover narrative)#597
igerber merged 13 commits into
mainfrom
docs/lpdid-carousel

Conversation

@igerber

@igerber igerber commented Jul 2, 2026

Copy link
Copy Markdown
Owner

Summary

  • Add the LP-DiD launch carousel: carousel/generate_lpdid_carousel.py (generator, "Horizon" palette: violet/cyan/amber on a lavender gradient) + the rendered carousel/diff-diff-lpdid-carousel.pdf (11 slides, 4:5) + carousel/README.md (regeneration contract, carousel-only deps, claim-discipline convention).
  • Narrative spine follows the paper's own novelty argument (JAE 2025, pp. 741-742), with pull quotes verbatim: macro built local projections to read dynamic effects of shocks (cover, IRF motif) -> negative-weighting contamination (pull quote + schematic) -> dark twist slide (a naive LP implementation inherits the same bias, Eqs. 6-7) -> the "underappreciated feature" fusion (LP + clean controls = LP-DiD) -> "unclean" observations mechanism grid -> non-negative weights (sum over g != 0, Eqs. 9-10) + the "subsumes" equivalence map -> symmetric pre-trends (Roth 2024, the authors' claim) -> code / production grid / validation story / CTA.
  • Claim discipline documented in the module docstring: equivalence map limited to the four proven nestings (Callaway-Sant'Anna exact Sec. 3.7; Cengiz-style stacking exact Sec. 3.7 - literature design, deliberately never called "Stacked DiD" since the library's StackedDiD implements WFH 2024 Q-weights, which LP-DiD does not nest; classic 2x2 Sec. 2.2; BJS-style exact single-cohort PMD, fn. 10-11). Survey claims scoped to the variance-weighted default path; non-absorbing scoped to entry effects (Eq. 12/13); fixest parity scoped to VW variants; tolerances match the REGISTRY-recorded digits; no speed claims (the paper's Table 2 speedups are Stata-implementation artifacts and do not hold for diff-diff's vectorized CS - verified empirically).
  • Footer version label parsed from pyproject.toml at generation time (stdlib regex, Python >= 3.9), so the deck cannot drift from the release it advertises.

Methodology references (required if estimator / math changes)

  • Method name(s): N/A - no estimator/math changes (marketing/documentation asset only). Deck copy describes LPDiD.
  • Paper / source link(s): Dube, Girardi, Jordà & Taylor (2025), "A Local Projections Approach to Difference-in-Differences," Journal of Applied Econometrics 40(5), 741-758. https://doi.org/10.1002/jae.70000
  • Any intentional deviations from the source (and why): None - slide copy quotes the paper verbatim and mirrors the scoping already documented in docs/methodology/REGISTRY.md (## LPDiD).

Validation

  • Tests added/updated: No test changes.
  • Backtest / simulation / notebook evidence (if applicable): N/A. All numeric claims on the deck (parity tolerances, equivalence scope, survey/non-absorbing limits) restate REGISTRY-documented, test-backed results; the deck introduces no new numbers.

Security / privacy

  • Confirm no secrets/PII in this PR: Yes

Generated with Claude Code

igerber and others added 13 commits July 2, 2026 08:46
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>
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>
…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>
… 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>
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>
…ontract)

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>
…eps 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>
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>
…edDiD 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>
…ative)

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>
…l 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>
…he 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>
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>
@github-actions

github-actions Bot commented Jul 2, 2026

Copy link
Copy Markdown

Overall Assessment

Looks good — no unmitigated P0/P1 findings.

Executive Summary

  • No estimator, weighting, variance, SE, or default behavior changes were introduced.
  • Affected method is LPDiD, but only through carousel/documentation copy.
  • The deck’s LPDiD methodology claims match docs/methodology/REGISTRY.md and the local Dube paper review.
  • The committed PDF text matches the generator output claims and uses the v3.6.1 footer from pyproject.toml.
  • No security, performance, or maintainability blockers found.

Methodology

Finding: No findings
Severity: None
Impact: The LPDiD claims are scoped correctly: clean controls/non-negative weights, CS/Cengiz/2x2/BJS equivalence qualifiers, non-absorbing entry effects, and survey default-path scope are all consistent with docs/methodology/REGISTRY.md:L1799-L1895 and the generator’s claim discipline at carousel/generate_lpdid_carousel.py:L34-L55.
Concrete fix: N/A.

Code Quality

Finding: No findings
Severity: None
Impact: The generator parses successfully and follows the existing carousel pattern. Version parsing from pyproject.toml is explicit and fail-closed at carousel/generate_lpdid_carousel.py:L87-L94.
Concrete fix: N/A.

Performance

Finding: No findings
Severity: None
Impact: This is an offline asset generator; no library runtime path is affected. The deck also avoids unsupported LPDiD speed claims.
Concrete fix: N/A.

Maintainability

Finding: No findings
Severity: None
Impact: carousel/README.md:L15-L18 documents the regenerate-with-PDF contract, and carousel/README.md:L30-L39 documents claim discipline against the registry/paper review.
Concrete fix: N/A.

Tech Debt

Finding: No findings
Severity: None
Impact: Existing LPDiD deferred limitations remain documented in TODO.md, including non-absorbing exit-event dynamics and survey reweight/replicate gaps; the deck preserves those scopes.
Concrete fix: N/A.

Security

Finding: No findings
Severity: None
Impact: No secrets or PII found in the added generator, README, or extracted PDF text. The generator only reads local pyproject.toml, writes the committed PDF path, and uses temporary image files.
Concrete fix: N/A.

Documentation/Tests

Finding: No findings
Severity: None
Impact: No new tests were added, but the PR is a documentation/marketing asset. The claims are already backed by existing LPDiD parity tests, including CS/BJS equivalences at tests/test_lpdid.py:L712-L758, R parity at tests/test_methodology_lpdid.py:L227-L305, non-absorbing parity at tests/test_methodology_lpdid.py:L308-L370, and survey parity at tests/test_methodology_lpdid.py:L390-L536.
Concrete fix: N/A.

@igerber igerber added the ready-for-ci Triggers CI test workflows label Jul 2, 2026
@igerber igerber merged commit 64d8ea9 into main Jul 2, 2026
5 of 6 checks passed
@igerber igerber deleted the docs/lpdid-carousel branch July 2, 2026 12:52
@igerber igerber mentioned this pull request Jul 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ready-for-ci Triggers CI test workflows

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant