目录
1 DID平行趋势检验
1.1 平行趋势检验介绍
1.2 平行趋势检验目的
2 Stata实操
2.1 模拟面板数据
2.2 平行趋势检验Stata演示
3 平行趋势检验Stata代码
Note: 第三部分是对第二部分Stata实操代码的汇总,可以复制粘贴,方便一键提取!!!图中的蓝框为标注,红框为代码!!!
1 DID平行趋势检验
1.1 平行趋势检验介绍
平行趋势检验是一种为了评估两变量数据之间是否会存在某种同幅度增减情况的相关关系检验方法。在大多文献中,通常通过使用平行趋势检验的时间趋势图或置信区间图来进行直观的分析,根据折线趋势或置信区间进行判断。平行趋势检验是对经济模型进行稳健性检验的最常用方法之一。
1.2 平行趋势检验目的
平行趋势检验是构建DID模型最为重要的一步,是DID模型的前提条件。在使用DID模型进行实证分析之前,首先必须进行平行趋势检验,如果变量通过了平行趋势检验,那么就初步可以构建DID模型进行实证分析,反之则不行。DID模型在顺利通过平行趋势检验后,还需要继续进行基准回归分析、安慰剂检验和稳健性检验,完成这一流程之后,DID模型的“政策效应”才更加的准确、切合实际。因此,要想使用DID模型就首先需要掌握平行趋势检验的实操方法。
2 Stata实操
2.1 模拟面板数据
2.1.1 面板数据格式
本次Stata实操的面板数据格式为:“一对多”,即一个研究个体对应了多个年份数据。例如在上图中,国家A对应了1990—1999年的数据。其中,id为研究个体数值编号;country为研究个体国家;y为被解释变量;x1、x2、x3皆为控制变量。
2.1.2 模拟数据样本
模拟数据共有70个样本,涉及研究个体7个,每个个体对应10年的研究数据。
2.2 平行趋势检验Stata演示
2.2.1 创建面板数据
代码:
在对面板数据进行基准回归前,需要先使用代码xtset创建面板数据,否则回归会报错。“strongly balanced”说明面板数据是平衡数据。
2.2.2 设置虚拟变量
代码:
运行结果:
生成虚拟变量。其中,period为时间虚拟变量,政策执行之前为0,执行之后为1;treat为国家虚拟变量,执行政策的国家为1,未执行政策的国家为0;did为核心解释变量,即两虚拟变量的交互项,其系数为“政策效应”。
2.2.3 平行趋势检验
(1)方法一_外部命令
代码:
首先运用ssc install下载外部命令tvdiff。
其中, y是被解释变量; period是处理效应虚拟变量,处理当期取值为1,否则取值为0。逗号“,”前还可以加入其他解释变量,包括固定效应虚拟变量、时间效应虚拟变量或控制变量; model(fe)指的是估计模型,模型类型必须是fe或ols,必填;pre(*) 是指处理之前的时期的数目(*),必填;post(*) 是指处理之后的时期的数目(*),必填;test_tt实现平行趋势检验,默认使用 leads。
运行结果:
图中RESUIL显示“通过平行趋势检验”。此方法可以很方便、快捷的在构建完DID模型后进行初步检验,看模型是否通过,未通过则可以及时对模型进行调整,不会因平行趋势检验而浪费太多时间,但此方法不适合在文献中呈现。因此,在利用方法一通过检验后,可以再选择下文的方法二或方法三再次进行平行趋势检验,有利于在文献中呈现和分析。
(2)方法二_时间趋势图
代码:
读者根据自身情况,修改y被解释变量、year年份、treat个体虚拟变量、1994政策执行时间、“str”注释、1990和1999年份第一年和最后一年,其他都不用修改。有疑问评论区留言或私信即可。
运行结果:
由于使用的数据是模拟数据,得到的时间趋势图并不是很理想。
文献参考:
这是某文献中的一幅时间趋势图,可以很直观的看出,在2008年政策执行之前,实验组和对照组TFP几乎呈现一模一样的变化趋势,而2008年之后TFP变化截然相反,这就很明显的通过了平行趋势检验。
(3)方法三_置信区间图
代码:
没有安装过的读者,首先可以运用ssc install下载外部命令coefplot。
运行结果:
个人觉得这图画出来很美观的:)current为政策执行年;pre_*为政策执行年之前;post_*为政策执行年之后;短实线之间为置信区间。通常通过平行趋势检验的判断标准:政策执行年之前的置信区间要包含0轴,政策执行年之后的置信区间做好都不包含0轴。此图平行趋势检验效果一般,通过平行趋势检验的判断标准其实有些玄妙,读者可以多参考参考国内外较好期刊上的文献进行分析。
3 平行趋势检验Stata代码
-------------------------------------------------------------------------------------
xtset id year //面板数据
*一、设置虚拟变量
gen period = (year>=1994) & !missing(year) //政策执行时间为1994年
gen treat = (id>4) & !missing(id) //生成地区虚拟变量
gen did = period*treat //产生交互项
*二、平行趋势检验
*方法一_外部命令
ssc install tvdiff //安装外部命令
tvdiff y did period , model(fe) pre(4) post(5) vce(robust) test_tt graph
*方法二_时间趋势图
egen mean_y=mean(y), by(year treat)
graph twoway (connect mean_y year if treat==1,sort) (connect mean_y year if treat==0,sort lpattern(dash)), ///dash虚线
xline(1994,lpattern(dash) lcolor(gray)) ///
ytitle("y") xtitle("年度") ///
ylabel(,labsize(*0.75)) xlabel(,labsize(*0.75)) ///
legend(label(1 "处理组") label( 2 "控制组")) ///图例
xlabel(1990 (1) 1999) graphregion(color(white)) //白底
*方法三_置信区间图
ssc install coefplot //安装手动画图
gen policy = year - 1994
tab policy
replace policy = -3 if policy < -3
replace policy = 3 if policy > 3
//首先生成年份虚拟变量与实验组虚拟变量的交互项
forvalues i = 3(-1)1{
gen pre_`i' = (policy == -`i' & treat == 1)
}
gen current = (policy == 0 & treat == 1)
forvalues j = 1(1)3{
gen post_`j' = (policy == `j' & treat == 1)
}
drop pre_1 //将政策前第一期作为基准组,很重要!!!
xtreg y pre_* current post_* i.year, fe r //将这些交互项作为解释变量进行回归
coefplot, baselevels ///
keep(pre_* current post_*) ///
vertical ///转置图形
yline(0,lcolor(edkblue*0.8)) ///加入y=0这条虚线
xline(3, lwidth(vthin) lpattern(dash) lcolor(teal)) ///
ylabel(,labsize(*0.75)) xlabel(,labsize(*0.75)) ///横纵坐标轴大小
ytitle("政策动态效应", size(small)) ///加入Y轴名称,大小small
xtitle("政策时点", size(small)) ///加入X轴名称,大小small
addplot(line @b @at) ///增加点之间的连线
ciopts(lpattern(dash) recast(rcap) msize(medium)) ///CI为虚线上下封口
msymbol(circle_hollow) ///plot空心格式
scheme(s1mono)
-------------------------------------------------------------------------------------
Note: 强烈推荐将上述代码整体复制粘贴到do.文件中查看,效果更加!!!年份、变量根据自身情况替换!!!设置虚拟变量、平行趋势检验等的命令包含但不限于本文中的,本文仅供参考!!!本文如有错误和不足,请多多包涵、批评指正,纯是个人理解及错误!!!欢迎互相学习!!!
点赞·关注·收藏·转发
请勿抄袭,违者必究!