簡單介紹一下實證論文中雙重差分法(DID)的平行趨勢檢驗(Parallel Trend Test)在Stata中如何操作。
(本文首發于個人微信公衆号DMETP,歡迎關注!)
一、平行趨勢假定平行趨勢假定是實證論文中使用DID的前提,處理組與控制組的目标變量在政策發生前(事前)隻有滿足平行趨勢假設才能使用DID。反之,如果處理組和控制組在事前就存在一定的差異,那麼用DID做出來(可能還很好看)的結果就不再能代表政策的淨效應,極有可能存在其他因素影響我們被解釋變量的變動,此時可以使用三重差分法(DDD)。關于三重差分模型,講的超級詳細。
二、平行趨勢檢驗這裡主要介紹兩種情況下的平行趨勢檢驗。
一是普通DID模型的平行趨勢檢驗,包括怎麼畫時間趨勢圖,怎麼畫95%置信區間圖(動态效應檢驗圖)。這裡以石大千等(2018)公布在《中國工業經濟》官網上的為例,由于所公布資料無法生成處理組虛拟變量,這裡将使用微信公衆号『功夫計量經濟學』處理之後的。
參考文獻:石大千, 丁海, 衛平, 劉建江. 智慧城市建設能否降低環境污染[J]. 中國工業經濟, 2018(06): 117-135.
二是多期DID模型的平行趨勢檢驗,包括怎麼畫95%置信區間圖。這裡之所以沒有畫平行趨勢圖,是因為在多期DID中,各個處理組受到政策沖擊的時點不一緻。因此,就算能夠準确識别出處理組和控制組,由于處理組政策起始時點不一緻,我們也很難在同一張圖中将兩組目标變量的時間趨勢圖畫出來。
的思路是,單獨提取從樣本開始年份直到某一年年末才受到政策沖擊的樣本為處理組,并将從樣本開始年份直到某一年年末都沒受到政策沖擊的樣本作為控制組,畫出兩組間的時間趨勢圖,這樣的方法在政策沖擊時點較少時可以考慮,因此不具有一般性。
參考文獻:李青原, 章尹賽楠. 金融開放與資源配置效率——來自外資銀行進入中國的證據[J]. 中國工業經濟, 2021(05): 95-113.
三、動态效應檢驗動态效應檢驗實質上就是引入有限個時間虛拟變量,并将其與處理組虛拟變量交乘,考察交乘項的顯著性。動态效應檢驗和平行趨勢檢驗是有區别的,平行趨勢檢驗中,隻要考察0時期前的交乘項是否顯著,如果不顯著,說明處理組和控制組在事前并沒有顯著差異,可以使用DID。
而動态效應檢驗不僅考察事前,也關注事後組别之間的差異,如果0時期後(包括0時期)的交乘項顯著,說明政策實施存在一定的持續性效果。當然,平行趨勢檢驗隻要求事前不顯著,事後顯不顯著不影響事前的結論。
由于多期DID中處理組受到政策影響的時點不一緻,那麼怎樣生成時間虛拟變量就成為一個問題。在李青原和章尹賽楠(2021)中,分為5個時期,分别是樣本起始年份至政策實施前兩年、政策實施前一年、政策實施當年,政策實施後一年、政策實施後兩年至樣本結束年份;而在中,直接省略政策推行前三年以上的年份。可見,多期DID平行趨勢檢驗中如何設計時間虛拟變量需要兼顧理論假設和最終結果,同時需要想象力~
參考文獻:沈坤榮, 金剛. 中國地方政府環境治理的政策效應——基于“河長制”演進的研究[J]. 中國社會科學, 2018(05): 92-115.
四、代碼*==============================================================================* * 雙重差分法(DID) | 平行趨勢檢驗 * *==============================================================================* ** Stata Version: 16 | 17 ** 【數據來源】普通DID(原始數據):石大千等(2018), 參見在《中國工業經濟》網站(http://ciejournal.ajcass.org/Magazine/show/?id=54281) *- 普通DID(加工數據):『功夫計量經濟學』微信公衆号(https://mp.weixin.qq.com/s/06v6s90G1pp-yLju_yAy1Q) *- 多期DID(原始數據):李青原和章尹賽楠(2021),參見在《中國工業經濟》網站(http://ciejournal.ajcass.org/Magazine/show/?id=77331) ** 【參考文獻】[1] 石大千, 丁海, 衛平, 劉建江. 智慧城市建設能否降低環境污染[J]. 中國工業經濟, 2018(06): 117-135. *- [2] 李青原, 章尹賽楠. 金融開放與資源配置效率——來自外資銀行進入中國的證據[J]. 中國工業經濟, 2021(05): 95-113. *- [3] 沈坤榮, 金剛. 中國地方政府環境治理的政策效應——基于“河長制”演進的研究[J]. 中國社會科學, 2018(05): 92-115+206. cd "C:\Users\KEMOSABE\Desktop\parallel_trend_test" graph set window fontface "Times New Roman" graph set window fontfacesans "宋體" **# 一、普通DID的平行趨勢檢驗 use smart_city2018.dta, clear global xlist "lnrgdp lninno lnurb lnopen lnss" **# 1.1 時間趨勢圖 bysort du year: egen mean_lnrso = mean(lnrso) twoway(line mean_lnrso year if du == 1, /// lpattern(solid) /// lcolor(black) /// lwidth(thin) /// scheme(qleanmono) /// ytitle("{stSans:人}""{stSans:均}""{stSans:廢}" /// "{stSans:氣}""{stSans:排}""{stSans:放}" /// "{stSans:量}" , size(medlarge) orientation(h)) /// xtitle("{stSans:年份}", size(medlarge)) /// xline(2012, lpattern(solid) lcolor(black) lwidth(thin)) /// saving(parallel_trend_test_1-1, replace)) /// (line mean_lnrso year if du == 0, /// lpattern(shortdash) /// lcolor(black) /// lwidth(thin)) , /// xlabel(2005(2)2015 , labsize(medlarge)) /// ylabel(-2.5(0.25)-1.5, labsize(medlarge) format(%3.2f)) /// legend(label(1 "{stSans:處理組}") /// label(2 "{stSans:控制組}") /// size(medlarge) position(1) symxsize(10)) graph export "parallel_trend_test_1-1.emf", replace discard // 結果已保存至路徑文件夾 **# 1.2 動态效應檢驗(事件研究法) gen current = 2012.year * du forvalue i = 4(-1)1 { gen before`i' = (year == 2012 - `i') * du } forvalue k = 1/3 { gen after`k' = (year == 2012 + `k') * du } drop before4 // 将2008年作為基準年 qui reghdfe lnrso before* current after* $xlist , absorb(id year) cluster(id) coefplot, /// keep(before* current after*) /// vertical /// scheme(qleanmono) /// coeflabels(before3 = -3 /// before2 = -2 /// before1 = -1 /// current = 0 /// after1 = 1 /// after2 = 2 /// after3 = 3) /// msymbol(O) msize(small) mcolor(black) /// addplot(line @b @at, lcolor(black) lwidth(thin) lpattern(solid)) /// ciopts(recast(rcap) lcolor(black) lwidth(thin)) /// yline(0, lpattern(dash) lcolor(black) lwidth(thin)) /// ytitle("{stSans:系}""{stSans:數}", size(medlarge) orientation(h)) /// xtitle("{stSans:期數}" , size(medlarge)) /// xlabel(, labsize(medlarge)) /// ylabel(, labsize(medlarge) format(%02.1f)) /// saving(parallel_trend_test_1-2, replace) graph export "parallel_trend_test_1-2.emf", replace discard clear all cls **# 二、多期DID的平行趨勢檢驗 use 平行趨勢檢驗.dta, clear global y "TFPQD_OP TFPQD_LP" global adjyear "yb2 yb1 y0 ya1 ya2" global ctrlvars "ADM PPE ADV RD HHI INDSIZE NFIRMS FCFIRM MARGIN LEVDISP SIZEDISP ENTRYR EXITR" global options "absorb((city)*(year) (ind3)*(year)) cluster(city year) keepsing" gen year_enter = 2007 replace year_enter = 2004 if city == 5101 | city == 5000 | city == 2102 | /// city == 3501 | city == 4401 | city == 3701 | /// city == 3201 | city == 3702 | city == 3101 | /// city == 4403 | city == 1200 | city == 4201 | /// city == 4404 | prov == 44 | prov == 45 | /// prov == 43 | prov == 32 | prov == 33 replace year_enter = 2005 if city == 1100 | city == 5301 | city == 2101 | /// city == 3502 | city == 6101 replace year_enter = 2006 if city == 2201 | city == 2301 | city == 6201 | /// city == 6401 gen yb2 = (year_enter == year + 2) gen yb1 = (year_enter == year + 1) gen y0 = (year_enter == year) gen ya1 = (year_enter == year - 1) gen ya2 = (year_enter <= year - 2) **# 2.1 動态效應檢驗(TFPQD_OP) qui reghdfe TFPQD_OP $adjyear $ctrlvars , $options coefplot, /// keep( $adjyear ) /// vertical /// scheme(qleanmono) /// coeflabels(yb2 = -2 /// yb1 = -1 /// y0 = 0 /// ya1 = 1 /// ya2 = 2) /// msymbol(O) msize(small) mcolor(black) /// addplot(line @b @at, lcolor(black) lwidth(thin) lpattern(solid)) /// ciopts(recast(rcap) lcolor(black) lwidth(thin)) /// yline(0, lpattern(dash) lcolor(black) lwidth(thin)) /// ytitle("{stSans:系}""{stSans:數}", size(medlarge) orientation(h)) /// xtitle("{stSans:期數}" , size(medlarge)) /// xlabel(, labsize(medlarge)) /// ylabel(, labsize(medlarge) format(%03.2f)) /// saving(parallel_trend_test_2-1, replace) graph export "parallel_trend_test_2-1.emf", replace discard **# 2.2 動态效應檢驗(TFPQD_LP) qui reghdfe TFPQD_LP $adjyear $ctrlvars , $options coefplot, /// keep( $adjyear ) /// vertical /// scheme(qleanmono) /// coeflabels(yb2 = -2 /// yb1 = -1 /// y0 = 0 /// ya1 = 1 /// ya2 = 2) /// msymbol(O) msize(small) mcolor(black) /// addplot(line @b @at, lcolor(black) lwidth(thin) lpattern(solid)) /// ciopts(recast(rcap) lcolor(black) lwidth(thin)) /// yline(0, lpattern(dash) lcolor(black) lwidth(thin)) /// ytitle("{stSans:系}""{stSans:數}", size(medlarge) orientation(h)) /// xtitle("{stSans:期數}" , size(medlarge)) /// xlabel(, labsize(medlarge)) /// ylabel(, labsize(medlarge) format(%03.2f)) /// saving(parallel_trend_test_2-2, replace) graph export "parallel_trend_test_2-2.emf", replace discard五、運行結果 1. 普通DID的平行趨勢檢驗
用石大千等(2018)的數據繪制出如下圖 1和圖 2。其中,圖 1是時間趨勢圖,可以看到,在政策實施年份(2012)年之前,處理組和控制組的人均廢氣排放量變動趨勢大體一緻,但在2005-2006這兩年間兩組目标變量的變動方向相反。在2012年以後,控制組人均廢氣排放量有過上揚的曆史,随後在2013年開始逐年下降,但下降幅度不大;處理組的人均廢氣排放量在2012年以後年份均處于下降通道,且在2014年下降幅度較大。因此,可以初步判斷兩組間在政策實施年份前的時間趨勢假定基本是滿足的,政策實施年份以後趨勢線的差異基本判斷是由智慧城市試點造成的。當然,這個結論并不穩健,需要進一步檢驗兩組間的動态效應。
圖 2是動态效應檢驗圖。其中,垂直于橫軸的帶蓋短直線是各期數與處理組虛拟變量的交乘項回歸系數的95%置信區間。可以看到,在期數為0(該例為2012年)以前,除政策實施年份三年前的系數顯著(95%置信區間沒有越過系數 = 0的水平虛線),其餘期數都是不顯著的,這也與時間趨勢圖所揭示的信息基本保持一緻。而在政策實施以後的所有年份,系數基本顯著(期數為2時有微微不顯著),說明該政策的影響具有一定的持續性(或稱時滞性),并且在樣本期間内于實施後的第三年該政策具有最大的效果。
當然,基準年的選擇對顯著性的影響很大,這裡将2008年作為基準年,也可以通過選擇不同的基準年對結果進行适當調整。
2. 多期DID的平行趨勢檢驗圖 3和圖 4分别是使用李青原和章尹賽楠(2021)公布的數據畫出來的基于OP法和LP法計算的TFP離散度的動态效應檢驗圖。在李青原和章尹賽楠(2021)公布的附件中,作者在平行趨勢檢驗部分提供了回歸結果表,但沒有将其繪制成圖。如圖 3所示,在政策實施之前,系數都是不顯著的,政策實施以後,系數同樣都不顯著。這說明了基于OP法計算的TFP離散度滿足平行趨勢假定,但政策實施不具有持續性。雖然政策不具有持續性,但系數為負是符合基本理論假設的,并且在政策實施一年後開始,系數與t值較之前明顯增大。
圖 4就比較完美了,實施年份之前都不顯著,實施年份之後都顯著,且系數符合理論假設,這說明基于OP法計算的TFP離散度既滿足平行趨勢假定,而且政策實施的影響具有一定的持續性。
有話要說...