查看原文
其他

双重差分法(DID)平行趋势检验的Stata操作

江河JH 功夫计量经济学 2023-10-24
双重差分法(DID)有一个重要的前提假设——平行趋势假定,即处理组如果没有受到政策干预,其时间趋势应与控制组一样。很多人不重视平行趋势检验,认为随便跑几个DID回归就完事了,事实上,平行趋势检验是DID的规定动作,规范地对平行趋势假定进行检验是一篇DID论文中至关重要的部分。如果不满足平行趋势假定,那么两次差分得出的政策效应就不完全是真实的政策效应,其中有一部分是由处理组和控制组本身的差异所带来的。

数据来源

石大千老师等(2018)发表在《中国工业经济》的论文《智慧城市建设能否降低环境污染》使用DID方法评估了智慧城市建设对城市环境污染的影响,《中国工业经济》期刊官网公布了这篇论文使用的数据和代码。接下来,我就使用这篇论文的数据,给大家分享一下双重差分法(DID)平行趋势检验的Stata操作。

原文信息

石大千,丁海,卫平,刘建江.智慧城市建设能否降低环境污染[J].中国工业经济,2018(06):117-135.

时间趋势图

平行趋势检验的第一种方法是绘制时间趋势图。通过绘制处理组和控制组的被解释变量随时间变化的平均值,我们可以粗糙地判断处理组和控制组的时间趋势是否存在差异。
egen mean_y=mean(lnrso), by(year du)
graph twoway (connect mean_y year if du==1,sort msize(small)) (connect mean_y year if du==0,sort lpattern(dash) msize(small)), ///
xline(2012,lpattern(dash) lcolor(gray)) ///
ytitle("lnrso") xtitle("Year") ///
ylabel(,angle(0) labsize(*0.75)) xlabel(,labsize(*0.75)) ///
legend(label(1 "处理组") label( 2 "控制组")) ///图例
xlabel(2005(1)2015)  graphregion(color(white)) //白底
在Stata 17中,我们可以使用xtdidregress + estat trendplots命令轻松绘制出处理组和控制组的时间趋势图,这方便了许多。可以发现,使用xtdidregress + estat trendplots命令绘制的时间趋势图和我们自己绘制的时间趋势图是一致的。
当然,绘制时间趋势图这种方法仅凭肉眼观察较为粗糙,想要得到更为准确、科学的结论还是需要进行平行趋势的统计检验,也就是接下来要介绍的一种方法。

事件研究法

平行趋势检验的第二种方法借鉴的是事件研究法的思想,我们首先需要生成年份虚拟变量与处理组虚拟变量的交互项,将这些交互项作为解释变量进行回归(特别注意要丢掉一期,作为基准组)。关于基准组的选择,我个人比较推荐的是选择第1期或者-1期(政策时点前1期),注意不要选政策当期,因为政策当期已经受到政策影响了。
这样的话,交互项的系数反映的就是特定年份处理组和控制组之间的差异(与基准组相比),我们特别希望看到的就是政策时点前的年份虚拟变量与处理组虚拟变量的交互项的系数不显著,这样才说明在政策时点前处理组和控制组不存在异质性的时间趋势。
forvalues i=5(-1)1{
  gen pre`i'=(event==-`i'& du==1)
}

gen current=(event==0 & du==1)

forvalues i=1(1)3{
  gen post`i'=(event==`i'& du==1)
}

drop pre5 //丢掉一期作为基准组
reghdfe lnrso pre* current post* $xlist ,absorb(id year) vce(cluster id) 
进一步地,我们通过直观的图形,呈现政策时点前后各期的系数的变化(智慧城市建设对城市环境污染的的动态影响)。在这里,我使用的是绘图命令coefplot,它可以便捷地根据回归结果帮助我们绘制回归系数的取值和置信区间,常用于DID平行趋势检验制图。
coefplot, baselevels ///
keep(pre* current post*) ///
vertical ///转置图形
coeflabels(pre4=-4 pre3=-3 pre2=-2 pre1=-1 ///
current=0 post1=1 post2=2 post3=3 post4=4) /// 
yline(0,lwidth(vthin) lpattern(solid) lcolor(teal)) ///
xline(5,lwidth(vthin) lpattern(solid) lcolor(teal)) ///
ylabel(,labsize(*0.85) angle(0)) xlabel(,labsize(*0.85)) ///
ytitle("Coefficients") ///
msymbol(O) msize(small) mcolor(gs1) ///plot样式
addplot(line @b @at,lcolor(gs1) lwidth(medthick)) ///增加点之间的连线
ciopts(recast(rline) lwidth(thin) lpattern(dash) lcolor(gs2)) ///置信区间样式
graphregion(color(white)) //白底
其中,keep用于保留指定的系数;coeflabels用于为系数指定自定义标签,在这里用来修改横坐标;msymbolmsizemcolor用于设置点的样式、大小和颜色;addplot(line @b @at)用于增加点之间的连线;ciopts用于设置置信区间样式。
从图中可以看出,政策时点前第3期(-3)期的系数显著异于0(95%的置信区间没有包含0值),政策时点前其他各期的系数并不显著异于0,这一结果肯定是不能让人信服的,我们可能需要进行适当调整,使得政策时点前各期的系数均不显著异于0。需要本文使用的数据和代码的朋友,请在公众号后台对话框内回复关键词CT2


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存