Stata: 斷點回歸 (RDD) 教程

作者:張子楠 (浙江財經大學)

Stata 連享會: 知乎 | 簡書 | 碼雲 | CSDN | StataChina公衆號

Stata連享會   計量專題 || 精品課程 || 簡書推文 || 公衆號合集

點擊查看完整推文列表

連享會計量方法專題……

1. RDD基本原理

斷點回歸分析被認爲是最接近隨機實驗的檢驗方法,能夠緩解參數估計的內生性問題,近來在越來越多的研究中得到使用。現有資料已經對斷點回歸方法的基本原理和效應識別進行了較爲廣泛的介紹,但對階數選擇和穩健性檢驗等問題的仍相對較少涉及。本文將基於Stata軟件來系統介紹斷點回歸方法的圖形觀測、效應識別和有效性和穩健性檢驗。限於篇幅,本文將內容限定於清晰斷點回歸方法(Sharp Regression Discontinuity Design ),且只考慮只有一個斷點和一個分配變量的問題。

2. 圖形觀察

2.1 生成模擬數據

我們先生成一份模擬數據,並保存爲 RDD_simu_data0 。生成的數據中, z1 和 z2 爲控制變量。 y1 爲結果變量(outcome variable)。x 爲分配變量(assignment vaiable)。分配點(cutoff point)設定爲 0.5 ,從而x大於0.5 的爲實驗組,小於0.5的爲對照組。

此外,在RDD檢驗中,我們通常還會對分配變量進行去中心化處理,即用分配變量減去分配點值。如本文中,令 xc=x-0.5 。進而 xc 大於 0 的位實驗組,反之爲對照組。

本部分的相應代碼如下:

	clear all
	global dir d:/RDDStata
	capture mkdir $dir
	cd $dir
	
	set obs 4000
	set seed 123
	
	gen x = runiform()     //分配變量
	gen xc = x-0.5  //分配變量去中心化

	gen e = rnormal()/5    // noise
	gen z1 = rnormal()*0.5  //控制變量
	gen z2=1+3*invnormal(uniform())+sin(x*5)/3+e  //另一個控制變量
	
	gen T=0               
	replace T=1 if x>0.5   //treatment 
	
	gen g0 = 0 + 3*log(x+1) + sin(x*6)/3
	gen g1 = T + 3*log(x+1) + sin(x*6)/3
	gen y1 = g1 + 0.5*z1 +0.3*z2+ e   // outcome vaiable,with cutoff effect
	gen y0 = g0 + 0.5*z1 +0.3*z2+ e  // outcome variable, without cutoff effect

	label var y1 "Outcome variable (y)"
    label var y0 "Outcome variable (y)"
	label var x  "Assignment variable (x)"
	label var xc "Centered Assignment variable (x-c)"
	label var T  "T=1 for x>0.5, T=0 otherwise"
	
	drop e g* 
	
	save "RDD_simu_data0.dta", replace  //保存一份數據以備後用
	

2.2 斷點效應的圖形觀察

使用 RDD 方法檢驗時,首先要確定結果變量在分配點存在跳躍現象,也即存在斷點效應。可以用散點圖來觀察。下圖中給出了不存在斷點效應和存在斷點效應兩種情況。如下圖所示,右側圖的結果變量y在分配點0.5處一個相對較爲明顯的跳躍,說明可能存在斷點效應。

graph1.png

本部分相應代碼如下:

use "RDD_simu_data0.dta", clear

twoway (scatter y0 xc, msymbol(+) msize(*0.4) mcolor(black*0.3))  ,   title("無斷點")
graph save y0,  replace
twoway (scatter y1 xc, msymbol(+) msize(*0.4) mcolor(black*0.3))  ,   title("有斷點")
graph save y1, replace

graph  combine y0.gph y1.gph, row(1)

但用散點圖來觀察存在兩個問題:一是樣本太多時不夠直觀,二是實際分析時中跳躍現象可能不那麼清晰。爲此,我們可以利用擬合方法,對分配點左右分別擬合,通過觀察兩側擬合線的的差異來更容易推測跳躍現象是否發生
RDD分析裏提供了rdplot命令處理這項工作。下圖中分別列出了利用散點圖、 rdplot 命令 + 線性擬合、 rdplot命令 + 二階多項式擬合圖和rdplot命令 + 三階多項式擬合圖的結果。

graph2.png

本部分相應代碼如下。其中 rdplot 命令中, c() 選項表示斷點位置,不設定則默認爲 0 。 p() 選項表示擬合的階數。

use "RDD_simu_data0.dta", clear

twoway (scatter y1 xc, msymbol(+) msize(*0.4) mcolor(black*0.3)),   title("散點圖")
graph save scatter.gph,  replace
rdplot y1 xc, c(0) p(1) graph_options(title(線性擬合)) // 線性擬合圖
graph save rd1,  replace
rdplot y1 xc, c(0) p(2) graph_options(title(二次型擬合))//二次型擬合圖
graph save rd2,  replace
graph  combine scatter.gph  rd1.gph rd2.gph

3. 政策效應估計

3.1 局部線性迴歸

使用局部線性迴歸法,是假定在斷點鄰域中的處理效應爲線性,通過在左右兩側鄰域分別進行線性迴歸並比較兩側迴歸係數差異來進行識別。局部迴歸檢驗的一個重要環節在於斷點鄰域大小的選擇,也即 RDD 分析裏帶寬選擇 (bandwidth selection) 的權衡問題。這是因爲帶寬越大,則意味着有越多的樣本被納入檢驗中,參數估計更準確,但也意味着樣本隨機性要求越難滿足,內生性問題可能更嚴重。

本文中斷點xc的鄰域爲 ([xc-h1,xc+h2]) , h1 和 h2 分別爲左右兩側帶寬。h1和h2可以相等,也可以不等。在斷點分析中,可進行局部線性斷點回歸的命令有 rd、rdrobust 和 rdcv 三個命令。這三個都會自動給出該命令下最優帶寬。本部分相應代碼如下。

//由於rdc命令迴歸較爲耗時,本文僅隨機抽取模擬數據中10%的觀察值來演示。
use "RDD_simu_data0.dta", clear
set matsize 2000
set seed 135
sample 10          //隨機抽取10%的觀察值
rdplot y1 xc, c(0) //檢測一下,看看數據特徵是否發生明顯變化

// 不同局部線性斷點回歸命令			
rd   y1 xc, c(0)
rdrobust y1 xc, c(0) p(1) 
rdcv y1 xc, thr(0) deg(1)

比較三個命令的迴歸結果,可以發現迴歸係數分別爲 0.982,0.978和0.978 ,不同命令的係數結果基本一致。對於最優帶寬選擇,三個命令下分別爲 0.208,0.187和0.2 ,十分接近。

此外, rd 命令不僅給出了最優帶寬,還同時給出了帶寬取最優帶寬50%和200%的迴歸結果。觀察 rd 命令結果可發現,50%、100%和200%帶寬下回歸係數也較爲接近,分別爲 0.954,0.982和0.954 。可知模擬數據的清晰斷點回歸結果對帶寬選擇並不敏感,這也表明迴歸結果是穩健的。

3.2 局部多項式迴歸

線性假設可能會錯誤估計了斷點左右的迴歸係數,我們可以採取非線性擬合的辦法進行彌補,即使用局部多項式斷點回歸方法。上文介紹的 rd、rdrobust和rdcv 三個命令,同樣可以用於局部多項式斷點回歸分析。本部分相應代碼如下:

use "RDD_simu_data0.dta", clear    

rdrobust y1 xc  //自動選擇階數
rdrobust y1 xc, p(2) //二階擬合
rdrobust y1 xc, p(3) //三階擬合

對於局部多項式斷點回歸,關鍵問題之一在於階數的選擇。我們利用赤池信息準則 (Akaike Information Criterion,AIC) 和貝葉斯信息準則 (Bayesian Information Criterion,BIC) ,選擇不同階數迴歸中AIC或BIC信息準則小的值。本文采用連玉君 Stata 培訓班介紹的方法,結合 rdcv 命令來選擇階數。

	*---------------------------------myic-----------------------
		 program define myic
		 version 13
		   qui estat ic
		   mat a = r(S)
		   estadd scalar AIC = a[1,5]
		   estadd scalar BIC = a[1,6]
		 end
		*---------------------------------myic------------------
		*-Note: 調用自定義程序myic的方法爲選中上述代碼,按快捷鍵 Ctrl+R, 將程序讀入內存


    use "RDD_simu_data0.dta", clear
    set matsize 2000
    set seed 135
    sample 10          //rdcv迴歸較爲耗時,僅隨機抽取10%的觀察值來演示。
    
#d ;
    rdcv y1 xc, thr(0) deg(1);		myic;   est store m1;   
    rdcv y1 xc, thr(0) deg(2);		myic;   est store m2;
    rdcv y1 xc, thr(0) deg(3)  ;	myic;   est store m3;
#d cr    // #d 表示 #delimit

*-對比迴歸結果
	local m "m1 m2 m3"
	esttab `m', mtitle(`m') b(%6.3f) t(%6.3f)  ///
		    s(N r2 r2_a AIC BIC) nogap compress

迴歸結果的 AIC 和 BIC 信息如下表格所示,我們會選擇 m2 ,即認爲二次型擬合是最優的。

線性 二次型 三次型
AIC 761.160 446.327 819.628
BIC 775.494 464.740 849.097

3.3 全局多項式迴歸

全局多項式迴歸是使用了樣本里所有數據來進行多項式迴歸。這在方法上,等價於局部迴歸分析裏將左右帶寬設置爲分配變量的最小值和最大值。從而可以同樣用上述命令來分析。需要注意的是,由於使用了全部樣本,全局斷點回歸分析可能存在較爲嚴重的內生性問題。本部分相應代碼如下:

			   
use "RDD_simu_data0.dta", clear    
sum xc
 local hvalueR=r(max)  
 local hvalueL= abs(r(min))
 
rdrobust y1 xc,   h(`hvalueL'  `hvalueR') //自動選擇階數
rdrobust y1 xc,   h(`hvalueL'  `hvalueR') p(2) //二階擬合
rdrobust y1 xc,   h(`hvalueL'  `hvalueR') p(3) //三階擬合

連享會計量方法專題……https://gitee.com/arlionn/Course

4. RDD有效性檢驗

4.1 局部平滑性的檢驗

對於局部平滑假設,是指除了結果變量,所有所有其它變量在斷點附近都不應該存在處理效應,也即沒有出現跳躍現象。在檢驗方法上,我們可以利用圖形直接觀察,也可以將每一個協變量作爲安慰劑結果變量 (placebo outcomes) ,使用斷點回歸方法進行檢驗。

graph3.png

本部分圖形檢驗和迴歸檢驗的代碼如下:

use "RDD_simu_data0.dta", clear
		
rdplot y1 xc  graph_options(title(z1平滑性檢驗)) 
	graph save rdz1_smooth,  replace
rdplot z2 xc  graph_options(title(z2平滑性檢驗))/           
    graph save rdz2_smooth,  replace

graph  combine rdz1_smooth.gph   rdz2_smooth.gph,    title("變量z1 & z2的平滑性檢驗") 

// 從圖形,似乎是存在跳躍的,但這並不嚴格,要看回歸結果 
rdrobust z1 xc
rdrobust z2 xc

兩個迴歸結果的p值分別 0.399 和 0.741 ,說明不能拒絕不存在斷點的假設,可知局部平滑假設滿足。

4.2 驅動變量不受人爲控制的檢驗

檢驗的思路在於,如果不存在人爲操控,那麼在斷點附近樣本的數量應該相近,才符合隨機性。我們可以用 rddensity 命令來檢驗斷點兩側樣本數量是否相近。本部分相應代碼如下所示,迴歸結的 p 值爲 0.195 ,不能拒絕斷點附近兩測樣本量大致相等的假設,可知驅動變量不受人爲控制的假設滿足。

use "RDD_simu_data0.dta", clear
		
rdrobust y1 xc
local h = e(h_l)   //獲取最優帶寬
rddensity xc, p(1) hl(`h') hr(`h')   

5. 穩健性檢驗

5.1 斷點的安慰劑檢驗

穩健性檢驗的一個自然而然的思路在於選擇一個不同於斷點的值作爲安慰劑斷點 (placcebo cutoff points) 。如果斷點回歸結果變得不顯著,則表明斷點的真實性。相應代碼分別取真實斷點兩側 20%、40%、60% 和 80% 樣本分位數處作爲斷點。作爲對比,我們也放入了真實斷點在圖形裏。如下圖所示,五 個placebo cutoffs 的迴歸係數都不顯著異於0,從而在這些點處不存在處理效應。

graph4.png

本部分相應代碼如下:


use "RDD_simu_data0.dta", clear
 sum xc
 local xcmax=r(max)
 local xcmin= r(min)

forvalues i=1(1)4{
local jr=`xcmax'/(`i'+1)
local jl=`xcmin'/(`i'+1)
rdrobust y1 xc if xc>0,c(`jr')
estimates store jl`i'
rdrobust y1 xc if xc<0,c(`jl')  
estimates store jr`i'
}

//加上真實斷點的迴歸結果,作爲benchmark結果
rdrobust y1 xc ,c(0)     
estimates store jbaseline

//輸出圖形
local vlist "jl1 jl2 jl3 jl4 jbaseline jr4 jr3 jr2 jr1  "
coefplot `vlist'  ,  yline(0) drop(_cons) vertical 

連享會計量方法專題……https://gitee.com/arlionn/Course

5.2 樣本選擇的敏感性檢驗

由於越接近斷點的樣本,越有動機去人爲操控,我們刪除最接近斷點的樣本,來觀察迴歸是否顯著(甜甜圈效應, donut hole approach )。如果仍舊存在,說明即使存在人爲操控,斷點效應仍舊存在。下面代碼裏,我們分別刪除了斷點附近 5%,10%,15%,25% 和 30% 的樣本,進行了 6 組穩健性檢驗。圖形給出了迴歸係數和 95% 的置信區間。可知,在刪除 20% 及以下時,迴歸結果都保持顯著。

graph5.png

本部分相應代碼如下:


use "RDD_simu_data0.dta", clear
sum xc
local xcmax=r(max)

forvalues i=1(1)6{
local j=`xcmax'*0.05*`i'
rdrobust y1 xc if abs(xc)>`j'
estimates store obrob`i'
}

//輸出圖形
local vlist "obrob1 obrob2 obrob3 obrob4 obrob5 obrob6  "
coefplot `vlist' , yline(0) drop(_cons) vertical 

5.3 帶寬選擇的敏感性檢驗

帶寬長度會顯著影響迴歸結果,一個穩健的結果要求對帶寬長度不那麼敏感。下面代碼裏,我們先通過rdrobust命令提取最優帶寬h,然後分別手動設置帶寬爲 h 的 25%-400% 倍,看回歸結果是否仍舊顯著。圖形給出了迴歸係數和95%的置信區間。可知,在最優帶寬 25%-400% 範圍內,迴歸結果保持顯著,說明結論較爲可靠。

graph6.png

本部分相應代碼如下:

use "RDD_simu_data0.dta", clear
rdrobust y1 xc     //自動選擇最優帶寬  
local h = e(h_l)   //獲取最優帶寬

forvalues i=1(1)8{
local hrobust=`h'*0.25*`i'
rdrobust y1 xc ,h(`hrobust')
estimates store hrob`i'
}

//輸出圖形
local vlist "hrob1 hrob2 hrob3 hrob4 hrob5 hrob6 hrob7 hrob8  "
coefplot `vlist'  ,  yline(0) drop(_cons) vertical 

關於我們


歡迎加入Stata連享會(公衆號: StataChina)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章