本文轉載自Stata連享會 作者:侯新爍
本期責任編輯:王俊
編者按: 平行趨勢假設檢驗是多期 DID 模型中必不可少的檢驗步驟,本期為大家介紹在 Stata 中如何進行多期平行趨勢假設檢驗並繪製平行趨勢檢驗圖。
資料參考來源:mostly-harmless-replication - 05 Fixed Effects, DD and Panel Data
連享會 · 最受歡迎的課
🍓 2021 Stata 寒假班
⌚ 2021 年 1.25-2.4
🌲 主講:連玉君 (中山大學);江艇 (中國人民大學)
👉 課程主頁:https://gitee.com/arlionn/PX
1. 導言雙重差分模型( Difference in Differences , DID )是政策效果評估中常用的一種計量識別策略。其原理是基於反事實框架來評估政策發生和不發生這兩種情景下被觀測變量(因變量)的變化,因而樣本被劃分為實驗組( Treated 或 Treat )和對照組( Untreated 或 Control )。
使用該方法的一個尤為重要的假設條件即滿足 「平行趨勢」( Parallel Trend ),即兩組樣本在衝擊或者政策發生前必須具有可比性,因為控制組的表現被假定為實驗組的反事實。本次推文,將結合 coefplot 命令為大家介紹多期 DID 模型平行趨勢檢驗圖形的繪製。
2. 資源準備2.1 基本原理圖示在僅有兩期的DID模型中,我們通常使用如下圖形展示其原理,以 2008 年為政策發生時間點為例:
其中,C 對應 Control 組,T 對應 Treat 組,TD 代表 T 的反事實情形,則此時 T 與 TD 在 2008 年的差值即為 DID 識別的處理效應,而此時因為前後各僅有一期,實際上較難以識別平行假設是否成立,因而我們通常會對通過樣本本身的匹配性加強這一假設的穩健性。
而在多期情形中,圖形可能展示如下:
多個時間節點信息的出現,使我們可以對不同樣本中組因變量的變化趨勢進行觀察。此時,平行趨勢要求處理組 T 和控制組 C 在政策時點前具有一致的趨勢(平行)。當然,不同組別樣本前具有平行趨勢,並不代表著政策發生之後的時間段內依然具有反事實意義上的平行趨勢。
從文獻來看,最為常見的展示是否符合平行趨勢假設的檢驗方法有兩個:其一,對比不同組別因變量均值的時間趨勢;其二,回歸中加入各時點虛擬變量與政策變量的交互項(如本例中年份虛擬變量乘以實驗組虛擬變量),若政策或稱為處理發生前的交互項係數不顯著,則表明的確有著平行趨勢。
接下來,本推文將給出 Stata 中進行第二種檢驗方法的代碼操作和圖形輸出。
2.2 安裝 coefplot該命令由 Ben Jann ( University of Bern, ben.jann@soz.unibe.ch )於 2017 年 9月編寫,用於對回歸係數和其他結果進行圖形繪製,展示係數結果和置信區間範圍,更多信息參見 help coefplot 。
若您的電腦尚未安裝該命令,請執行如下代碼:
ssc install coefplot, replace
若安裝出現問題請使用 findit 命令手動安裝
findit coefplot
3. 多期 DID 平行趨勢圖本期推介的是由 vikjam 編寫的 Replication of tables and figures from "Mostly Harmless Econometrics" in Stata, R, Python and Julia 中關於 DID 的圖形輸出部分代碼。
Step 1: 準備與數據下載clear all
set more off
eststo clear
capture version 14
* 下載 zip 壓縮包數據文件
. shell curl -o outsourcingatwill_table7.zip ///
"http://economics.mit.edu/~dautor/outsourcingatwill_table7.zip"
* 解壓到當前文件夾
. unzipfile outsourcingatwill_table7.zip
此時,若正常運行,則會在 dos 窗口中看到如圖情形。
解壓後得到文件夾 table7 ,其中的 `autor-jole-2003.dta 數據即為本次示例數據。經驗證,部分 Stata 用戶可能無法正確執行上述 dos 下載過程,此時需要將網址http://economics.mit.edu/~dautor/outsourcingatwill_table7.zip 複製到瀏覽器進行下載,然後手動解壓獲得數據文件。
Step 2: 調用數據及數據預處理作者對數據進行了論文的仿製處理,具體經濟含義請參考原文,或者請忽略,因為不是敲黑板呦。
use "table7/autor-jole-2003.dta", clear
/* 對數總就業人數:來自勞工統計局(BLS)就業和收入數據 */
gen lnemp = log(annemp)
/* 非商業服務部門就業:來自美國海關( CBP ) */
gen nonemp = stateemp - svcemp
gen lnnon = log(nonemp)
gen svcfrac = svcemp / nonemp
/* 商業服務部門總就業:來自美國海關( CBP ) */
gen bizemp = svcemp + peremp
gen lnbiz = log(bizemp)
/* 生成時間趨勢 */
gen t = year - 78 // 線性時間趨勢
gen t2 = t^2 // 二次時間趨勢
/* 限制樣本時間區間 */
keep if inrange(year, 79, 95) & state != 98
/* 生成更多的統計數據 */
gen clp = clg + gtc
gen a1624 = m1619 + m2024 + f1619 + f2024
gen a2554 = m2554 + f2554
gen a55up = m5564 + m65up + f5564 + f65up
gen fem = f1619 + f2024 + f2554 + f5564 + f65up
gen white = rs_wm + rs_wf
gen black = rs_bm + rs_bf
gen other = rs_om + rs_of
gen married = marfem + marmale
/* 修正工會變量 */
replace unmem = . if inlist(year, 79, 81)
replace unmem = unmem * 100
Step 3: 估計 DID 模型數據中,各時間節點與政策處理的交互項都是手動生成的,具體說明如下:
此時可以直接展開多期 DID 回歸了。因此,在應用該方法時,需要事先生成交互項,此處需注意。
reg lnths lnemp admico_2 admico_1 admico0 admico1 admico2 admico3 mico4 admppa_2 admppa_1 ///
admppa0 admppa1 admppa2 admppa3 mppa4 admgfa_2 admgfa_1 admgfa0 admgfa1 admgfa2 admgfa3 ///
mgfa4 i.year i.state i.state#c.t, cluster(state)
該回歸通過 i.year 、 i.state 和 i.state#c.t 對時間固定效應、個體固定效應和個體與時間趨勢的交叉效應進行了控制。
step 4 圖形的輸出與優化使用 coefplot 可較便捷和快速的生成多期動態效應圖,更多使用方法請 help coefplot 。
coefplot, keep(admico_2 admico_1 admico0 admico1 admico2 admico3 mico4) vertical addplot(line @b @at)
通過 coefplot 選項對圖形進行優化,對橫縱坐標的標記、標題以及樣式等進行設定:
coefplot, keep(admico_2 admico_1 admico0 admico1 admico2 admico3 mico4) ///
coeflabels(admico_2 = "2 yr prior" ///
admico_1 = "1 yr prior" ///
admico0 = "Yr of adopt" ///
admico1 = "1 yr after" ///
admico2 = "2 yr after" ///
admico3 = "3 yr after" ///
mico4 = "4+ yr after") ///
vertical ///
yline(0) ///
ytitle("Log points") ///
xtitle("Time passage relative to year of adoption of implied contract exception") ///
addplot(line @b @at) ///
ciopts(recast(rcap)) ///
rescale(100) ///
scheme(s1mono)
當然,也可以通過 scheme() 將風格更改為自己熟悉或常用的格式,例如 qleanmono 風格:
最後,圖片的輸出保存:
graph export "figure.png", replace
4. 代碼匯總ssc install coefplot, replace
*findit coefplot
clear all
set more off
eststo clear
capture version 14
shell curl -o outsourcingatwill_table7.zip "http://economics.mit.edu/~dautor/outsourcingatwill_table7.zip"
unzipfile outsourcingatwill_table7.zip
use "table7/autor-jole-2003.dta", clear
gen lnemp = log(annemp)
gen nonemp = stateemp - svcemp
gen lnnon = log(nonemp)
gen svcfrac = svcemp / nonemp
gen bizemp = svcemp + peremp
gen lnbiz = log(bizemp)
gen t = year - 78
gen t2 = t^2
keep if inrange(year, 79, 95) & state != 98
gen clp = clg + gtc
gen a1624 = m1619 + m2024 + f1619 + f2024
gen a2554 = m2554 + f2554
gen a55up = m5564 + m65up + f5564 + f65up
gen fem = f1619 + f2024 + f2554 + f5564 + f65up
gen white = rs_wm + rs_wf
gen black = rs_bm + rs_bf
gen other = rs_om + rs_of
gen married = marfem + marmale
replace unmem = . if inlist(year, 79, 81)
replace unmem = unmem * 100
reg lnths lnemp admico_2 admico_1 admico0 admico1 admico2 admico3 mico4 admppa_2 admppa_1 ///
admppa0 admppa1 admppa2 admppa3 mppa4 admgfa_2 admgfa_1 admgfa0 admgfa1 admgfa2 admgfa3 ///
mgfa4 i.year i.state i.state#c.t, cluster(state)
coefplot, keep(admico_2 admico_1 admico0 admico1 admico2 admico3 mico4) vertical addplot(line @b @at)
coefplot, keep(admico_2 admico_1 admico0 admico1 admico2 admico3 mico4) ///
coeflabels(admico_2 = "2 yr prior" ///
admico_1 = "1 yr prior" ///
admico0 = "Yr of adopt" ///
admico1 = "1 yr after" ///
admico2 = "2 yr after" ///
admico3 = "3 yr after" ///
mico4 = "4+ yr after") ///
vertical ///
yline(0) ///
ytitle("Log points") ///
xtitle("Time passage relative to year of adoption of implied contract exception") ///
addplot(line @b @at) ///
ciopts(recast(rcap)) ///
rescale(100) ///
scheme(s1mono)
graph export "figurename.png", replace
後記:本質上是根據平行假設檢驗的回歸設計,獲得係數和對應標準誤信息,然後利用標記置信區間的 connected 進行繪圖。
關於我們
連享會 ( 主頁:lianxh.cn ) 由中山大學連玉君老師團隊創辦,定期分享實證分析經驗。直達連享會:【百度一下:連享會】即可直達連享會主頁。亦可進一步添加 主頁,知乎,面板數據,研究設計 等關鍵詞細化搜索。📊 公眾號推文分類:歷史推文分為多個專輯,主流方法介紹一目了然:DID, RDD, IV, GMM, FE, Probit 等。連享會主頁 lianxh.cn連享會小程序:掃一掃,看推文,看視頻……
掃碼加入連享會微信群,提問交流更方便
連享會學習群-常見問題解答匯總:
https://gitee.com/arlionn/WD