简单介绍一下实证论文中双重差分法(DID)的平行趋势检验(Parallel Trend Test)在Stata中如何操作。
(本文首发于个人微信公众号DMETP,欢迎关注!)
一、平行趋势假定
平行趋势假定是实证论文中使用DID的前提,处理组与控制组的目标变量在政策发生前(事前)只有满足平行趋势假设才能使用DID。反之,如果处理组和控制组在事前就存在一定的差异,那么用DID做出来(可能还很好看)的结果就不再能代表政策的净效应,极有可能存在其他因素影响我们被解释变量的变动,此时可以使用三重差分法(DDD)。关于三重差分模型,讲的超级详细。
二、平行趋势检验
这里主要介绍两种情况下的平行趋势检验。
一是普通DID模型的平行趋势检验,包括怎么画时间趋势图,怎么画95%置信区间图(动态效应检验图)。这里以石大千等(2018)公布在《中国工业经济》官网上的为例,由于所公布资料无法生成处理组虚拟变量,这里将使用微信公众号『功夫计量经济学』处理之后的。
参考文献:
石大千, 丁海, 卫平, 刘建江. 智慧城市建设能否降低环境污染[J]. 中国工业经济, 2018(06): 117-135.
二是多期DID模型的平行趋势检验,包括怎么画95%置信区间图。这里之所以没有画平行趋势图,是因为在多期DID中,各个处理组受到政策冲击的时点不一致。因此,就算能够准确识别出处理组和控制组,由于处理组政策起始时点不一致,我们也很难在同一张图中将两组目标变量的时间趋势图画出来。
的思路是,单独提取从样本开始年份直到某一年年末才受到政策冲击的样本为处理组,并将从样本开始年份直到某一年年末都没受到政策冲击的样本作为控制组,画出两组间的时间趋势图,这样的方法在政策冲击时点较少时可以考虑,因此不具有一般性。
参考文献:
李青原, 章尹赛楠. 金融开放与资源配置效率——来自外资银行进入中国的证据[J]. 中国工业经济, 2021(05): 95-113.
三、动态效应检验
动态效应检验实质上就是引入有限个时间虚拟变量,并将其与处理组虚拟变量交乘,考察交乘项的显著性。动态效应检验和平行趋势检验是有区别的,平行趋势检验中,只要考察0时期前的交乘项是否显著,如果不显著,说明处理组和控制组在事前并没有显著差异,可以使用DID。
而动态效应检验不仅考察事前,也关注事后组别之间的差异,如果0时期后(包括0时期)的交乘项显著,说明政策实施存在一定的持续性效果。当然,平行趋势检验只要求事前不显著,事后显不显著不影响事前的结论。
由于多期DID中处理组受到政策影响的时点不一致,那么怎样生成时间虚拟变量就成为一个问题。在李青原和章尹赛楠(2021)中,分为5个时期,分别是样本起始年份至政策实施前两年、政策实施前一年、政策实施当年,政策实施后一年、政策实施后两年至样本结束年份;而在中,直接省略政策推行前三年以上的年份。可见,多期DID平行趋势检验中如何设计时间虚拟变量需要兼顾理论假设和最终结果,同时需要想象力~
参考文献:
沈坤荣, 金刚. 中国地方政府环境治理的政策效应——基于“河长制”演进的研究[J]. 中国社会科学, 2018(05): 92-115.
四、代码
*==============================================================================*
* 双重差分法(DID) | 平行趋势检验 *
*==============================================================================*
** Stata Version: 16 | 17
** 【数据来源】普通DID(原始数据):石大千等(2018), 参见在《中国工业经济》网站(http://ciejournal.ajcass.org/Magazine/show/?id=54281)
*- 普通DID(加工数据):『功夫计量经济学』微信公众号(https://mp.weixin.qq.com/s/06v6s90G1pp-yLju_yAy1Q)
*- 多期DID(原始数据):李青原和章尹赛楠(2021),参见在《中国工业经济》网站(http://ciejournal.ajcass.org/Magazine/show/?id=77331)
** 【参考文献】[1] 石大千, 丁海, 卫平, 刘建江. 智慧城市建设能否降低环境污染[J]. 中国工业经济, 2018(06): 117-135.
*- [2] 李青原, 章尹赛楠. 金融开放与资源配置效率——来自外资银行进入中国的证据[J]. 中国工业经济, 2021(05): 95-113.
*- [3] 沈坤荣, 金刚. 中国地方政府环境治理的政策效应——基于“河长制”演进的研究[J]. 中国社会科学, 2018(05): 92-115+206.
cd "C:UsersKEMOSABEDesktopparallel_trend_test"
graph set window fontface "Times New Roman"
graph set window fontfacesans "宋体"
**# 一、普通DID的平行趋势检验
use smart_city2018.dta, clear
global xlist "lnrgdp lninno lnurb lnopen lnss"
**# 1.1 时间趋势图
bysort du year: egen mean_lnrso = mean(lnrso)
twoway(line mean_lnrso year if du == 1, ///
lpattern(solid) ///
lcolor(black) ///
lwidth(thin) ///
scheme(qleanmono) ///
ytitle("{stSans:人}""{stSans:均}""{stSans:废}" ///
"{stSans:气}""{stSans:排}""{stSans:放}" ///
"{stSans:量}" , size(medlarge) orientation(h)) ///
xtitle("{stSans:年份}", size(medlarge)) ///
xline(2012, lpattern(solid) lcolor(black) lwidth(thin)) ///
saving(parallel_trend_test_1-1, replace)) ///
(line mean_lnrso year if du == 0, ///
lpattern(shortdash) ///
lcolor(black) ///
lwidth(thin)) , ///
xlabel(2005(2)2015 , labsize(medlarge)) ///
ylabel(-2.5(0.25)-1.5, labsize(medlarge) format(%3.2f)) ///
legend(label(1 "{stSans:处理组}") ///
label(2 "{stSans:控制组}") ///
size(medlarge) position(1) symxsize(10))
graph export "parallel_trend_test_1-1.emf", replace
discard // 结果已保存至路径文件夹
**# 1.2 动态效应检验(事件研究法)
gen current = 2012.year * du
forvalue i = 4(-1)1 {
gen before`i" = (year == 2012 - `i") * du
}
forvalue k = 1/3 {
gen after`k" = (year == 2012 + `k") * du
}
drop before4 // 将2008年作为基准年
qui reghdfe lnrso before* current after* $xlist , absorb(id year) cluster(id)
coefplot, ///
keep(before* current after*) ///
vertical ///
scheme(qleanmono) ///
coeflabels(before3 = -3 ///
before2 = -2 ///
before1 = -1 ///
current = 0 ///
after1 = 1 ///
after2 = 2 ///
after3 = 3) ///
msymbol(O) msize(small) mcolor(black) ///
addplot(line @b @at, lcolor(black) lwidth(thin) lpattern(solid)) ///
ciopts(recast(rcap) lcolor(black) lwidth(thin)) ///
yline(0, lpattern(dash) lcolor(black) lwidth(thin)) ///
ytitle("{stSans:系}""{stSans:数}", size(medlarge) orientation(h)) ///
xtitle("{stSans:期数}" , size(medlarge)) ///
xlabel(, labsize(medlarge)) ///
ylabel(, labsize(medlarge) format(%02.1f)) ///
saving(parallel_trend_test_1-2, replace)
graph export "parallel_trend_test_1-2.emf", replace
discard
clear all
cls
**# 二、多期DID的平行趋势检验
use 平行趋势检验.dta, clear
global y "TFPQD_OP TFPQD_LP"
global adjyear "yb2 yb1 y0 ya1 ya2"
global ctrlvars "ADM PPE ADV RD HHI INDSIZE NFIRMS FCFIRM MARGIN LEVDISP SIZEDISP ENTRYR EXITR"
global options "absorb((city)*(year) (ind3)*(year)) cluster(city year) keepsing"
gen year_enter = 2007
replace year_enter = 2004 if city == 5101 | city == 5000 | city == 2102 | ///
city == 3501 | city == 4401 | city == 3701 | ///
city == 3201 | city == 3702 | city == 3101 | ///
city == 4403 | city == 1200 | city == 4201 | ///
city == 4404 | prov == 44 | prov == 45 | ///
prov == 43 | prov == 32 | prov == 33
replace year_enter = 2005 if city == 1100 | city == 5301 | city == 2101 | ///
city == 3502 | city == 6101
replace year_enter = 2006 if city == 2201 | city == 2301 | city == 6201 | ///
city == 6401
gen yb2 = (year_enter == year + 2)
gen yb1 = (year_enter == year + 1)
gen y0 = (year_enter == year)
gen ya1 = (year_enter == year - 1)
gen ya2 = (year_enter <= year - 2)
**# 2.1 动态效应检验(TFPQD_OP)
qui reghdfe TFPQD_OP $adjyear $ctrlvars , $options
coefplot, ///
keep( $adjyear ) ///
vertical ///
scheme(qleanmono) ///
coeflabels(yb2 = -2 ///
yb1 = -1 ///
y0 = 0 ///
ya1 = 1 ///
ya2 = 2) ///
msymbol(O) msize(small) mcolor(black) ///
addplot(line @b @at, lcolor(black) lwidth(thin) lpattern(solid)) ///
ciopts(recast(rcap) lcolor(black) lwidth(thin)) ///
yline(0, lpattern(dash) lcolor(black) lwidth(thin)) ///
ytitle("{stSans:系}""{stSans:数}", size(medlarge) orientation(h)) ///
xtitle("{stSans:期数}" , size(medlarge)) ///
xlabel(, labsize(medlarge)) ///
ylabel(, labsize(medlarge) format(%03.2f)) ///
saving(parallel_trend_test_2-1, replace)
graph export "parallel_trend_test_2-1.emf", replace
discard
**# 2.2 动态效应检验(TFPQD_LP)
qui reghdfe TFPQD_LP $adjyear $ctrlvars , $options
coefplot, ///
keep( $adjyear ) ///
vertical ///
scheme(qleanmono) ///
coeflabels(yb2 = -2 ///
yb1 = -1 ///
y0 = 0 ///
ya1 = 1 ///
ya2 = 2) ///
msymbol(O) msize(small) mcolor(black) ///
addplot(line @b @at, lcolor(black) lwidth(thin) lpattern(solid)) ///
ciopts(recast(rcap) lcolor(black) lwidth(thin)) ///
yline(0, lpattern(dash) lcolor(black) lwidth(thin)) ///
ytitle("{stSans:系}""{stSans:数}", size(medlarge) orientation(h)) ///
xtitle("{stSans:期数}" , size(medlarge)) ///
xlabel(, labsize(medlarge)) ///
ylabel(, labsize(medlarge) format(%03.2f)) ///
saving(parallel_trend_test_2-2, replace)
graph export "parallel_trend_test_2-2.emf", replace
discard
五、运行结果
1. 普通DID的平行趋势检验
用石大千等(2018)的数据绘制出如下图 1和图 2。其中,图 1是时间趋势图,可以看到,在政策实施年份(2012)年之前,处理组和控制组的人均废气排放量变动趋势大体一致,但在2005-2006这两年间两组目标变量的变动方向相反。在2012年以后,控制组人均废气排放量有过上扬的历史,随后在2013年开始逐年下降,但下降幅度不大;处理组的人均废气排放量在2012年以后年份均处于下降通道,且在2014年下降幅度较大。因此,可以初步判断两组间在政策实施年份前的时间趋势假定基本是满足的,政策实施年份以后趋势线的差异基本判断是由智慧城市试点造成的。当然,这个结论并不稳健,需要进一步检验两组间的动态效应。
图 2是动态效应检验图。其中,垂直于横轴的带盖短直线是各期数与处理组虚拟变量的交乘项回归系数的95%置信区间。可以看到,在期数为0(该例为2012年)以前,除政策实施年份三年前的系数显著(95%置信区间没有越过系数 = 0的水平虚线),其余期数都是不显著的,这也与时间趋势图所揭示的信息基本保持一致。而在政策实施以后的所有年份,系数基本显著(期数为2时有微微不显著),说明该政策的影响具有一定的持续性(或称时滞性),并且在样本期间内于实施后的第三年该政策具有最大的效果。
当然,基准年的选择对显著性的影响很大,这里将2008年作为基准年,也可以通过选择不同的基准年对结果进行适当调整。
2. 多期DID的平行趋势检验
图 3和图 4分别是使用李青原和章尹赛楠(2021)公布的数据画出来的基于OP法和LP法计算的TFP离散度的动态效应检验图。在李青原和章尹赛楠(2021)公布的附件中,作者在平行趋势检验部分提供了回归结果表,但没有将其绘制成图。如图 3所示,在政策实施之前,系数都是不显著的,政策实施以后,系数同样都不显著。这说明了基于OP法计算的TFP离散度满足平行趋势假定,但政策实施不具有持续性。虽然政策不具有持续性,但系数为负是符合基本理论假设的,并且在政策实施一年后开始,系数与t值较之前明显增大。
图 4就比较完美了,实施年份之前都不显著,实施年份之后都显著,且系数符合理论假设,这说明基于OP法计算的TFP离散度既满足平行趋势假定,而且政策实施的影响具有一定的持续性。