【应用计量系列147】Sant' Anna的DID规定动作(3):画出每个处理类别的平均结果时序图

文摘   2024-06-28 10:34   广东  

CIMERS暑期班,因果推断最新进展+量化宏观,全新回归!


👉面板数据模型(DID等)最新进展及其stata应用,点击查看

👉DSGE第一课与Dynare编程,点击查看


成为CIMERS内部学员,你可以获得

⭐ 高质量课程,详细课件,可复用代码及数据

⭐ 许老师详尽答疑服务,知无不言,学无止境

⭐ 高质量的交流社群(主要为硕博以及高校教师)

⭐ 许老师增值讲座,文献解读,模型讲解

⭐ 未来课程内部学员折扣

⭐⭐诚邀您加入CIMERS,许老师正在寻找好的合作者,一起作出高质量研究⭐⭐

报名任意课程即可成为CIMERS内部学员



恳请各位老师同学动动发顶刊的小手,点个赞和在看,让更多人看到我们的研究,您的支持是CIMERS最大的动力!





从今天开始,我们搬运Scott Cunningham的“Pedro’s diff in diff checklist”【有兴趣的人可以点击这里关注他的blog】。

大家也许还记得,Sant' Anna有一个十步DID

第一步:画出处理模式图

第二步:呈现每个处理类别的处理个体数量

第三步:画出每个处理类别的平均结果时序图

我自己讲解DID的平行趋势常用检验方法时,第一大方法也是平均结果的时序图——处理个体和控制个体在每期的平均结果,然后做时序图。

也就是说,大家可能希望看到原始数据中每个个体的平均结果时序图,最好能区分处理个体和控制个体。

在截面维度,我们可能都要仔细考察个体变动(variation)。这个时候,我们可以看看每个个体在每期的差异。我们可以使用Yiqing Xu的panelview命令。

* step 3: plotting the outcomes by timing group (cohort)

* Plotting outcomes by treatment cohort include always treated
panelview lmur treat, prepost i(state) t(year) type(outcome) title("Log Murder by Panel Unit") legend(label(1 "Never treated") label(2 "Treated (Pre)") label(3 "Treated (Post)") pos(6)) // type(outcome) & number of treatment level = 1: same as ignoretreat
image.png

上面的图尝试向我们展示每个地区结果的演化,用浅灰色表示控制组,用浅红色表示处理组处理前,红色表示处理组处理后。这本来很有信息,但是地区太多(50个),结果变量演化路径太接近,因此,让人很混乱。我们不知道从哪看起。

更重要的是,上图错误地呈现了DID估计平均处理效应所使用的变动(variation)。在面板数据下,DID并不直接使用截面个体结果的变动来计算处理效应。相反,它使用每个cohort(不同处理时点类别)的平均结果,然后将它们组成2×2 DID,再使用它们的变动:

无论我们使用TWFE,还是其它的方法来估计DID模型,其核心方程都是2×2的。其中,TWFE是所有2×2 DID的加权平均,而异质性处理效应稳健方法则使用其它的加权方式,或者“干净的”2×2 DID。

因此,我们应该画出这些处理类别的平均结果时序图,而不是个体结果的时序图

* Just use collapse for now
preserve
collapse (mean) lmur, by(treat_date year) ///按处理类别treat_date和year计算出结果的平均值

xtset treat_date year
xtline lmur, overlay plot1opts(lcolor(black) lpattern(solid)) plot2opts(lcolor(green) lpattern(dash)) plot3opts(lcolor(cyan) lpattern(dot)) plot4opts(lcolor(blue) lpattern(tight_dot)) plot5opts(lcolor(magenta) lpattern(longdash)) plot6opts(lcolor(cranberry) lpattern(vshortdash)) plot7opts(lcolor(pink) lpattern(shortdash)) plot8opts(lcolor(sandb) lpattern(shortdash_dot_dot)) title("Plotting average log murders by year") subtitle("Each line is a treatment cohort timing group") legend(pos(6) col(3))
image.png

正如第二步:呈现每个处理类别的处理个体数量里,有16个类别的处理cohorts,因此,我们要画出16条平均结果演化路径(图形命令与Cunningham稍有不同,因为我使用stata 18,默认图形选项不好看,我调整了一下,下面的图均是如此)。

但是,上图仍然很杂乱,线条太多了,我的脑袋都要秀逗了。

其实实践中,大部分学者都是每个处理类别cohort分别作为一个图,且最好是处理组平均结果和控制组平均结果放在一起:

// Just to remind you we are using the mean outcome per timing group
collapse (mean) lmur, by(treat_date year)
xtset treat_date year


// Create individual plots with reference lines
foreach t in 2020 1970 1980 1985 1987 1988 1989 1990 1991 1994 1995 1996 2001 2003 2004 2006 {
local label = cond(`t' == 2020, "never treated", "`t' cohort")
local rline = cond(`t' == 0, 0, `t')

twoway (line lmur year if treat_date == `t', lcolor(blue) lwidth(medium)) (line lmur year if treat_date == 2020, lcolor(black) lwidth(medium)) ///
, ///
subtitle("`label'") ///
name(plot_`t', replace) ///
xline(`rline', lcolor(red) lpattern(dash)) ///
legend(label(1 "`t' cohort") label(2 "never treated") pos(6) col(2))
}

// Combine the individual plots into a single graph
graph combine plot_2020 plot_1970 plot_1980 plot_1985 plot_1987 plot_1988 plot_1989 plot_1990 plot_1991 plot_1994 plot_1995 plot_1996 plot_2001 plot_2003 plot_2004 plot_2006, ///
title("Combined Plots of Average Log Murders by Treatment Cohort")

image.png

这样可以看出每个cohort中处理组和控制组处理前是否近似平行演化,处理后处理组是否与控制组差异变大。




宏观研学会
关注宏观经济与宏观经济学研究前沿问题,推广、普及DSGE及其他宏观经济研究方法。
 最新文章