DID新进展:异质性多期DID估计的新方法-csdid

发布时间:2022-09-22 阅读 1742

Stata连享会   主页 || 视频 || 推文 || 知乎 || Bilibili 站

温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。

New! lianxh 命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc, ihelp, rdbalance, gitee, installpkg

课程详情 https://gitee.com/lianxh/Course

课程主页 https://gitee.com/lianxh/Course

⛳ Stata 系列推文:

PDF下载 - 推文合集

作者:彭晴 (暨南大学)
邮箱natasha_pong@163.com


目录


1. 背景简介

双重倍差法 (Difference-in-Differences,DID),是目前实证分析中用于识别因果关系的流行方法之一。标准的 DID 模型将样本分为两组:实验组和对照组;将时间分为两个阶段:政策发生前和政策发生后。所有的实验组样本都在同一时间点受到政策冲击。

随着 DID 方法的拓展,许多实证研究将其拓展为多期 DID,即实验组并非在同一时点遭受政策冲击。但是,自 2019 年来,不少学者纷纷指出这种多期 DID 有可能会产生有偏估计 (Athey and Imbens,2022;Baker et al.,2022;Goodman-Bacon,2021)。

其主要原因在于,多期 DID 估计的本质是多个不同处理效应的加权平均,权重可能存在为负的情形。在权重为负的情下,不同处理效应加权平均后得到的平均处理效应,可能会与真实的平均处理效应方向相反。Baker et al. (2021) 通过数据模拟发现,多期 DID 估计出来有偏误的处理效应甚至会与真实处理效应的符号相反。

为此,Callaway and Sant'Anna (2021) 提出了一种用于识别异质性多期 DID 的新方法,该新方法适用于以下三种情形:

  • 时间分为多期;
  • 实验组受到政策冲击的时间并非同一;
  • 实验组和对照组只有在控制了协变量之后才满足平行趋势假定。

下面本文将详细介绍 Callaway and Sant'Anna (2021) 提出的多期 DID 估计量,以及对应的 Stata 实操和 R 语言实操。

2. 前提假设

假设时间用 t=1,,T 来表示,个体样本用 i 来表示。并且,

  • Dit 为虚拟变量,Dit=1 表示个体 i 在 t 期为 “被处理” 的状态,反之为 “未被处理” 的状态;
  • Gig=1 表示样本 i 在时间 g 首次变成 “被处理” 的状态;
  • Ci=1 表示个体样本 i 从 1 到 T 期都处于 “未被处理” 的状态,这类个体样本被称为 “从未被处理” 的对照组 (Nevered-treated);
  • pg(X) 表示在给定协变量 X 时,样本在时间 g 受到处置的概率:

Callaway and Sant'Anna (2021) 提出的多期 DID 估计量必须满足以下几个假设:

  1. 处理效应不可逆转:一旦样本受到政策冲击,那么其在下一期会继续保留被处理的状态,即 Di,t1=1,意味着 Dit 也必然等于1。
  2. 独立同分布假设。
  3. 从未被处理的对照组满足有条件平行趋势假设:
  1. 还未被处理的对照组满足有条件平行趋势假设:

其中,Yt(1) 和 Yt(0) 为样本在时间 t 被处理和未被处理的潜在结果。

值得注意的是,假设 3 和 4 是两个不同的有条件平行趋势假设。假设 3 意味着,在控制协变量 X 之后,在时间 g 首次 “被处理” 的样本与 “从未被处理” 的样本 (Nevered-treated) 需满足平行趋势假设。假设 4 意味着,在控制协变量 X 之后,在时间 g 首次 “被处理” 的样本与在时间 g “还未被处理” 的样本 (Not-yet-treated) 需满足平行趋势假设。

3. 多期 DID 估计量

假设一个双向固定效应模型,具体形式如下:

其中,Yit 为被解释变量,αt 为时间固定效应,ci 为个体固定效应,Dit 为 0-1 虚拟变量,等于 1 表示受到政策影响,0 则反之,Xi 是个体特征的向量,ϵi,t 为随机扰动项。

首先,Callaway and Sant’Anna (2021) 按照首次被处理的时间将处理组分为不同组别 (用字母 g 标识),估计每个组别 g 在时间 t 的处理效应 ATT(g,t)。采用逆概率加权计算的 ATT(g,t) 非参点估计量为:

需要注意的是,作者提到可以采用三种方法进行估计:回归 (OR)、逆概率加权法 (IPW) 以及双重稳健法 (DR) 。此处只介绍了逆概率加权法的估计量,其他两种方法详见 Callaway and Sant’Anna (2021) 的论文。

其次,Callaway and Sant’Anna (2021) 提供了不同的加总方法,用于计算平均处理效应ATT

选择不同的权重 w(g,t),可以计算出不同类型的平均处理效应,具体包括如下四种:

  • 简单加权平均处理效应 (Simple ATT):将 ATT(g,t) 等权重简单加权求和;
  • 分组平均处理效应 (Group ATT):按照首次被处理的时间 (g) 分组加权求和的平均处理效应;
  • 动态平均处理效应 (Dynamic ATT):按照距离首次被处理时间分组加权求和的平均处理效应,类似于 Event Study;
  • 日历平均处理效应 (Calendar Time ATT):按照正常年份分组加权求和的平均处理效应。

4. Stata 实操

4.1 csdid 命令介绍

csdid 命令安装:

ssc install csdid, replace 

csdid 命令语法:

csdid depvar [indepvars] [if] [in] [weight], [ivar(varname)] time(varname) gvar(varname) [options]

其中,

  • depvar:指定回归的被解释变量;
  • indepvars:指定回归的解释变量;
  • ivar:指定面板回归中的个体标识,如国家 ID、企业 ID 等;
  • time:指定面板回归中的时间标识;
  • gvar:分组标识,按首次被处理的时间分组;
  • notyet: 定义 “从未被处理” 的样本 (Nevered-treated) 和 “还未被处理” 的样本 (Not-yet-treated) 为对照组。当不添加 notyet 时 (默认情况),只选择 “从未被处理” 的样本 (Nevered-treated) 作为对照组。

此外,添加 method(method) 选项,用于选择估计方法。可选择的估计方法包括:drimp 为基于逆概率加权最小二乘法得到的双重稳健 DID 估计量,为默认估计方法;dripw 为基于逆概率的普通最小二乘法得到的双重稳健 DID 估计量;reg 为普通最小二乘法;stdipw 为标准化的逆概率加权法;ipw 为逆概率加权法。

添加 agg(aggtype) 选项,用于选择计算平均处理效应的加权方法。可选择的加权方法包括:simple 对应上述的 Simple ATT;group 对应上述的 Group ATT;calendar 对应上述的 Calendar Time ATT;event 对应上述的 Dynamic ATT。

关于标准误,默认情形是计算稳健标准误。添加 wboot 选项,可用 WildBootstrap 方法计算标准误;添加 cluster 选项,可计算聚类标准误。

4.2 csdid 命令实操

本文选择作者提供的样本数据 mpdta.dta 来展示 csdid 命令的基本操作。

mpdta.dta 数据集包括 500 个 country,时间范围是 2004年—2007年,一共有 2500 个观测值。其包括如下 6 个变量:year 为时间标识,countryreal 为个体标识,lpop 为协变量,lemp 为被解释变量,first_treat 为首次被处理的时间。

first_treat 取值为 0 时表示,该样本为 “从未被处理” 的样本 (Nevered-treated)。treat 为是否为处理组的标识,取值为 1 时表示该样本为处理组。

. use "https://friosavila.github.io/playingwithstata/drdid/mpdta.dta", clear
. des

Contains data from https://friosavila.github.io/playingwithstata/drdid/mpdta.dta
 Observations:         2,500                  Written by R.              
    Variables:             6                  17 May 2021 11:45
---------------------------------------------------------------------------------
Variable      Storage   Display    Value
    name         type    format    label      Variable label
---------------------------------------------------------------------------------
year            int     %9.0g                 year
countyreal      long    %9.0g                 countyreal
lpop            double  %9.0g                 lpop
lemp            double  %9.0g                 lemp
first_treat     int     %9.0g                 first.treat
treat           byte    %9.0g                 treat
---------------------------------------------------------------------------------

首先,我们采用 dripw 方法估计出每个组别 g 在时间 t 的处理效应 ATT(g,t)

. csdid lemp lpop, ivar(countyreal) time(year) gvar(first_treat) method(dripw)

Difference-in-difference with Multiple Time Periods
                                                         Number of obs = 2,500
Outcome model  : least squares
Treatment model: inverse probability
------------------------------------------------------------------------------
             | Coefficient  Std. err.      z    P>|z|     [95% conf. interval]
-------------+----------------------------------------------------------------
g2004        |
 t_2003_2004 |     -0.015      0.022    -0.66   0.511       -0.058       0.029
 t_2003_2005 |     -0.076      0.029    -2.67   0.008       -0.133      -0.020
 t_2003_2006 |     -0.140      0.035    -3.97   0.000       -0.210      -0.071
 t_2003_2007 |     -0.107      0.033    -3.25   0.001       -0.171      -0.042
-------------+----------------------------------------------------------------
g2006        |
 t_2003_2004 |     -0.000      0.022    -0.02   0.983       -0.044       0.043
 t_2004_2005 |     -0.006      0.018    -0.34   0.737       -0.042       0.030
 t_2005_2006 |      0.001      0.019     0.05   0.961       -0.037       0.039
 t_2005_2007 |     -0.041      0.020    -2.09   0.036       -0.080      -0.003
-------------+----------------------------------------------------------------
g2007        |
 t_2003_2004 |      0.027      0.014     1.90   0.057       -0.001       0.054
 t_2004_2005 |     -0.005      0.016    -0.29   0.771       -0.035       0.026
 t_2005_2006 |     -0.028      0.018    -1.56   0.118       -0.064       0.007
 t_2006_2007 |     -0.029      0.016    -1.77   0.076       -0.061       0.003
------------------------------------------------------------------------------
Control: Never Treated
See Callaway and Sant'Anna (2021) for details

从估计结果可知,组别 g 按照首次被处理的时间进行划分,分为三组:在 2004 年首次受到冲击 (标识 g2004);在 2006 年首次受到冲击 (标识 g2006);在 2007 年首次受到冲击 (标识 g2007)。以 g2004 组的结果为例,在 2004 年之后,冲击对该组样本存在显著的负向影响。

进一步地,我们还可以选择不同的加总方式,计算平均处理效应。此处,我们以计算动态平均处理效应为例进行展示。在上述命令的基础上,添加选项 agg(event) 可计算动态平均处理效应。

. csdid lemp lpop, ivar(countyreal) time(year) gvar(first_treat) method(dripw) agg(event)

Difference-in-difference with Multiple Time Periods
                                                         Number of obs = 2,500
Outcome model  : least squares
Treatment model: inverse probability
------------------------------------------------------------------------------
             | Coefficient  Std. err.      z    P>|z|     [95% conf. interval]
-------------+----------------------------------------------------------------
         T-3 |      0.027      0.014     1.90   0.057       -0.001       0.054
         T-2 |     -0.004      0.013    -0.28   0.780       -0.029       0.022
         T-1 |     -0.023      0.014    -1.60   0.109       -0.052       0.005
         T+0 |     -0.021      0.011    -1.83   0.067       -0.044       0.001
         T+1 |     -0.053      0.016    -3.24   0.001       -0.085      -0.021
         T+2 |     -0.140      0.035    -3.97   0.000       -0.210      -0.071
         T+3 |     -0.107      0.033    -3.25   0.001       -0.171      -0.042
------------------------------------------------------------------------------
Control: Never Treated
See Callaway and Sant'Anna (2021) for details

5. R 语言实操

5.1 R 包的安装和导入

首先,安装作者提供的 did-R-Package。

install.packages("did")

安装好之后,可调用 did 包。

library("did")

5.2 R 语言的实操展示

调用 did 包之后,导入作者提供的样本数据 mpdta.rda

load("mpdta.rda")

接着,att_gt 命令可计算每个组别 g 在时间 t 的处理效应 ATT(g,t)。其中,参数 yname 为被解释变量;tname 为时间标识;idname 为个体标识;gname 分组标识,按首次被处理的时间分组;xformla 为协变量;data 为所使用的数据集。

除此之外,我们还可以增加一些 option。例如,可增加 control_group = "notyettreated" 选项,表示定义 “从未被处理” 的样本 (Nevered-treated) 和 “还未被处理” 的样本 (Not-yet-treated) 为对照组。与 Stata 一致,默认情形为只选择 “从未被处理” 的样本 (Nevered-treated) 为对照组。

下面为使用 R 包计算出来的结果,与 Stata 计算出来的结果一致。

out <- att_gt(yname="lemp",
       tname="year",
       idname="countyreal",
       gname="first.treat",
       xformla=~lpop,
       data=mpdta)

Group-Time Average Treatment Effects:
 Group Time ATT(g,t) Std. Error [95% Simult.  Conf. Band]  
  2004 2004  -0.0145     0.0229       -0.0760      0.0470  
  2004 2005  -0.0764     0.0308       -0.1590      0.0061  
  2004 2006  -0.1404     0.0396       -0.2467     -0.0342 *
  2004 2007  -0.1069     0.0331       -0.1958     -0.0180 *
  2006 2004  -0.0005     0.0223       -0.0603      0.0594  
  2006 2005  -0.0062     0.0194       -0.0582      0.0458  
  2006 2006   0.0010     0.0204       -0.0538      0.0557  
  2006 2007  -0.0413     0.0198       -0.0945      0.0119  
  2007 2004   0.0267     0.0135       -0.0094      0.0628  
  2007 2005  -0.0046     0.0169       -0.0498      0.0407  
  2007 2006  -0.0284     0.0181       -0.0769      0.0200  
  2007 2007  -0.0288     0.0150       -0.0689      0.0113  
---
Signif. codes: `*' confidence band does not cover 0
P-value for pre-test of parallel trends assumption:  0.23267
Control Group:  Never Treated,  Anticipation Periods:  0
Estimation Method:  Doubly Robust

最后,我们使用 aggte 命令计算动态平均处理效应,其结果也与 Stata 计算的一致。其中,out 为上面 att_gt 命令运行的结果,type 为选择的加总方式。

aggte(out, type="dynamic") 

Overall summary of ATT's based on event-study/dynamic aggregation:  
     ATT    Std. Error     [ 95%  Conf. Int.]  
 -0.0804        0.0206    -0.1207       -0.04 *
Dynamic Effects:
 Event time Estimate Std. Error [95% Simult.  Conf. Band]  
         -3   0.0267     0.0146       -0.0109      0.0644  
         -2  -0.0036     0.0129       -0.0369      0.0297  
         -1  -0.0232     0.0146       -0.0611      0.0146  
          0  -0.0211     0.0113       -0.0502      0.0081  
          1  -0.0530     0.0170       -0.0969     -0.0091 *
          2  -0.1404     0.0401       -0.2440     -0.0369 *
          3  -0.1069     0.0345       -0.1960     -0.0178 *
---
Signif. codes: `*' confidence band does not cover 0
Control Group:  Never Treated,  Anticipation Periods:  0
Estimation Method:  Doubly Robust

需要注意的是,在 R 语言中,可选择的加总方式也分为四种 (与上述介绍的一致)。但与 Stata 命令不同的是,计算动态平均处理效应的 option 在 R 中为 dynamic (在 Stata 中为 event)。其余三种加总方式,在 Stata 和 R 语言中的表示方式一致,分别为 simplegroupcalendar

6. 参考资料

  • Callaway B, Sant’Anna P H C. Difference-in-differences with multiple time periods[J]. Journal of Econometrics, 2021, 225(2): 200-230. -PDF-
  • Sant’Anna P H C, Zhao J. Doubly robust difference-in-differences estimators[J]. Journal of Econometrics, 2020, 219(1): 101-122. -PDF-
  • Athey S, Imbens G W. Design-based analysis in difference-in-differences settings with staggered adoption[J]. Journal of Econometrics, 2022, 226(1): 62-79. -PDF-
  • Baker A C, Larcker D F, Wang C C Y. How much should we trust staggered difference-in-differences estimates?[J]. Journal of Financial Economics, 2022, 144(2): 370-395. -PDF-
  • Goodman-Bacon A. Difference-in-differences with variation in treatment timing[J]. Journal of Econometrics, 2021, 225(2): 254-277. -PDF-

7. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh did, m
安装最新版 lianxh 命令:
ssc install lianxh, replace

相关课程

免费公开课

最新课程-直播课

专题 嘉宾 直播/回看视频
最新专题 文本分析、机器学习、效率专题、生存分析等
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]
  • Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。

课程主页

课程主页

关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 连享会-主页知乎专栏,700+ 推文,实证分析不再抓狂。直播间 有很多视频课程,可以随时观看。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会小程序:扫一扫,看推文,看视频……

扫码加入连享会微信群,提问交流更方便

✏ 连享会-常见问题解答:
https://gitee.com/lianxh/Course/wikis

New! lianxhsongbl 命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh