手把手教你学多时点DID(1)
1. 引言
双重差分法 (DID) 作为目前政策评估方法中非常流行的一种方法,广泛应用于社科研究的各个领域。现有文献中关于该方法的应用多而零碎,给初学者的学习与选择带来了一定困难。因此,为了提升文献阅读与方法应用效率,系统学习 DID 是十分有必要的。
本推文将从基本模型介绍、前期数据准备、基准回归、平行趋势检验、安慰剂检验以及 PSM-DID 等整体流程入手,采用模型分析与实例结合的形式对多时点 DID 模型进行讲解。
2. 模型介绍
我们以经典 DID 模型为例:
DIDi,t为政策虚拟变量,本质是 treati*post t。treat i为个体虚拟变量,政策实施个体均取值为 1,其余为 0; post t 为时间虚拟变量,政策实施当年及以后取值为 1,其他为 0。(DIDi,t 与 post t 在数值上相同)
3. 数据准备
我们以白俊红等(2022)的论文数据为例,以国家创新型城市试点政策实施为准自然实验,展示如何用代码构造变量DIDi,t。需要注意的是该文中 city=147 的城市政策实施时间为 2010 年,但是 did 却从 2012 开始计算。后续分析中本推文将其调整至 2010 年,所得结果可能与原文有细微差异,但不影响方法学习。
(1)准备面板数据,即不含 DIDi,t 相关变量在内的论文实证数据,需要包括个体 id,便于下文匹配。
(2) 准备政策实施样本,并构造政策实施时间变量:policy(便于区分原文变量,用 pt 表示),示例如下:
| city | pt | --------------- | 3 | 2010 | | 4 | 2010 | | 5 | 2011 | | 14 | 2010 | | 25 | 2011 | | 26 | 2010 | | 34 | 2010 | | 35 | 2010 | | ... | ... |
(3) 代码操作
-
方法一:
use inno_policy,clear //面板数据,由于原文中存在相关变量,故对变量名做了修改 merge m:1 city using inno_pt //在全样本中匹配处理组样本政策时间 drop _merge replace pt=0 if pt==. //对照组样本policy=0 g Treat=0 replace Treat=1 if pt~=. g Post=0 replace Post=1 if pt==2008&year>=2008 replace Post=1 if pt==2010&year>=2010 replace Post=1 if pt==2011&year>=2011 replace Post=1 if pt==2012&year>=2012 replace Post=1 if pt==2013&year>=2013 replace Post=1 if pt==2018&year>=2018 //对创新政策实施不同年份分别进行替换 gen did=Treat*Post //Post与did 在数值上相等
需要注意的是在进行数据匹配时最好采用id,直接用个体汉字名称可能会出错。
**验证结果是否一致 xtset city year xtreg entre_activation did $xlist i.year, fe robust Fixed-effects (within) regression Number of obs = 4,200 Group variable: city Number of groups = 280 R-squared: Obs per group: Within = 0.5500 min = 15 Between = 0.6964 avg = 15.0 Overall = 0.5535 max = 15 F(20,279) = 116.98 corr(u_i, Xb) = 0.3706 Prob > F = 0.0000 (Std. err. adjusted for 280 clusters in city) ------------------------------------------------------------------------------ | Robust entre_acti~n | Coefficient std. err. t P>|t| [95% conf. interval] -------------+---------------------------------------------------------------- did | .2974479 .0385105 7.72 0.000 .2216399 .3732558 lnagdp | .263528 .1433524 1.84 0.067 -.0186617 .5457178 indust_stru | -.5693443 .1860012 -3.06 0.002 -.9354883 -.2032003 finance | .1101172 .0396146 2.78 0.006 .0321357 .1880987 ainternet | .009737 .0033379 2.92 0.004 .0031663 .0163076 market | -.0185662 .0091767 -2.02 0.044 -.0366306 -.0005018 _cons | -.7182469 1.286313 -0.56 0.577 -3.250357 1.813863
基于构造的变量进行回归后,得到与原数据相同结论,表明本文对数据的处理具有合理性。
-
方法二:
本例不提供具体数据,以国家级大数据综合试验区为政策构造变量。相比方法一而言,该方法可以直接利用汉字名称来构建政策变量,相对直观。但是对于处理组个体较多的样本在处理时缺陷繁琐,在实际应用过程中,可以灵活选择。
use data, clear g policy=0 replace policy=2015 if 所属省份=="贵州省" replace policy=2016 if 所属省份=="北京市"|所属省份=="天津市"|所属省份=="河北省"|所属省份=="广东省"|所属省份=="上海市"|所属省份=="河南省"|所属省份=="重庆市"|所属省份=="内蒙古自治区" g treat=0 replace treat=1 if policy~=0 gen post=0 replace post=1 if policy==2015&year>=2015 replace post=1 if policy==2016&year>=2016 g did=treat*post
4. 基准回归
DID 模型中的基本回归命令与面板回归命令基本一致,应用比较普遍的是xtreg
与reghdfe
。对于xtreg
命令的使用已较为成熟,此处不再赘述。reghdfe
命令可以解决多维固定效应问题,而且运行速度较快,因而备受青睐。关于reghdfe
的具体介绍可以参考reghdfe:多维面板固定效应估计与Stata:关于 reghdfe 命令常见问题解答。以下为两种命令代码示例:
xtreg entre_activation did $xlist i.year, fe robust //稳健标准误 xtreg gdpr did invest consume export gov second agg innov i.year, fe cluster(id) //聚类稳健标准误 reghdfe gdpr did invest consume export gov second agg innov,ab(province year) vce(cluster id) //固定省份、年份效应 reghdfe gdpr did invest consume export gov second agg innov,ab(i.province#i.year province year id) vce(cluster id) //固定省份×年份、省份、年份、个体效应
参考资料
-
白俊红,张艺璇,卞元超.创新驱动政策是否提升城市创业活跃度——来自国家创新型城市试点政策的经验证据[J].中国工业经济,2022(06):61-78.-PDF-
-
胡雨霄,连享会推文,多维面板固定效应估计
-
秦利宾,连享会推文,关于reghdfe命令常见问题解答