文章来源:Fernando Rios-Avila:DID: Panel Data & Repeated Crossection Using CSDID and JWDID
分享这篇推文是为了今天下午西北师范大学经济学院的“面板数据因果推断”讲座,讲稿下载地址“资料分享:面板数据因果推断”。
一、事件异质性的多期DD
在异质性处理效应DID文献之前,用多期、多个体数据,采用DID方法估计处理效应,都会声明如下回归方程:
其中,是二值型处理变量。一般来说,的所有个体都会当做控制组。
异质性处理效应文献让越来越多人意识到,上述TWFE方程要在一些严格的假设之下,才能识别干净的ATT :
- ① 所有的处理个体都在同一时间接受处理;
- ② 如果是交叠处理,处理效应在时间和截面都是同质的(也就是说,在时间和截面上均相同)
这些假设几乎不成立。例如,原始处理可能随着时间推移,效果越来越弱,后处理者可能有后发优势,即比先处理者有更强的效应。这个时候,上述TWFE就可能得不到真实的处理效应:
- ① 线性回归并不能区分好和坏的控制组。它们仅仅只是探究数据的变动(varation)。
- ② 已处理个体被当做“控制组”,因而一些后处理个体会收到“不利(negative)”权重。
最有趣的结果是,研究者估计得到了与真实处理效应相反的效应估计量,例如,即使所有个体都是正处理效应,但是人们估计出负的处理效应。
近些年,许多文献都指出了这一问题,并提出了相似的解决方案(Goodman-Bacon (2021), Callaway and Sant’Anna (2021), Sun and Abraham (2021), Wooldridge (2021) and Borusyak, Jaravel, and Spiess (2023)):允许组群和时间异质性,避免使用已处理个体作为控制组。
这篇推文关注于两个估计量Callaway and Sant’Anna (2021) and Wooldridge (2021),Wooldridge (2021),对应的stata命令为:csdid(csdid2)和jwdid。两种方法都建议当一个个体在时点T接受处理(对应的组群G),我们估计的点估计量是。
二、 G×T DID(不是2×2 DID)
(一)面板数据
首先,加载数据
** to get the data from my repository
ssc install frause, replace
frause mpdta, clear
数据局中包含县级层面的人口规模(lpop)、就业(lemp),以及县最低工资发生变化的起始年份指标(first_treat)。为了估计异质性处理效应的DID模型,要用csdid或者jwdid:
** This is a dependency for csdid
ssc install drdid, replace
ssc install csdid, replace
ssc install jwdid, replace
通常,我们要创建一个虚拟变量(处理个体被处理后):
gen trt = (first_treat<=year)*(first_treat>0)
下面,创建处理类指标gvar:
egen gvar = csgvar(trt), ivar(countyreal) tvar(year)
值得注意的是,stata 18的官方命令xthdidregress和hdidregress并不要求这一步,因为它会自动生成cohort变量。下面,我们可以检查一下gvar:
tab year gvar
正如预期,我们有2500个样本,500个县,309个未处理,20个在2004年处理,40个在2006年处理,131个在2007年处理。这些数字被称为“有效样本数”,因为csdid仅仅只是用这些信息来估计处理效应。换言之,我们应该假设有效样本数为20(模型声明和控制变量的个数很有用)。
默认地,jwdid用还未处理的个体作为控制组。因此,为了使得csdid与jwdid的结果可比,jwdid用“从未处理个体”作为控制组。对于csdid,默认用上一期作为基期,从未处理个体作为控制组。为了改变,可以使用long2选项。这些选项会使得结果可比。
* csdid
csdid lemp , ivar(county) time(year) gvar(gvar) long2
* jwdid
jwdid lemp , ivar(county) time(year) gvar(gvar) never
(二)重复截面数据
重复截面数据稍微有一些不同。一方面,我们并不能在多个时间观测到同一个体。因此,没有个体固定效应。实践中,研究者总是尝试利用组群固定效应或者处理层面的固定效应。
我们再来看看前面的数据集。为了模拟重复截面数据结构,假设每一轮,数据是从每个地区内随机得到的县,我们并不能识别时间层面的县。用上面的数据集,放弃10%的数据,创建一个地区id变量,放弃县的识别码:
** load and obtain trt
frause mpdta, clear
gen trt = (first_treat<=year)*(first_treat>0)
gen state = int(countyreal/1000)
** Randomly keep 90% of the data
set seed 1
sample 90
drop countyreal
下面,来创建gvar,与前面的命令相似,但县识别码换成了地区id。注意,地区id代表的是处理层面,它可以在时间层面识别出来:
egen gvar = csgvar(trt), ivar(state) tvar(year)
检查一下gvar:
tab year gvar
这样我们就把个体层面的重复截面数据转换成地区层面的面板数据结构。
这个时候就可以使用csdid和jwdid:
* 在使用csdid时,我们要放弃ivar选项,为了确保在正确层面聚类,我们使用cluster()选项,并用地区id作为聚类层级
csdid lemp , cluster(state) time(year) gvar(gvar) long2
* 事件研究图
estat event
csdid_plot
* 在使用jwdid时,可以在ivar()选项中使用地区id,也可以使用cluster()替代ivar
jwdid lemp , ivar(state) time(year) gvar(gvar) never
estat event
jwdid_plot
jwdid lemp , cluster(state) time(year) gvar(gvar) never group
estat event
jwdid_plot