Sebastian Tello
  • Home
  • CV
  • Contact
  • Research
  • Resources
  • RMDA
  • APP
3️⃣

Worksheet #3 Bacon

Este ejercicio sigue los pasos propuestos por Asjad Naqvi es su pagina web. El es el creador del comando y de este ejemplo. Sigue si ejemplo en esta pagina web:

Difference-in-Difference (DiD)

Welcome to the DiD revolution.

asjadnaqvi.github.io

Primer paso es crear un codigo que nos permita explorar esta relacion

image
image
image

When things go wrong?

La tabla nos da la estimación de cada combinación 2x2 y su peso relativo en la beta global. Dado que no tenemos un grupo que nunca haya sido tratado, obtenemos una serie de comparaciones "temprana versus tardía" o "tardía versus temprana" para todas las combinaciones. En el resultado anterior, podemos observar que los grupos de tratamiento Tardío versus Temprano están bajando el promedio a la zona negativa. Por ejemplo, el cuarto valor de -121,5 tiene un peso del 16% que está diluyendo claramente la estimación global de beta.

image
image
InstagramBluesky
clear
local units = 3
local start = 1
local end	= 10

local time = `end' - `start' + 1
local obsv = `units' * `time'
set obs `obsv'

egen id	   = seq(), b(`time')  
egen t 	   = seq(), f(`start') t(`end') 	

sort  id t
xtset id t

lab var id "Panel variable"
lab var t  "Time  variable"

gen D = 0
replace D = 1 if id==2 & t>=5
replace D = 1 if id==3 & t>=8
lab var D "Treated"

gen Y = 0
replace Y = D * 2 if id==2 & t>=5
replace Y = D * 4 if id==3 & t>=8

lab var Y "Outcome variable"

* ##### Plotear Los resultados
set scheme plotplainblind 
twoway ///
	(connected Y t if id==1) ///
	(connected Y t if id==2) ///
	(connected Y t if id==3) ///
		,	///
		xline(4.5 7.5) ///
		xlabel(1(1)10) ///
		legend(order(1 "id=1" 2 "id=2" 3 "id=3"))		

* ### Correr Regresions 
estimates clear
eststo: xtreg Y D i.t, fe 
eststo: reghdfe Y D i.t, absorb(id)  
esttab, se

ssc install bacondecomp

* ### Decomposition
bacondecomp Y D, ddetail


* ### Ahora plotea un event-study. 
sort id t
bys id: egen g=min(t) if D==1
replace g=0 if D==0 
bys id: egen timing=max(g)
replace timing=11 if id==1

gen distance=t-timing 
gen distance_10=distance+10 

reg Y i.t i.id i.distance_10
coefplot, keep(*.distance_10) vertical recast(connected) xlabel(,angle(45)) xline(10) yline(0)
set seed 13082021
clear
local units = 30
local start = 1
local end   = 60

local time = `end' - `start' + 1
local obsv = `units' * `time'
set obs `obsv'

egen id	   = seq(), b(`time')  
egen t 	   = seq(), f(`start') t(`end') 	

sort  id t
xtset id t

lab var id "Panel variable"
lab var t  "Time  variable"

cap drop Y
cap drop D
cap drop cohort
cap drop effect
cap drop timing

gen Y 	   = 0		// outcome variable	
gen D 	   = 0		// intervention variable
gen cohort = .  	// total treatment variables
gen effect = .		// treatment effect size
gen timing = .		// when the treatment happens for each cohort

* Vamos a general un efecto que sea aleatorio entre 2 y 10
levelsof id, local(lvls)
foreach x of local lvls {
	local chrt = runiformint(0,5)	
	replace cohort = `chrt' if id==`x'
}

levelsof cohort , local(lvls)  //  let all cohorts be treated for now
foreach x of local lvls {
	
	// (a) effect
	
	local eff = runiformint(2,10)
		replace effect = `eff' if cohort==`x'
		
	// (b) timing	
	
	local timing = runiformint(`start' + 5,`end' - 5)	
	replace timing = `timing' if cohort==`x'
		replace D = 1 if cohort==`x' & t>= `timing' 
}

replace Y = id + t + cond(D==1, effect * (t - timing), 0)

/* El tiempo para cada cohorte también se genera aleatoriamente en el intervalo t=5 y t=55. Esto es solo para asegurarse de que las cohortes de tratamiento no sean muy dominantes, solo existen durante un par de períodos. */

levelsof cohort
local items = `r(r)'

local lines
levelsof id

forval x = 1/`r(r)' {
	
	qui summ cohort if id==`x'
	local color = `r(mean)' + 1
	* colorpalette tableau, nograph
		
	local lines `lines' (line Y t if id==`x', lc("`r(p`color')'") lw(vthin))	||
}

twoway ///
	`lines'	///
		,	legend(off)


* Corriendo la regresion

		estimates clear 
		eststo: xtreg Y i.t D, fe
		eststo: reghdfe Y D i.t, absorb(id)  
		esttab , keep(D) se
		* Pero sabemos que el tratamiento esta entre 2 y 10! Que paso?

		bacondecomp Y D, ddetail

* #### Event study

		gen distance= t-timinig
		gen distance_54=distance+54
		reg Y i.id i.t i.distance_54
		coefplot, keep(*.distance_54) vertical recast(connected) xlabel(,angle(45)) xline(54) yline(0)