Carpenter & Dobkin (2009) data

library(haven)
library(tidyverse)
library(dplyr)
library(stargazer)
#Loading Data
AEJfigs <- read_dta("D:/Downloads/AEJfigs.dta")

# Creating required variable
over21 = as.factor(ifelse(AEJfigs$agecell >= 21, 1, 0))

AEJfigs <- AEJfigs %>%
    mutate(over21)
AEJfigs_2 <- AEJfigs[complete.cases(AEJfigs),]

Replicating Figure 3

plot(AEJfigs$agecell,AEJfigs$all,
     pch=18,
     xlim=c(19, 23),ylim = c(0,120),
     xlab="Age",ylab="Deaths per 100,000 person-years",
     main="Figure 3. Age Profile for Death Rates")

points(AEJfigs$agecell,AEJfigs$external,pch=17,cex = 0.8)
points(AEJfigs$agecell,AEJfigs$internal,pch=22,cex = 0.8)
points(AEJfigs$agecell,AEJfigs$all, pch= 16, col="grey") # plotting data points

L21 <- nrow(AEJfigs[AEJfigs$over21== 0,]) 
lines(AEJfigs$agecell[1:L21], AEJfigs$allfitted [1:L21], lty=3, col = "black") # Plotting fitted lines data points
lines(AEJfigs$agecell[(L21 + 1): nrow(AEJfigs)],
      AEJfigs$allfitted [(L21 + 1):nrow(AEJfigs)], lty=3, col = "black")

lines(AEJfigs$agecell[1:L21], AEJfigs$externalfitted[1:L21], lty=1)
lines(AEJfigs$agecell[(L21 + 1): nrow(AEJfigs)], AEJfigs$externalfitted[(L21 + 1): nrow(AEJfigs)], lty=1)

lines(AEJfigs$agecell[1:L21], AEJfigs$internalfitted [1:L21], lty=5)
lines(AEJfigs$agecell[(L21 + 1): nrow(AEJfigs)], AEJfigs$internalfitted [(L21 + 1): nrow(AEJfigs)], lty=5)
     
legend("right",
       lty=c(0,0,0,3,5,1),
       pch=c(16,22,17,NA,NA,NA),
       col = c("grey","black","black","black","black","black"),
       legend = c("All","Internal","External",
                  "All fitted", "Internal fitted", "External fitted"),
       ncol=2, cex = 0.4) # Editing legend

Simplest regression-discontinuity design

simple_RDD <- lm(all ~ agecell + over21, data=AEJfigs_2) # running regression

stargazer(simple_RDD, type = "text", title = "Simplest regression-discontinuity design")
## 
## Simplest regression-discontinuity design
## ===============================================
##                         Dependent variable:    
##                     ---------------------------
##                                 all            
## -----------------------------------------------
## agecell                       -0.975           
##                               (0.632)          
##                                                
## over211                      7.663***          
##                               (1.440)          
##                                                
## Constant                    112.310***         
##                              (12.668)          
##                                                
## -----------------------------------------------
## Observations                    48             
## R2                             0.595           
## Adjusted R2                    0.577           
## Residual Std. Error       2.493 (df = 45)      
## F Statistic           32.995*** (df = 2; 45)   
## ===============================================
## Note:               *p<0.1; **p<0.05; ***p<0.01

Plotting fitted results

fitted_RDD <- fitted(simple_RDD) # fitting the regression line

AEJfigs_2 <- AEJfigs_2 %>%
  mutate(fitted_RDD)                # Merging the var

#Plotting the graph

plot(AEJfigs_2$agecell,AEJfigs_2$all,
     pch=18,
     xlim=c(19, 23),ylim = c(85,110),
     xlab="Age",ylab="Deaths per 100,000 person-years",
     main="Figure: Simple RDD")
lines(AEJfigs_2$agecell[1:L21], fitted_RDD[1:L21], lty=1)
lines(AEJfigs_2$agecell[(L21 + 1): nrow(AEJfigs_2)],
      fitted_RDD[(L21 + 1): nrow(AEJfigs_2)], lty=1)
legend("topleft", 
       lty=c(0,1),
       pch=c(18,NA),
       legend = c("All"
                  ,"Fitted"),
       ncol=2, cex = 0.6)