rm(list =ls())library(pacman)p_load(tidyverse, data.table, readr, tidylog, readxl, skimr, Hmisc, lubridate, foreign, ggtext, gridExtra, modelsummary, sf, stringi, did, haven, fixest )# tidyverse for obious reasons# data.table# readr for reading files easily# tidylog for captions about data wrangling commands# readxl for reading excel files# skimr for skim_without_charts function# Hmisc for describe function # lubridate for date processing # foreign for dbf databases reading # ggtext for text format for Gini plot # modelsummary for pretty tables# sf for shapefiles processing# stringi for accent string processing # did for difference in differences functions (from Callaway and Sant'Anna)# haven for reading dta files (dataframe format from Stata)# fixest for feols function for fixed effects regressions
Problema 1
1. Preguntas de incisos.
a)
Un mérito importante de optar por este diseño es que el tamaño de muestra para detectar un efecto de tamaño razonable es menor pues el tratamiento es asignado directamente a las unidades. Un problema importante que surge de este tipo de asignación es que se corre un gran riesgo de que SUTVA no pueda cumplirse ya que el hecho de que maestros de una misma escuela tenga unos tratamiento y otros no puede generar cambios de comportamiento en los maestros y, por ende, el tratamiento tendría ingerencia no solo en las unidades asignadas a él si no en unidades que no fueron asignadas al tratamiento. Es decir, habría externalidades del tratamiento.
b)
Si clusterizamos el asignamiento del tratamiento a nivel escuela podríamos no preocuparnos tanto de que no se cumpla SUTVA. No obstante, para que podamos detectar un efecto de tamaño razonable será necesario que el número de clusters aumente y que el número de observaciones por cluster también lo haga, lo que implica una mayor complejidad en el diseño de la intervención.
c)
Generalmente en este tipo de intervenciones, suena más razonable optar por un diseño de asignación del tratamiento a clusters ya que es importante que, si queremos obtener estiamciones causales, no sea un problema suponer que se cumple SUTVA.
d)
El hecho de tener una muestra más grande de escuelas implica que se puede tener un mayor número de clusters y, por lo tanto, esto nos beneficiaría en terminos de poder estadístico aumentándolo, todo lo demás constante.
e)
El parámetro indicado para calibrar y cumplir con las condiciones del gobierno federal es el mínimo efecto detectable y este depende de parámetros como el número de observaciones, la varianza de la variable de respuesta, el nivel de signifacncia de la prueba, y el poder de la prueba que se desee y la fracción de la población que desea sea asignada al tratamiento.
f)
Una mayor varianza poblaciónal de la variable de respuesta implica un menor poder estadístico de la prueba en cuestión.
g)
2. Ejercicio práctico
El poder estadístico se maximiza cuando el tamaño de los grupos es uniforme.
Primero identificamos las bases de nivel estudiante, nivel escuela y de los puntjes de la prueba estandarizada que se realizó en 2014. Estas bases son las sigueintes:
School.dta (donde encontramos la información de la asignación del tratamiento)
Student_PSLE_2014.dta (donde están los puntajes de las escuelas estandarizadas)
Student_School_House_Teacher_Char.dta (donde se pueden encontrar algunos controles para la especificación deseada que se escoja).
Code
school <-read_dta("tarea2/p1/raw_data/QJE_Replication/Data/School.dta")puntajes_endline <-read_dta("tarea2/p1/raw_data/QJE_Replication/Data/Student_PSLE_2014.dta")puntajes_baseline <-read_dta("tarea2/p1/raw_data/QJE_Replication/Data/Student_PSLE_2013.dta")
\[
Z_{i s d t}= \delta_0+\delta_1 \text {Treatment 1}_s+\delta_2 \text {Treatment 2}_s+\delta_3 \text {Treatment 3}_s +\gamma_z Z_{i s d, t=0}+\gamma_d+X_i \delta_4+X_s \delta_5+\varepsilon_{i s d t}
\]
donde \(Z_{isd,t}\) es el puntaje estandarizado del examen baseline que se llevo a acabo antes de la intervención, \(\gamma_d\) es el efecto fijo del distrito de la escuela, \(X_i\) es el género de la unidad y \(X_s\) son los controles a nivel escuela que escogimos.
Ahora estimemos por inferencia aleatorizada. Escogeremos como test statistic a evaluar la diferencia de medias simple.
Para ello veamos si existen outliers en la distribución de puntajes del examen estandarizado endline. La densidad se ve bien y no hay colas muy pesadas por lo que no se aprecian outliers y podemos usar como test statistic la diferencia de medias simple.
Procesamos los datos como se nos indica en el taller para realizar el ejercicio. Esto nos permitirá tener puras observaciones tratadas en el año 2014 o no tratadas en lo absoluto.
Code
# tiramos años estrictamente mayores a 2015 y tiramos los tres estados que expandieron la ayuda en 2015df_p1did <- df %>%filter(year <=2015) %>%filter(is.na(yexp2) | yexp2 <2015)
1. Estimamos los coeficintes de la regresión two way fixed effects para esta submuestra
Expresemos la especificación de la regresión que nos dará estos coeficientes.
Donde \(Y_{it}\) es la variable de respuesta que utilizaremos de la unidad \(i\) en el tiempo \(t\) , en este caso dins, \(\alpha_i\) es el efecto fijo del estado, \(\lambda_t\) es el efecto fijo del año (ya tenemos los dos efectos fijos clásicos en nuestra especificación), \(\mathbb{I}_{\{s \neq 2013\}}\) es una indicadora que vale uno cuando el año es igual a \(t\) (note que la suma se salta el año 2013, esto es porque estamos tomando como año de referencia al año 2013, por lo que no se estima su coeficiente para evitar colinealidad), \(D_i\) es la indicadora que vale uno cuando la unidad \(i\) fue tratada en el año 2014, \(\beta_s\) es el coeficiente que queremos estimar para el año \(s\) y \(u_{it}\) es el componente no explicado de la unidad \(i\) en el tiempo \(t\).
Recordemos que los coeficientes estimados \(\hat{\beta}\) de TWFE son equivalentes a las estimaciones DiD entre unidades tratadas y no tratadas entre los períodos \(s\) y 2013.
Code
#Creemos la variable indicadora del tratamiento en 2014df_p1did <- df_p1did %>%mutate(D =ifelse(is.na(yexp2), 0, 1))
Estimemos nuestro modelo que especificamos arriba con la función feols de fixest. Clusterizamos a nivel estado los errores estandar.
Donde \(\alpha_{1}^{g,t}\) es el efecto fijo de la unidad que pertenece al grupo que fue tratado en el tiempo \(g\) observada en el tiempo \(t\), \(G_g\) es una indicadora de que vale 1 si la unidad fue tratada en tiempo \(g\) y \(\epsilon^{g,t}\) es el termino de error. el ATT(g,t) corresponde al coeficiente \(\beta^{g,t}\).
Estimación cuando unidades de control todavía no tratados.
did::ggdid(reg_stag1) +ggtitle('Event Study por Grupo | not yet treated') +labs(subtitle ="Estados expanden Medicaid en diferentes años") +theme(plot.title =element_text(color ="black", hjust=0.5),plot.subtitle=element_text(hjust=0.5)) +scale_x_discrete(name ="Periodos", limits=c("2009","2010", "2011", "2012", "2013","2014", "2015","2016", "2017", "2018", "2019"))
Estimación cuando unidades de control como nunca tratadas.
did::ggdid(reg_stag2) +ggtitle('Event Study por Grupo | never treated') +labs(subtitle ="Estados expanden Medicaid en diferentes años") +theme(plot.title =element_text(color ="black", hjust=0.5),plot.subtitle=element_text(hjust=0.5)) +scale_x_discrete(name ="Periodos", limits=c("2009","2010", "2011", "2012", "2013","2014", "2015","2016", "2017", "2018", "2019"))
2. Construyamos a mano los coeficientes ATT(2015, 2013), ATT(2013, 2013) y ATT(2016, 2014).
Si se revisa con los coeficientes de summary(notyettreated) son los mismos.
ATT(2015, 2013)
Code
#ATT(2015,2013)#Creamos un df auxiliar con las medias condicionales de la var. de respuesta de 2012 y 2013 # Para ello nos quedamos con observaciones de los años 2012 y 2013 y # creamos dummy de si la unidad fue tratada en 2015.ATT_15_13 <- df %>%filter(year %in%c(2012, 2013)) %>%mutate(treated =case_when( yexp2 ==2015~1,is.na(yexp2) | yexp2 !=2015~0 )) %>%group_by(treated, year) %>%summarise(dins =mean(dins)) %>%ungroup() round(with(ATT_15_13, {(dins[year ==2013& treated ==1] - dins[year ==2012& treated ==1]) - (dins[year ==2013& treated ==0] - dins[year ==2012& treated ==0])} ),4)
Donde \(D_{i,t}^e = \mathbb{I}_{\{ t- G_i = e \}}\) es una indicadora que vale 1 cuando la unidad \(i\) está desfasada \(e\) períodos del tratamiento inicial en el tiempo \(t\). Se suele enfocarse en los coeficientes \(\beta_e, \, e \geq0\) pues estos parámetros son típicamente interpretados como la medición del efecto de participar en el tratamiento después de \(e\) períodos de tiempo del tratamiento inicial.
es la versión estática del TWFE. Con ella se puede hacer la agregación simple que toma un promedio ponderado de los ATT(g,t), ponderando proporcionalmente por tamaño de grupo.
Estimemos la regresión con MCO. Para ello tenemos crear una dummy que indique si el período es después del tratamiento.
Code
# Creamos variable post tratamientodf <- df %>%mutate(post_treated =!is.na(yexp2) & year >= yexp2)# Corremos TWFE estático con errores estándar clusterizados a nivel estadoreg_static <-feols(dins ~ post_treated | stfips + year, data = df, cluster ="stfips")gm <-list(list("raw"="nobs", "clean"="N", "fmt"= f),list("raw"="FE: stfips", "clean"="FE: estado", "fmt"= f),list("raw"="FE: year", "clean"="FE: año", "fmt"= f),list("raw"="vcov.type", "clean"="Clustered error", "fmt"=f))#reportamos con modelsummary la regresión estimadamodelsummary(reg_static, stars=TRUE, gof_map = gm, coef_rename =c("post_treatedTRUE"="post treated beta"))
(1)
post treated beta
0.070***
(0.007)
N
552
FE: estado
X
FE: año
X
Clustered error
by: stfips
+ p < 0.1, * p < 0.05, ** p < 0.01, *** p < 0.001
Observemos cómo es el coeficiente de la agregación simple.
Code
aggte(reg_stag1, type ="simple")
Call:
aggte(MP = reg_stag1, type = "simple")
Reference: Callaway, Brantly and Pedro H.C. Sant'Anna. "Difference-in-Differences with Multiple Time Periods." Journal of Econometrics, Vol. 225, No. 2, pp. 200-230, 2021. <https://doi.org/10.1016/j.jeconom.2020.12.001>, <https://arxiv.org/abs/1803.09015>
ATT Std. Error [ 95% Conf. Int.]
0.068 0.0074 0.0534 0.0826 *
---
Signif. codes: `*' confidence band does not cover 0
Control Group: Not Yet Treated, Anticipation Periods: 0
Estimation Method: Doubly Robust
De hecho, son muy parecidos. Para explicar esto se pude usar la descomposición de Bacon que nos arroja los pesos con los cuales son los pesos que el TWFE pone en las comparaciones con unidades que nunca son tratadas y con las que todavía no son tratadas.