Staggered-DID 的实现
为保证本贴的简洁性与一般适用性,本文并没有使用现有真实数据,而是模拟了一个一般数据。如果你手中有正在处理好的project数据,可以跳过1.数据生成
,直接从2.数据预加工
开始。
1.数据生成
(1)数据生成过程
-
我将随机生成一个数据来模拟staggered-DID,即设定了50个unit,其中第
1/3/5/7/9/11/13/15/17/19
个unit是实验组,剩下的40个unit为对照组。 -
生成一个自然年份
year
,从2001-2020年 -
我将随机给treatment group分配一个shock时间,并生成对应的
treatyear
变量
unit | shock year |
---|---|
id == 1|3 | 2010 |
id == 5|7|9 | 2011 |
id == 11|13 | 2012 |
id == 15 | 2013 |
id == 17|19 | 2014 |
-
根据
treat
、year
以及treatyear
等变量:-
生成相对时间
ty
,用以衡量各年是shock发生前或后的第几年 -
生成
post
变量,用于反映shock是否已经发生 -
生成
did
项
-
-
最后,利用随机数,生成outcome变量,
lnv
以下是实现过程,注意运行一下程序须保证stata安装egenmore包
(2)数据生成代码
**# 1.生成数据
clear
cap snapshot erase _all
set obs 1000
egen id = repeat() ,v(1/50)
sort id
egen year = repeat(), v(2001/2020)gen treat = mod(id,2) & id <= 20
gen treatyear = 2010 if id <= 3
replace treatyear = 2011 if id > 3 & id <= 9
replace treatyear = 2012 if id > 9 & id <= 13
replace treatyear = 2013 if id > 13 & id <= 15
replace treatyear = 2014 if id > 15 & id <= 19gen ty = year - treatyear
gen post = (ty >= 0)
gen did = treat * post gen lnv = log(rnormal() +10 + sqrt( 1 + rnormal() ^ 2))
replace lnv = lnv + log(uniform()+1) if treat == 1 & post == 1
(3)数据生成结果
2.数据预加工
(1)加工步骤
在得到数据后,须先对数据进行一定处理,才可进行staggered-DID估计,主要有以下几步:
- 生成各期的虚拟变量,例如:
- 对于事前第1期(