双重差分的理论与实践
1. 理论
1.1 标准表述(定义)
双重差分模型(difference-in-differences)主要被用于社会学中的政策效果评估。其原理是基于一个反事实的框架来评估政策发生和不发生这两种情况下被观测因素y的变化。如果一个外生的政策冲击将样本分为两组—受政策干预的Treat组和未受政策干预的Control组,且在政策冲击前,Treat组和Control组的y没有显著差异,那么我们就可以将Control组在政策发生前后y的变化看作Treat组未受政策冲击时的状况(反事实的结果)。通过比较Treat组y的变化(D1)以及Control组y的变化(D2),我们就可以得到政策冲击的实际效果(DD=D1-D2)。
具体地,单一冲击时点的双重差分的模型如下:
其中,Ti为政策虚拟变量;Ai为时间虚拟变量; Ti ×At为两者的交互项;b3即为我们需要的双重差分估计量。
政策冲击的实际效果: DD = D1 - D2 = ( β2 + β3 ) - β2 = β3
需要特别指出的是,只有在满足“政策冲击前Treat组和Control组的y
没有显著差异”(即平行性假定)的条件下,得到的双重差分估计量才是无偏的。
详细说明
为测度“处理”(或实验)的效果,我们关心被解释变量经“处理”前后的变化,考虑以下两期面板数据:
只加政策变量作为核心解释变量,再加入时间
D(t)
等作为控制变量,进行的普通混合OLS回归,测度出x(it)
的效应β,就是简单地将实验组减去控制组,得到一个有偏的估计(因为x(it)
可能与不随时间改变的个体特征u(i)
等固定效应相关),故下一步再做一阶差分,第二期减去第一期,将u(i)
消掉。即双重差分。双重差分DID
示意图
只有在满足“政策冲击前Treat组和Control组的
y
没有显著差异”(即平行性假定)的条件下,得到的双重差分估计量才是无偏的。
1.2 另一种表述(常用)
1.2.1 理解交互项的含义
例子:研究性别和学历对工资的影响,性别是F,学历是E,工资是S。如果没有交叉项,那么回归的方程是:
S = β0 + β1 × F + β2 × E
在这种情况下,性别的影响是β1,学历的影响是β2。而有交叉项,那么回归的方程是
S = β0 + β1 × F + β2 × E + β3 × F × E
在这种情况下,性别对工资的影响是β1+β3*E
,学历对工资的影响是β1+β3*F
所以我们很容易发现,交叉项刻画了什么呢?
- 它刻画了一个人的学历对工资的影响是否受性别的影响(
β1+β3*F
),刻画了一个人的性别对工资的影响是否受学历的影响(β1+β3*E
)。 - 换言之,他刻画了第一种情况下,如果把不同的性别分开回归,得出的
β2
是否与F
有相关关系,刻画了如果把不同的学历分开回归,得出的β1
是否和E
有相关关系。 - 更简单点说,就是两个自变量对因变量的共同作用。
加交互项,就相当于分组回归(PS:离散型变量的交互项)
Y = β0 + β1× A + β2 × X + β3 × A × X + ε
A对Y有影响
X对Y有影响
β3 :X对Y的影响,因A变化而变化。
按照上述例子,性别是A,学历是X,收入是Y,那么就如同下图。
如果女的是1 男的是0
Y = β0 + β1× A + β2 × X + β3 × A × X + ε
性别是A,学历是X,收入是Y
-
β2:对于男性,学历对收入的影响
-
β2+β3:对于女性,学历对收入影响
-
β3 就是两线的斜率差
-
β1 他们的截距差(性别对收入的影响)
1.2.2 用交互项表示的双重差分
用交互项表示的双重差分G(i)=0时,
y(it)= β0 + β3×D(t) + ε(it)
G(i)=1时,
y(it)= β0 + β1 × D(t) + β2 + β3 × D(t) + ε(it) = β02 + ( β1+ β3 ) × D(t) + ε(it)
-
β3:控制组(
Gi=0
)的t2
与t1
之差,对照组前后期之差。 -
β1+ β3:处理组(
Gi=1
)的t2
与t1
之差,处理组前后期之差。
所以政策变量与时期变量的交互项G(i)×D(t)
的系数β3
就是双重差分估计量,表示了双重差分估计出的政策效应。
2. R、Stata操作运用
R与STATA操作- using all women with children as the treatment group:anykids为分组标识
- post93:时期变量(冲击发生标识),93年前为0和93年后为1
2.1 R:
eitc$p93kids.interaction = eitc$post93*eitc$anykids
reg1 = lm(work ~ post93 + anykids + p93kids.interaction, data = eitc)
summary(reg1)
The coefficient estimate on p93kids.interaction
should match the value calculated manually above.
2.2 Stata:
2.2.1 OLS_DID:
标准:
reg y treat post treat*post x1 x2 ,robust
gen Treat_Post=Treat*Post
xi: regress y Treat Post Treat*Post x1 x2 i.year, vce(robust)
est store OLS_DID
xi:
命令会帮助生成出i.varname
形式的虚拟变量。不加则不会生成新变量,但回归中仍然能使用这些虚拟变量(就是让虚拟变量藏于回归中不显现出来)。
简单示例:
gen interaction = post93*anykids
reg work post93 anykids interaction
或者用Stata非官方命令diff
:
ssc intall diff
diff y, t(处理或分组或政策变量Gi) p(时期虚拟变量Dt) cov(协变量) robust report test
diff work, t(anykids) p(post93) robust
2.2.2 FE_DID:
did只能做混合OLS,不能做固定效应,想做固定效应,要去掉一个虚拟变量。
标准:
xtset group year
xi: xtreg y Treat*Post x1 x2 i.year,fe vce(robust)
est store FE_DID
双向固定效应估计时Post与i.year中某一虚拟变量应该多重共线,Post如同Treat一样分别被时间效应和个体效应吸收了。
输出word结果:(///
表示换行)
esttab OLS_DID FE_DID, ar2(%9.3f) b(%9.3f) t(%9.3f) nogap compress ///
indicate("Year=_Iyear*") star(* 0.1 ** 0.05 *** 0.01)
输出的结果
结果显示交互项(Treat*Post)的系数显著为正,表明政策实施导致了y显著增加。然而,此时我们还不能确切的说,这一政策效果的评估是准确的,因为只有在对照组和实验组满足平行性假定的时候,Treat和post的交互项才是处理效应。因此平行趋势假定的重要性不言而喻。平行性假定的检验可以通过回归分析或者绘图的方式进行。
其他等价方法:
xtreg 与 reg 可殊途同归!(双向固定时)
xtreg y treat*post i.year, fe robust
reg y i.treat i.post i.treat#i.post, robust
注:
FE与LSDV是等价的:
(1)xtreg fatal unrate beertax, fe
(2)xi:reg fatal unrate beertax i.state
2.2.3 平行趋势假定
通过回归分析检验:
分别生成每一期的控制组和处理组:
gen Dyear=year-2012
gen Before2=(Dyear==-2 & Treat==1)
lab var Before2 "2 Year Prior"
gen Before1=(Dyear==-1 & Treat==1)
lab var Before1 "1 Year Prior"
gen Current=(Dyear==0 & Treat==1)
lab var Current "Year of Adoption"
gen After1=(Dyear==1 & Treat==1)
lab var After1 "1 Year After"
gen After2=(Dyear==2 & Treat==1)
lab var After2 "2 Year After"
gen After3_=(Dyear>=3 & Treat==1)
lab var After3_ "3 or More Year After"
xtset group year
xi:xtreg y Treat Post Before2 Before1 Current After1 ///
After2 After3_ x1 x2 i.year,fe vce(robust)
est store Dynamic
平行趋势检验
Before2,Before1均为虚拟变量,如果观测值是受到政策冲击前的第2年和第1年的数据,则该指标分别取1,否则取0;如果观测值是受到政策冲击当年的数据,则Current取值为1,否则取0;当观测值是受到政策冲击后的第1年、第2年、第3年的数据时,After1、After2、After3分别取1,否则取0。
我们看到Before2,Before1的系数均不显著,而Current、After1、After2、After3的系数均正向显著,说明双重差分模型满足平行趋势假定。
注:
1)关于Before之前选几期的问题,一个要看样本跨越的年度,一个要看已有文献的做法。一般来说,时间跨度比较长的话,会保留Before前3年的。
2)如果Before均不显著,就说明样本符合平行性假定。对于Current的显著性则不作要求。
通过绘图检验:
首先,安装外部命令:
ssc install coefplot
当我们help coefplot后可以看到其众多的功能,接下来我们介绍输出图形的模式。
1. 默认输出模式
coefplot Dynamic, keep(Before2 Before1 Current After1 After2 After3_) vertical recast(connect) yline(0)
- 保留关键变量:
keep(Before2 Before1 Current After1 After2 After3_)
- 转置:
vertical
- 系数连线,观察动态效果:
recast(connect)
- 增加直线y=0:
yline(0)
默认输出模式
2. 优化模式
- graphregion & plotregion & title & notes
coefplot Dynamic, keep(Before2 Before1 Current After1 After2 After3_) vertical ///
recast(connect) lcolor(red*0.45) lpattern(-) ///
ciopts(lcolor(edkblue*0.8)) ///
mlcolor(gs6) mfcolor(white) msize(*1.2) msymbol(h) ///
yline(0,lcolor(edkblue*0.6) lwidth(*1.0)) ///
xlabel(,labsize(*0.75) labcolor(purple) tposition(crossing) tlcolor(gs10)) ///
ylabel(,nogrid tposition(crossing) tlcolor(gs10)) ///
graphregion(color(gs16)) ///
plotr(lcolor(edkblue) lpattern(1) lwidth(*1.5)) ///
title("Fig.1 The Dynamic Effect of the Policy") ///
note(" " " Notes: Vertical bands represent +(-)1.96 times the standard error of each point estimate", size(*0.8))
优化模式
3. 进阶:通过两条线展现动态变化
其实,也可以通过两条线来展现冲击发生前后两组样本y的动态变化。其思想和安慰剂实验比较相似。但是对于虚拟变量的定义要进行更改。具体代码如下:
gen Before3=(Dyear==-3)
gen Before2=(Dyear==-2)
gen Before1=(Dyear==-1)
gen Current=(Dyear==0)
gen After1=(Dyear==1)
gen After2=(Dyear==2)
gen After3=(Dyear==3)
gen After4=(Dyear==4)
xtset group year
xi:xtreg y Before3-After4 x1 x2 if Treat==1,fe vce(robust)
est store Treat
xi:xtreg y Before3-After4 x1 x2 if Treat==0,fe vce(robust)
est store Control
coefplot Treat Control, keep(Before* Current After*) vertical recast(connect) yline(0)
Before*
和Current After*
后面*
表示:在搜索字符串末尾指定星号(*
) 以执行通配搜索。
在计算机(软件)技术中,通配符可用于代替字符。 通常地,星号“*
”匹配0个或以上的字符,问号“?
”匹配1个字符。如:123??? 将匹配 1231 或 12313,但不会匹配 123991991