作者:王昆仑 (天津大学)
Stata连享会 计量专题 || 公众号合集
2020寒假Stata现场班2020寒假Stata现场班 (北京, 1月8-17日,连玉君-江艇主讲)
「+助教招聘」
文中包含的链接在微信中无法生效。请点击本文底部左下角的。
在 「连享会 - 倍分法系列推文」—— 「倍分法DID详解 (一):传统 DID」 文中,我们详细介绍了 DID 模型的估计,平行趋势的检验以及政策的动态效果的展示等主题,并通过模拟的方式给出了较为详尽的解答。
但该文中仅仅针对实施时点为统一的年份将样本划分为实验组和控制组的 Standard DID 模型。本文作为本系列的第二篇文章,将对政策实施时点更加灵活的 DID 形式进行介绍,其主要内容结构和方法与上一篇尽量保持一致,以达到本系列开篇时所说的用一套模拟方法将 Standard DID 和 Time-varying DID 模型整合在一起的目的。
标准 DID 模型一般针对政策实施时点为同一个时期,且接受干预的状态将一直持续下去,否则 的交互项设置将会严重违背平行趋势的假设,从而导致交互项的估计系数有偏。由于现实世界中很多的政策试点地区和时间都不尽相同,而且也容易发生个体是否接受政策干预的状态在不停地发生改变,因此,本文将介绍渐进 DID 方法(Time-varying DID)来使得 DID 模型更加具有一般性。这类模型也被称为多时点 DID。陈强老师在推文中称为“异时 DID (heterogeneous timing DID)”。
高铁开通、官员晋升以及多阶段试点政策等主题往往应用渐进 DID 方法作为其主要方法。说到渐进 DID 的相关论文,不得不提到的就是发表在 The Journal of Finance 上的 Beck, Levine & Levkov(2010) 这篇文章。它运用渐进 DID 方法对银行去管制对收入分配的影响,并且给出渐进 DID 模型的平行趋势检验的方法。这篇不失为一篇利用渐进 DID 的模版。关于 Beck, Levine & Levkov(2010)更多的讨论,请参见经管之家黄河泉老师的帖子,这篇文章的代码和数据也可以从这个帖子中下载得到。我们在本文的第五节对 Beck, Levine & Levkov(2010) 的 Figure 3 进行复现。
下面对Standard DID 和 Time-varying DID 的模型设定予以简要的介绍。在双重固定效应(Two-Way Fixed Effects)的估计框架下,Standard DID 的一般化方程是
与之相对应的Time-varying DID 的一般化模型设定是
其中, 表示随时间和个体变化的控制变量, 表示个体固定效应, 表示时间固定效应, 表示标准残差项, 。公式(1)和公式(2)中最重要的区别就是 和 。换句话说,Time-varying DID 用一个随时间和个体变化的处理变量代替 Standard DID 中常用的交互项。
再次仿照 「倍分法DID详解 (一):传统 DID」 文中生成基础的数据结构,依然为60个体*10年=600个观察值的平衡面板数据。Time-varying DID 的设置体现在,我们使得 id 编号为 1-20 的个体在 2004 年接收政策干预,编号 21-40 的个体在 2006 年接受干预,编号为 41-60 的个体在 2008 年接受干预。因此,三组个体接受政策干预的时长分别为 6 年,4 年和 2年。
///设定60个观测值,设定随机数种子
. clear all
. set obs 60
. set seed 10101
. gen id =_n
/// 每一个数值的数量扩大11倍,再减去前六十个观测值,即60*11-60 = 600,为60个体10年的面板数据
. expand 11
. drop in 1/60
. count
///以id分组生成时间标识
. bys id: gen time = _n+1999
. xtset id time
///生成协变量以及个体和时间效应
. gen x1 = rnormal(1,7)
. gen x2 = rnormal(2,5)
. sort time id
. by time: gen ind = _n
. sort id time
. by id: gen T = _n
. gen y = 0
///生成处理变量,此时D为Dit,设定1-20在2004年接受冲击,21-40为2006年,36-60为2008年
. gen D = 0
. gen birth_date = 0
forvalues i = 1/20{
replace D = 1 if id == `i' & time >= 2004
replace birth_date = 2004 if id == `i'
}
forvalues i = 21/40{
replace D = 1 if id == `i' & time >= 2006
replace birth_date = 2006 if id == `i'
}
forvalues i = 41/60{
replace D = 1 if id == `i' & time >= 2008
replace birth_date = 2008 if id == `i'
}
///将基础数据结构保存成dta文件,命名为DID_Basic_Simu.dta,默认保存在当前的 working directory 路径下
save "DID_Basic_Simu_1.dta", replace
生成结果变量,设定接受干预个体的政策效果为 10。利用固定效应模型消除个体效应和 x1、x2 两个变量对结果变量的影响,得到残差,画出更加干净分组的结果变量的时间趋势图。这个图形可以作为验证平行趋势的一个旁证。
///调用生成的基础数据文件
clear
use "DID_Basic_Simu_1.dta"
///Y的生成,使得接受冲击的个体的政策真实效果为10
bysort id: gen y0 = 10 + 5 * x1 + 3 * x2 + T + ind + rnormal()
bysort id: gen y1 = 10 + 5 * x1 + 3 * x2 + T + ind + 10 + rnormal() if time >= 2004 & id >= 1 & id <= 20
bysort id: replace y1 = 10 + 5 * x1 + 3 * x2 + T + ind + 10 + rnormal() if time >= 2006 & id >= 21 & id <= 40
bysort id: replace y1 = 10 + 5 * x1 + 3 * x2 + T + ind + 10 + rnormal() if time >= 2008 & id >= 41 & id <= 60
bysort id: replace y1 = 10 + 5 * x1 + 3 * x2 + T + ind + rnormal() if y1 == .
replace y = y0 + D * (y1 - y0)
///去除个体效应和协变量对Y的影响,得到残差并画图
xtreg y x1 x2 , fe r
predict e, ue
binscatter e time, line(connect) by(D)
///输出生成的图片,令格式为800*600
graph export "article2_1.png",as(png) replace width(800) height(600)
图1
继续使用双向固定效应(Two-Way Fixed Effects)的方法设定方程,使用 reg
, xtreg
, areg
, reghdfe
等四个 Stata 命令进行估计,四个命令的比较放在了下方的表格中。在本文中,主要展示命令'reghdfe'的输出结果,该命令的具体介绍可以参考 Stata: reghdfe-多维固定效应。
reg | xtreg | areg | reghdfe | |
---|---|---|---|---|
个体固定效应 | i.id | xtreg,fe | areg,absorb(id) | absorb(id time) |
时间固定效应 | i.time | i.time | i.time | absorb(id time) |
估计方法 | OLS | 组内去平均后OLS | OLS | OLS |
优点 | 命令熟悉,逻辑清晰 | 固定效应模型的官方命令 | 官方命令,可以提高组别不随样本规模增加的估计效率 | 高维固定效应模型,可以极大提到估计效率,且选项多样,如支持多维聚类 |
缺点 | 运行速度慢,结果呈现过多不太需要的固定效应的结果 | 需要手动添加时间固定效应 | 需要手动添加时间固定效应 | 无 |
. reghdfe y c.D x1 x2, absorb(id time) vce(robust)
+-----------------------------------------------------------------------------+
(converged in 3 iterations)
HDFE Linear regression Number of obs = 600
Absorbing 2 HDFE groups F( 3, 528) = 282958.86
Statistics robust to heteroskedasticity Prob > F = 0.0000
R-squared = 0.9996
Adj R-squared = 0.9995
Within R-sq. = 0.9994
Root MSE = 0.9630
+-----------------------------------------------------------------------------+
| Robust
y| Coef. Std. Err. t P>t [95% Conf. Interval]
+-----------------------------------------------------------------------------+
D| 9.884974 .1571734 62.89 0.000 9.576212 10.19374
x1| 4.995274 .0056514 883.90 0.000 4.984172 5.006376
x2| 2.998722 .0083092 360.89 0.000 2.982399 3.015045
+-----------------------------------------------------------------------------+
Absorbed degrees of freedom:
+--------------------------------------------------------+
Absorbed FE| Num. Coefs. = Categories - Redundant
+--------------------------------------------------------+
id | 60 60 0
time | 9 10 1
+--------------------------------------------------------+
///保存并输出多个命令的结果
reg y c.D x1 x2 i.time i.id, r
eststo reg
xtreg y c.D x1 x2 i.time, r fe
eststo xtreg_fe
areg y c.D x1 x2 i.time, absorb(id) robust
eststo areg
reghdfe y c.D x1 x2, absorb(id time) vce(robust)
eststo reghd