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