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期(