{{ message }}
LinkedIn launch carousel for SpilloverDiD (Butts 2021)#490
Merged
Conversation
Marketing artifact (carousel PDF + generator script). NOT a library code
change — SpilloverDiD shipped through v3.4.1 in Waves A/C/D/E.1/E.2/E.3.
Methodology claims made in the deck — please validate against the source
of truth on review:
1. Slide 1 hook: "There's a clean line between treated and control. /
Until there isn't." Hook framing, not a methodological claim — but
verify it doesn't overstate (we're saying SOME contamination, not
wholesale corruption).
2. Slide 4 footnote: "Built on two-stage Gardner (2022) DiD." — verify
Gardner year matches docs/methodology/REGISTRY.md SpilloverDiD section.
3. Slide 6 equation: "beta_DiD ~ tau_total - tau_spill(0)" attributed
to Butts 2021 Proposition 2.1. Verify sign convention + citation
against docs/methodology/papers/butts-2021-review.md L101-113 and
diff_diff/spillover.py module docstring.
4. Slide 8 code: SpilloverDiD constructor (rings, conley_coords) +
fit(data, outcome, unit, time, treatment) + result.att +
result.spillover_effects DataFrame schema. Verify against
diff_diff/spillover.py and diff_diff/results.py SpilloverDiDResults.
5. Slide 9 production-ready cards — verify each is actually shipped:
- Spatial-HAC SEs (Conley 1999 panel-block, kdtree fast path)
- Cluster-Robust (HC1 / CR1 with Gardner GMM correction)
- Survey Design (pweights / strata / PSU / FPC via Binder TSL)
- Subpopulation Domains (full-design retention via zero-pad scores)
- Event-Study Mode (per-event-time x ring decomposition)
- Staggered Timing (Gardner two-stage; non-staggered too)
6. Slide 10 validation cards:
- Butts Eq 5/6 + Proposition 2.1 — implemented as written
- Gardner Two-Stage GMM Section 4 — stage-1 FE + first-stage
uncertainty correction
- Conley (1999) Spatial-HAC — matched to R conleyreg at atol=1e-6
on parity fixtures (verified against tests/test_conley_vcov.py
PARITY_TOL = 1e-6)
- Monte Carlo Coverage — recovers known tau_total + delta_j;
coverage near nominal level
7. Slide 3 real-world examples (place-based econ + OOH + geo-targeted
digital + retail footprint) — fair characterizations of spillover
dynamics, or overstated?
Out of scope for the deck (intentional):
- Self-citation of Gerber (2026) Binder TSL — kept out of the PDF;
surfaced only in the LinkedIn caption copy.
- vcov_type="classical" restriction; replicate-weight NotImplementedError
gates; HC2/HC2_BM not yet routed for stage-2; data-driven d_bar
selection — all queued follow-ups documented in spillover.rst.
Earth-tone palette (slate-blue / warm terra / muted gold / cream) is a
fresh family variation; HAD's indigo palette unchanged.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Addresses /ai-review-local findings (review at .claude/reviews/local-review-latest.md): P1 #1 — Slide 10 card 1 "implemented as written" overclaimed paper fidelity. SpilloverDiD is a documented synthesis (REGISTRY.md L3274-L3288 + butts-2021-review.md L123-L139): the library uses the time-varying ring-exposure form, not Butts's literal unit-static Eq. 5 (which is rank-deficient under TWFE). Rewrote to "Time-varying ring-exposure synthesis (Butts Sec 5 + Gardner + Conley)." P1 #2 — Slide 10 card 4 "Monte Carlo coverage / coverage near nominal" overclaimed inference validation. Current tests at tests/test_spillover.py:L741-L823 + L3625-L3702 are recovery tests, not CI coverage tests. Renamed card "Monte Carlo Coverage" → "Monte Carlo Recovery" with desc "Recovers known tau_total + delta_j on synthetic spillover DGPs." Subtitle "Paper equations + Monte Carlo coverage" → "Documented synthesis + Monte Carlo recovery". P3 — Outer ring label "[100, 200)" → "[100, 200]" on slide 7 chart and slide 8 code sample. Matches the public SpilloverDiDResults.spillover_effects schema at diff_diff/results.py:L368-L372 (last interval is closed-right). PDF regenerated. No methodology code touched. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Address Codex re-review P3: internal docstring still said "paper-equation parity + Monte Carlo coverage" after the prior commit corrected the user-facing slide copy to "documented synthesis + Monte Carlo recovery". Stale local description; doesn't render in the PDF but could reintroduce the over-claim on future edits. PDF unchanged. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The "the hidden bias term" caption was centered under the full equation, which visually landed closer to tau_total than to tau_spill(0). Readers could plausibly interpret tau_total as the hidden bias, which is the opposite of the truth: tau_total is the estimand we want to recover, and tau_spill(0) is the contaminating bias term. Rewrote slide 6 to render the equation + an actual annotation arrow as a single matplotlib figure via a new _render_bias_equation() helper. The arrow originates near the base of tau_spill(0) and a "hidden bias term" label sits below it in TERRA — unambiguously naming the correct term. The standalone TERRA italic caption beneath the equation is removed (superseded by the inline arrow + label). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Arrow x-position 0.715 → 0.668 in the matplotlib figure coordinate space. Previous position landed on the right edge of "(0)"; intermediate 0.645 overcorrected to the left edge of the tau glyph. 0.668 sits between the "spill" subscript and the "(0)" — visual center of the compound symbol. PDF regenerated. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

Summary
carousel/generate_spillover_carousel.py(an 11-slide portrait LinkedIn carousel generator for the SpilloverDiD launch) plus the generatedcarousel/diff-diff-spillover-carousel.pdfartifact.[100, 200)→[100, 200]to match the publicSpilloverDiDResults.spillover_effectsschema; (4) slide-6 bias-annotation arrow now points specifically attau_spill(0)(previously ambiguous under the equation center).Methodology references (required if estimator / math changes)
Validation
Security / privacy
Generated with Claude Code