@@ -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