双重差分法(DID)平行趋势及安慰剂检验方法案例合集
前半部分来源:社会科学中的数据可视化(id:SKSJKSH)、普林斯顿大学教程https://dss.princeton.edu/training/DID101.pdf
后半部分论文来源于中国工业经济
双重差分法(DID)平行趋势及安慰剂检验方法合集
1、简介
现代计量经济学和统计学的发展为我们的研究提供了可行的工具。倍差法来源于计量经济学的综列数据模型,是政策分析和工程评估中广为使用的一种计量经济方法。主要是应用于在混合截面数据集中,评价某一事件或政策的影响程度。该方法的基本思路是将调查样本分为两组,一组是政策或工程作用对象即“作用组”,一组是非政策或工程作用对象即“对照组”。根据作用组和对照组在政策或工程实施前后的相关信息,可以计算作用组在政策或工程实施前后某个指标(如收入)的变化量(收入增长量),同时计算对照组在政策或工程实施前后同一指标的变化量。然后计算上述两个变化量的差值(即所谓的“倍差值”)。这就是所谓的双重差分估计量(Difference in Differences,简记DD或DID),因为它是处理组差分与控制组差分之差。该法最早由Ashenfelter(1978)引入经济学,而国内最早的应用或为周黎安、陈烨(2005)。
常用的倍差法主要包括双重倍差法和三重倍差法。双重差分法(Difference-in-difference,DID)有几种其他的称谓:倍差法、差分再差分等。该方法的原理非常简单,它要求数据期至少有两期,所有的样本被分为两类:实验组和控制组,其中实验组在第一期是没有受到政策影响,此后政策开始实施,第二期就是政策实施后的结果,控制组由于一直没有受政策干预,因此其第一期和第二期都是没有政策干预的结果。双重差分方法的测算也非常简单,两次差分的效应就是政策效应。
双重差分法的假定,为了使用OLS一致地估计方程,需要作以下两个假定。
假定1:此模型设定正确。特别地,无论处理组还是控制组,其时间趋势项都是。此假定即“平行趋势假定”(parallel trend assumption)。DID最为重要和关键的前提条件:共同趋势(Common Trends)
双重差分法并不要求实验组和控制组是完全一致的,两组之间可以存在一定的差异,但是双重差分方法要求这种差异不随着时间产生变化,也就是说,处理组和对照组在政策实施之前必须具有相同的发展趋势。
假定2:暂时性冲击与政策虚拟变量不相关。这是保证双向固定效应为一致估计量(consist estimator)的重要条件。在此,可以允许个体固定效应与政策虚拟变量相关(可通过双重差分或组内变换消去,或通过LSDV法控制)。
DID允许根据个体特征进行选择,只要此特征不随时间而变;这是DID的最大优点,即可以部分地缓解因 “选择偏差”(selection bias)而导致的内生性(endogeneity)。
2、DID操作案例
Difference in differences (DID) Estimation step‐by‐step双重差分操作步骤
首先我们读入所需数据,生成政策前后以及控制组虚拟变量,并将它们相乘产生交互项。
方法一:
Getting sample data调用数据
use "http://dss.princeton.edu/training/Panel101.dta", clear
Create a dummy variable to indicate the time when the treatment started. Lets assume that treatment started in 1994. In this case, years before 1994 will have a value of 0 and 1994+ a 1. If you already have this skip this step.设置虚拟变量,政策执行时间为1994年
gen time = (year>=1994) & !missing(year)
*Create a dummy variable to identify the group exposed to the treatment. In this example lets assumed that countries with code 5,6, and 7 were treated (=1). Countries 1-4 were not treated (=0). If you already have this skip this step生成地区的虚拟变量
gen treated = (country>4) & !missing(country)
* Create an interaction between time and treated. We will call this interaction ‘did’ 产生交互项
gen did = time*treated
Estimating the DID estimator随后将这三个变量作为解释变量,y作为被解释变量进行回归:
reg y time treated did, r
结果为:
. gen time = (year>=1994) & !missing(year)
.
.
. gen treated = (country>4) & !missing(country)
.
.
. gen did = time*treated
. reg y time treated did, r
Linear regression Number of obs = 70
F(3, 66) = 2.17
Prob > F = 0.0998
R-squared = 0.0827
Root MSE = 3.0e+09
------------------------------------------------------------------------------
| Robust
y | Coef. Std. Err. t P>|t| [95% Conf. Interval]
-------------+----------------------------------------------------------------
time | 2.29e+09 9.00e+08 2.54 0.013 4.92e+08 4.09e+09
treated | 1.78e+09 1.05e+09 1.70 0.094 -3.11e+08 3.86e+09
did | -2.52e+09 1.45e+09 -1.73 0.088 -5.42e+09 3.81e+08
_cons | 3.58e+08 7.61e+08 0.47 0.640 -1.16e+09 1.88e+09
------------------------------------------------------------------------------
. reg y time treated did, r
Linear regression Number of obs = 70
F(3, 66) = 2.17
Prob > F = 0.0998
R-squared = 0.0827
Root MSE = 3.0e+09
------------------------------------------------------------------------------
| Robust
y | Coef. Std. Err. t P>|t| [95% Conf. Interval]
-------------+----------------------------------------------------------------
time | 2.29e+09 9.00e+08 2.54 0.013 4.92e+08 4.09e+09
treated | 1.78e+09 1.05e+09 1.70 0.094 -3.11e+08 3.86e+09
did | -2.52e+09 1.45e+09 -1.73 0.088 -5.42e+09 3.81e+08
_cons | 3.58e+08 7.61e+08 0.47 0.640 -1.16e+09 1.88e+09
------------------------------------------------------------------------------
.
did的系数显著为负,表明政策实施对Y有显著的(10%显著性水平下)负效应
方法二:diff
The command diff is user‐defined for Stata,To install type
ssc install diff下载外部命令方法
**diff y, t(treated) p(time)**
结果为:
. diff y, t(treated) p(time)
DIFFERENCE-IN-DIFFERENCES ESTIMATION RESULTS
Number of observations in the DIFF-IN-DIFF: 70
Before After
Control: 16 24 40
Treated: 12 18 30
28 42
--------------------------------------------------------
Outcome var. | y | S. Err. | |t| | P>|t|
----------------+---------+---------+---------+---------
Before | | | |
Control | 3.6e+08| | |
Treated | 2.1e+09| | |
Diff (T-C) | 1.8e+09| 1.1e+09| 1.58 | 0.120
After | | | |
Control | 2.6e+09| | |
Treated | 1.9e+09| | |
Diff (T-C) | -7.4e+08| 9.2e+08| 0.81 | 0.422
| | | |
Diff-in-Diff | -2.5e+09| 1.5e+09| 1.73 | 0.088*
--------------------------------------------------------
R-square: 0.08
* Means and Standard Errors are estimated by linear regression
**Inference: *** p<0.01; ** p<0.05; * p<0.1
.
3、双重差分平行趋势检验
在介绍完DID的基本思想和模型设定后,我们再来说说DID的稳健性检验,也就是要想办法证实所有效应确实是由政策实施所导致的。
关于DID的稳健性检验,主要表现在两个方面:
1、共同趋势检验
所谓共同趋势或者平行趋势,是指处理组和控制组在政策实施之前必须具有相同的发展趋势。
如果不满足这一条件,那么两次差分得出的政策效应β就不完全是真实的政策效应,其中有一部分是由处理组和控制组本身的差异所带来的。
平行趋势检验―般有画时间趋势图和事件研究法两种方法。
如果平行趋势假设成立,那么在政策时点之前,处理组和控制组应该不存在显著差异。
画时间趋势图其实是一种比较粗糙的方法,具体做法就是绘制处理组和控制组的y的均值的时间趋势,这种方法简单直观,不能在统计意义上准确地判断处理组和控制组是否存在显著差异。
事件研究法相比画平行趋势图更为准确、更为科学,具体做法就是生成年份虚拟变量YEARj与处理组虚拟变量treati的交互项,加入模型中进行回归(M、N分别表示政策前和政策后的期数),那么交互项treatixYEARj的系数δj衡量的就是第j期处理组和控制组之间的差异。
平行趋势检验
首先生成年份虚拟变量与实验组虚拟变量的交互项,此处选在政策前后各3年进行对比。
gen period = year - 1994
forvalues i = 3(-1)1{
gen pre_`i' = (period == -`i' & treated == 1) }
gen current = (period == 0 & treated == 1)
forvalues j = 1(1)3{
gen time_`j' = (period == `j' & treated == 1)
}
随后将这些交互项作为解释变量进行回归,并将结果储存在reg中以备后续检验。
xtreg y time treated pre_* current time_* i.year, fe
est sto reg
采用coefplot命令进行绘图,观察是否1994年前的回归系数均在0轴附近波动,在1994年后回归系数显著为负。
**coefplot reg, keep(pre_\* current post_\*) vertical recast(connect) yline(0) xline(3, lp(dash))**
结果发现系数在政策前的确在0附近波动,而政策后一年系数显著为负,但很快又回到0附近。这说明实验组和控制组的确是可以进行比较的,而政策效果可能出现在颁布后一年,随后又很快消失。
4、安慰剂检验
如果说你发现模型满足平行趋势检验,也不能高兴的太早,我们仍要担心政策干预时点之后处理组和对照组趋势的变化是否受到了其他政策或者随机性因素的影响,因为仅凭一个交互项并不足以说明就是我们关心的政策导致了y的变动。
这时,安慰剂检验可以帮助我们的DID估计结果更具稳健性。
除了共同趋势检验,在DID方法中还有一项重要的必不可少的检验--安慰剂检验。
为什么要叫做安慰剂检验呢?
安慰剂来自于医学上的随机实验,当我们要检验某种新药品的疗效,就可以将参加实验的人群随机分为两组,其中一组为实验组,服用真药,另一组为控制组,服用安慰剂(无效的糖丸),不让参与者知道自己服用的是真药还是安慰剂,以避免主观心理作用影响实验效果,这就是安慰剂检验。
安慰剂检验核心思想就是虚构处理组或者虚构政策时间进行估计,如果不同虚构方式下的估计量的回归结果依然显著,那么就说明说明原来的估计结果很有可能出现了偏误,我们的被解释变量y的变动很有可能是受到了其他政策变革或者随机性因素的影响。
笔者认为,共同趋势检验是一种安慰剂检验,但反过来不成立,因为安慰剂检验还包括除共同趋势检验以外的其他检验。在现有的政策性评估文章中,有很多种进行安慰剂检验的方法。具体如下所述。
第一种,可以采用政策发生之前的数据。将政策实施前的除第一年之外的所有年份“人为地”设定成为处理组的政策实施年份,然后根据DID模型逐年回归。当所有回归中的交互项系数都不显著时,说明通过了安慰剂检验,表明之前识别的政策平均效应是可靠的,否则就是不可靠的。如果政策实施前有n年数据,那么就要做n-1次上述回归。
第二种,可以“人为地”随机选择政策实施对象(处理组),然后使用全样本做DID回归。如果交互项系数不显著,则判断政策对随机选择的处理组都不存在政策效应,可以进一步证明之前识别的政策平均效应结果是可靠稳健的
第三种,改变被解释变量,通常选择理论上不受政策影响的其他变量,保持真实的对照组和处理组、真实的政策实施时间,重新进行DID 回归,理想的结果是,该政策的实施对其他被解释变量都不存在政策效应。
可以说,DID方法最难的部分就是安慰剂检验,如果安慰剂检验不通过,那么双重差分模型得到的结果就不具有说服力,大家在科研实践中一定要多加注意。
4.1 安慰剂检验方法1:
[论文1、“一带一路”倡议促进了中国高质量出口吗——来自微观企业的证据](中国工业经济 (ajcass.org))
该文使用了平行趋势检验以及安慰剂检验,代码为:
******************************************************************************
*********************************六、稳健性检验*******************************
******************************************************************************
***********************
**附表3:平行趋势检验**
***********************
set more off
gen Dyear= _日期-2014
gen pre4= (Dyear==-4&ydyl==1)
gen pre3= (Dyear==-3&ydyl==1)
gen pre2= (Dyear==-2&ydyl==1)
gen pre1= (Dyear==-1&ydyl==1)
gen current=(Dyear==0&ydyl==1)
gen post1= (Dyear==1&ydyl==1)
reghdfe ln_quality pre4 pre3 pre2 current post1 $x3, absorb(i._日期 _企业编码) vce(cluster province)
outreg2 using wjx1.doc,keep( pre4 pre3 pre2 current post1) replace addtext(Firm FE, Yes, Year FE, Yes, Controls*t, Yes, Controls*t*t, Yes, Controls*t*t*t, Yes) dec(4)
est store Dynamic1
***********************************
**图1:双重差分模型的平行趋势检验**
***********************************
coefplot Dynamic1, ///
keep(pre4 pre3 pre2 current post1) ///
coeflabels(pre4 = 2010 ///
pre3 = 2011 ///
pre2 = 2012 ///
current = 2014 ///
post1 = 2015 ) ///
vertical ///
yline(0,lp(dash)) ///
ytitle("ln(Quality)回归系数") ///
xtitle("年份") ///
addplot(line @b @at) ///
ciopts(recast(rcap)) ///
rescale(100) ///
ylabel(, nogrid) ///
scheme(tufte)
graph export "figurename.png", replace
*******************
**图2:安慰剂检验**
*******************
cd C:\Users\user\Desktop\数据\placebo
set more off
forvalues i=1(1)500 {
use dodata,clear
save ydyl_data,replace
use ydyl_data,clear
keep citycode _日期
bysort citycode _日期: gen temp_code=_n
keep if temp_code==1
drop temp_code
drop if _日期==2010
save dummy_data,replace
use dummy_data,clear
** create the false dataset
bysort _日期: keep if _n==1
sample 1, count
keep _日期
save temp,replace
use dummy_data,clear
merge m:1 _日期 using temp
keep if _merge==3
drop _merge
sample 36, count
keep _日期 citycode
rename _日期 ydyl_日期
save ydyl_time,replace
* Generate the false_ydyl_after variable
use ydyl_time
merge 1:m citycode using ydyl_data
gen false_citycode=(_merge==3)
drop _merge
egen tt=mean(ydyl_日期)
replace ydyl_日期=tt
drop tt
gen false_after=(_日期-ydyl_日期>=0)
gen false_ydyl_after=false_citycode*false_after
save ydyl_data,replace
* Regression
reghdfe ln_quality false_ydyl_after Capital_City_t Yangtz_City_t ratio_fiscal_t ratio_gdp_t lnstudent_t ratio_city_t Capital_City_t2 Yangtz_City_t2 ratio_fiscal_t2 ratio_gdp_t2 lnstudent_t2 ratio_city_t2 Capital_City_t3 Yangtz_City_t3 ratio_fiscal_t3 ratio_gdp_t3 lnstudent_t3 ratio_city_t3 , absorb(i._日期 _企业编码) vce(cluster province)
parmest,format (estimate min95 max95 %8.2f p %8.3f) saving("temp.dta", replace)
use "temp.dta", clear
keep if parm=="false_ydyl_after"
append using "ydyl_simulations.dta"
save "ydyl_simulations.dta", replace
}
erase "temp.dta"
use "ydyl_simulations.dta", clear
drop if estimate==.
save "ydyl_simulations.dta", replace
**Graphs
*Density Plot
dpplot estimate,xline(0.129) xtitle("虚假估计系数") ytitle("估计系数密度分布") saving("PDF_ydyl_dpplot.gph", replace)
论文2、石大千等:智慧城市建设能否降低环境污染
更多关于DID的稳健性检验,阅读石大千等:智慧城市建设能否降低环境污染,中国工业经济2018 年第 6 期
论文3--金融开放与资源配置效率