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:
Primer paso es crear un codigo que nos permita explorar esta relacion
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)
When things go wrong?
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)
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.