作者:侯新爍 [編譯] (知乎 | 簡書 | 碼雲)

Stata現場班報名中……

Stata連享會 精品專題 || 精彩推文

編者按: 平行趨勢假設檢驗是多期 DID 模型中必不可少的檢驗步驟,本期為大家介紹在 Stata 中如何進行多期平行趨勢假設檢驗並繪製平行趨勢檢驗圖。

資料參考來源:mostly-harmless-replication - 05 Fixed Effects, DD and Panel Data


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, [email protected] )於 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 的圖形輸出部分代碼。

Stata連享會 精品專題 || 精彩推文

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 下載過程,此時需要將網址 economics.mit.edu/~daut 複製到瀏覽器進行下載,然後手動解壓獲得數據文件。

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 模型

數據中,各時間節點與政策處理的交互項都是手動生成的,具體說明如下: - 以 admico 開頭帶 _ 的表示政策執行前多少期對應的交互項,如 admico_2 表示政策發生前 2 期的虛擬變數與處理組變數的交互項; - 以 admico 開頭不帶 _ 的表示政策發生後對應交互項,其中 admico0 表示政策發生當期。

此時可以直接展開多期 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.yeari.statei.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 進行繪圖。


關於我們

  • Stata 連享會(公眾號:StataChina)】由中山大學連玉君老師團隊創辦,旨在定期與大家分享 Stata 應用的各種經驗和技巧。
  • 公眾號推文同步發佈於 CSDN-Stata連享會 、簡書-Stata連享會 和 知乎-連玉君Stata專欄。可以在上述網站中搜索關鍵詞StataStata連享會後關注我們。
  • 點擊推文底部【閱讀原文】可以查看推文中的鏈接並下載相關資料。
  • Stata連享會 精彩推文1 || 精彩推文2

聯繫我們

  • 歡迎賜稿: 歡迎將您的文章或筆記投稿至Stata連享會(公眾號: StataChina),我們會保留您的署名;錄用稿件達五篇以上,即可免費獲得 Stata 現場培訓 (初級或高級選其一) 資格。
  • 意見和資料: 歡迎您的寶貴意見,您也可以來信索取推文中提及的程序和數據。
  • 招募英才: 歡迎加入我們的團隊,一起學習 Stata。合作編輯或撰寫稿件五篇以上,即可免費獲得 Stata 現場培訓 (初級或高級選其一) 資格。
  • 聯繫郵件: [email protected]

往期精彩推文

  • Stata連享會推文列表1
  • Stata連享會推文列表2
  • Stata連享會 精彩推文1 || 精彩推文2


推薦閱讀:

相关文章