Skip to content

Commit 784f067

Browse files
igerberclaude
andcommitted
Address AI review feedback on v2.7 carousel
- Narrow PT-Post equivalence claims to post-treatment ATT (P1) - Replace fabricated SE/CI table with scoped equivalence statement - Soften "First & Only" to "First Open-Source" (P3) - Fix slide method numbering to match actual positions (P3) - Fix equation rendering for GLS optimal weight formula - Tighten slide 5 text spacing Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 2aafc94 commit 784f067

2 files changed

Lines changed: 34 additions & 91 deletions

File tree

3.21 KB
Binary file not shown.

carousel/generate_v27_pdf.py

Lines changed: 34 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -330,9 +330,8 @@ def slide_01_hook(self):
330330
self._centered_text(55, "Efficient DiD", size=52, color=CYAN)
331331

332332
# Positioning statement
333-
self._centered_text(118, "First & Only", size=30, color=WHITE)
334-
self._centered_text(150, "Open-Source Implementation", size=30,
335-
color=WHITE)
333+
self._centered_text(118, "First Open-Source", size=30, color=WHITE)
334+
self._centered_text(150, "Implementation", size=30, color=WHITE)
336335

337336
# Badge
338337
badge_w = 170
@@ -417,8 +416,8 @@ def slide_03_insight(self):
417416

418417
# Equation
419418
eq_path, epw, eph = self._render_equations(
420-
[r"$w^* = \frac{\mathbf{1}' \Omega^{*-1}"
421-
r"}{\mathbf{1}' \Omega^{*-1} \mathbf{1}}$"],
419+
[r"$w^* = \frac{\mathbf{1}' (\Omega^*)^{-1}"
420+
r"}{\mathbf{1}' (\Omega^*)^{-1} \mathbf{1}}$"],
422421
fontsize=34,
423422
)
424423
eq_y = fan_y + fan_h + 8
@@ -460,7 +459,7 @@ def slide_04_assumption(self):
460459
"label_color": ORANGE,
461460
"line1": "Trends hold between treated",
462461
"line2": "cohort and comparison group",
463-
"result": "= Callaway-Sant'Anna",
462+
"result": "= CS post-treatment ATT",
464463
},
465464
{
466465
"x": margin + panel_w + gap,
@@ -531,20 +530,18 @@ def slide_04_assumption(self):
531530

532531
self._add_footer()
533532

534-
def slide_04_payoff(self):
535-
"""Slide 4: The Payoff — tightest possible CIs."""
533+
def slide_05_payoff(self):
534+
"""Slide 5: The Payoff — tightest possible CIs."""
536535
self.add_page()
537536
self._add_dark_bg()
538537

539538
self._centered_text(30, "The Payoff", size=38, color=WHITE)
540539

541540
# Body text
542-
self._centered_text(78, "Achieves the semiparametric efficiency",
541+
self._centered_text(80, "Achieves the semiparametric efficiency bound",
542+
size=18, bold=False, color=GRAY)
543+
self._centered_text(98, "-- tightest possible confidence intervals.",
543544
size=18, bold=False, color=GRAY)
544-
self._centered_text(98, "bound -- tightest possible", size=18,
545-
bold=False, color=GRAY)
546-
self._centered_text(118, "confidence intervals.", size=18,
547-
bold=False, color=GRAY)
548545

549546
# CI comparison
550547
ci_path, cpw, cph = self._render_ci_comparison()
@@ -573,8 +570,8 @@ def slide_04_payoff(self):
573570

574571
self._add_footer()
575572

576-
def slide_05_code(self):
577-
"""Slide 5: The Code — syntax-highlighted API example."""
573+
def slide_06_code(self):
574+
"""Slide 6: The Code — syntax-highlighted API example."""
578575
self.add_page()
579576
self._add_dark_bg()
580577

@@ -615,89 +612,35 @@ def slide_05_code(self):
615612

616613
self._add_footer()
617614

618-
def slide_06_safety_net(self):
619-
"""Slide 6: Safety Net — PT-Post reduces to CS."""
615+
def slide_07_safety_net(self):
616+
"""Slide 7: Safety Net — PT-Post post-treatment ATT matches CS."""
620617
self.add_page()
621618
self._add_dark_bg()
622619

623620
self._centered_text(30, "Safety Net", size=38, color=WHITE)
624621

625-
# Body text
626-
self._centered_text(78, "Under PT-Post, reduces exactly to",
622+
# Body text — scoped to post-treatment ATT
623+
self._centered_text(78, "Under PT-Post, post-treatment ATT(g,t)",
627624
size=18, bold=False, color=GRAY)
628-
self._centered_text(100, "Callaway-Sant'Anna", size=22, bold=True,
629-
color=CYAN)
630-
631-
# Comparison table
632-
table_margin = 35
633-
table_w = WIDTH - table_margin * 2
634-
table_y = 135
635-
col_w = table_w / 3
636-
row_h = 28
637-
header_h = 30
638-
639-
# Table background
640-
total_h = header_h + 3 * row_h
641-
self.set_fill_color(*DARK_PANEL)
642-
self.rect(table_margin, table_y, table_w, total_h, "F")
643-
644-
# Header row
645-
headers = ["", "CS (PT-Post)", "EDiD (PT-Post)"]
646-
self.set_font("Helvetica", "B", 14)
647-
for j, header in enumerate(headers):
648-
x = table_margin + j * col_w
649-
self.set_xy(x, table_y + 5)
650-
self.set_text_color(*CYAN)
651-
self.cell(col_w, 18, header, align="C")
652-
653-
# Header rule
654-
self.set_draw_color(*CYAN)
655-
self.set_line_width(0.5)
656-
rule_y = table_y + header_h
657-
self.line(table_margin + 8, rule_y, table_margin + table_w - 8,
658-
rule_y)
659-
660-
# Data rows
661-
rows = [
662-
("ATT estimate", "1.234", "1.234"),
663-
("Standard error", "0.456", "0.456"),
664-
("95% CI", "[0.34, 2.13]", "[0.34, 2.13]"),
665-
]
666-
667-
for i, (label, cs_val, edid_val) in enumerate(rows):
668-
y = table_y + header_h + i * row_h + 5
625+
self._centered_text(100, "matches Callaway-Sant'Anna exactly",
626+
size=22, bold=True, color=CYAN)
669627

670-
# Label
671-
self.set_xy(table_margin, y)
672-
self.set_font("Helvetica", "", 15)
673-
self.set_text_color(*GRAY)
674-
self.cell(col_w, 16, " " + label, align="L")
675-
676-
# CS value
677-
self.set_xy(table_margin + col_w, y)
678-
self.set_text_color(*WHITE)
679-
self.cell(col_w, 16, cs_val, align="C")
680-
681-
# EDiD value
682-
self.set_xy(table_margin + 2 * col_w, y)
683-
self.set_text_color(*WHITE)
684-
self.cell(col_w, 16, edid_val, align="C")
685-
686-
# "Identical" badge below table (cyan outline, matching slide 1 style)
687-
badge_y = table_y + total_h + 15
688-
badge_w = 130
689-
badge_h = 28
628+
# Prominent equivalence badge
629+
badge_w = 200
630+
badge_h = 36
690631
badge_x = (WIDTH - badge_w) / 2
632+
badge_y = 150
691633
self.set_draw_color(*CYAN)
692634
self.set_line_width(1.5)
693635
self.rect(badge_x, badge_y, badge_w, badge_h, "D")
694-
self.set_xy(badge_x, badge_y + 5)
695-
self.set_font("Helvetica", "B", 16)
636+
self.set_xy(badge_x, badge_y + 8)
637+
self.set_font("Helvetica", "B", 18)
696638
self.set_text_color(*CYAN)
697-
self.cell(badge_w, 16, "= identical", align="C")
639+
self.cell(badge_w, 18, "ATT point estimates identical",
640+
align="C")
698641

699-
# Footnote
700-
self.set_xy(0, badge_y + badge_h + 18)
642+
# Corollary citation
643+
self.set_xy(0, badge_y + badge_h + 25)
701644
self.set_font("Helvetica", "I", 14)
702645
self.set_text_color(*GRAY)
703646
self.cell(WIDTH, 10,
@@ -706,8 +649,8 @@ def slide_06_safety_net(self):
706649

707650
self._add_footer()
708651

709-
def slide_07_cta(self):
710-
"""Slide 7: CTA — Get Started."""
652+
def slide_08_cta(self):
653+
"""Slide 8: CTA — Get Started."""
711654
self.add_page()
712655
self._add_dark_bg()
713656

@@ -760,10 +703,10 @@ def main():
760703
pdf.slide_02_problem()
761704
pdf.slide_03_insight()
762705
pdf.slide_04_assumption()
763-
pdf.slide_04_payoff()
764-
pdf.slide_05_code()
765-
pdf.slide_06_safety_net()
766-
pdf.slide_07_cta()
706+
pdf.slide_05_payoff()
707+
pdf.slide_06_code()
708+
pdf.slide_07_safety_net()
709+
pdf.slide_08_cta()
767710

768711
output_path = Path(__file__).parent / "diff-diff-v27-carousel.pdf"
769712
pdf.output(str(output_path))

0 commit comments

Comments
 (0)