採用最小二乘法進行線性回歸時,需要滿足特定的條件:
正態性:一定範圍內,給定任意x值,對應的y均服從正態分布
獨立:即誤差項間不存在相關,一般時間序列數據會存在自相關
線性:因變量和自變量有線性關係
同方差性:即模型誤差項的方差相等。
這些假設都與誤差項有關,所以我們可以從誤差的估計量殘差來解決,即我們常用到的殘差分析、殘差圖等。殘差圖就是以某種殘差(殘差、標準化殘差、學生化殘差等)為縱坐標,以任何其他的量為橫軸的散點圖,如果數據能較好滿足回歸條件,那麼殘差圖會是一個在水平線周圍隨機均勻分布的散點圖。另外我們也可通過假設檢驗的手段進行回歸診斷。
殘差圖診斷
1.正態性:如果滿足此條件,那麼殘差值將服從正態分布。可以採用殘差的qq圖來判斷
2.線性:可以採用殘差和預測值散點圖,如果滿足線性,那麼殘差值與預測值沒有任何關聯。
3.同方差性:可以看學生化殘差圖和預測值的散點圖,如果滿足同方差性假設,那麼散點大致落在±2的區域,且不呈任何趨勢。
對於回歸中的殘差診斷圖,SAS程序會自動生成並展示在結果裡。
假設檢驗診斷:
正太性:可以輸出殘差,使用univariate過程步進行正態檢驗。或者使用transreg過程box-cox轉換方法
同方差性:SAS裡提供white檢驗和bp法。
線性:可以使用網上的boxTdiwell變換的宏程序。該宏的運行還需使用另外一個gskip宏程序才能運行。兩個宏程序下載地址:
boxTdiwell:http://www.datavis.ca/sas/macros/boxtid.sas
gskip:http://www.datavis.ca/sas/macros/util/gskip.sas
自相關:DW檢驗,SAS程序裡加入dw選項,後文不再介紹
下面我們使用sashelp.class的數據擬合一個簡單線性回歸模型進行說明。
擬合模型:
proc reg data=sashelp.class; model height=age;run;
一、SAS生成的部分診斷圖(rstudent為學生化殘差):可以看出基本滿足回歸條件
二、假設檢驗診斷程序:
1.正態性
程序:
*正態box-cox變換;proc transreg data=sashelp.class test; model BoxCox(height) = identity(age);run;
結果:
可以看到參數lambda=1(lamabda=1表示不轉換,lambda=0時表示對因變量進行對數轉換,轉換的規則為y的lambda次方)在95%的置信區間內,可以認為滿足正態的條件,不考慮進行轉換。如果轉換,lambda的值可以考慮取紅色方塊的值。
2.線性
程序:
*載入兩個宏程序,boxTidwell線性檢驗與轉換;%INCLUDE "C:\Users\Administrator\Desktop\boxTidwell.sas";%INCLUDE "C:\Users\Administrator\Desktop\gskip.sas";%boxtid(data=sashelp.class,yvar=height,xvar=age,xtrans=age,id=name)
結果:
可以看出結果p=0.7282,可以認為滿足線性,如果p<0.05,則使用power的值對自變量進行轉換,因為power的值接近-0.5,所以它建議使用-0.5次方(0.5次方即開根號)進行轉換,該處理方法也適用於上。
3.同方差性
程序:
*parms語句指定係數,const為常數項,beta為age回歸係數,white為white檢驗,breusch為bp檢驗,括號1代表截距,age代表自變量;proc model data=sashelp.class; parms const beta; height=const+age*beta; fit height /white breusch=(1 age);run;quit;
結果:可以看出兩種方法都表示滿足同方差性。
另外在R軟體裡有更多的關於回歸診斷的函數,我們可以在SAS裡調用R軟體來幫助我們判斷。程序如下:
*開啟調用R的選項;proc options option=rlang;run;*iml模塊調用R;proc iml; run exportdatasettoR("sashelp.class", "test"); *將sas數據導入到R裡; submit/r; *開始調用R; #R裡的car包有很多做診斷的函數,可以對模型進行線性、正態性、同方差性等檢驗 library(car) mod = lm(Height ~ Age, data = test) #基礎包plot()函數可以生成4幅診斷圖 plot(mod) #qqPlot()函數可以對正態性檢驗,如果不滿足,可以使用powerTransform()函數對因變量進行box-cox正態轉換 summary(powerTransform(mod)) #boxTidwell()函數對模型進行線性檢驗,並給出自變量轉換參數來讓模型滿足線性 boxTidwell(Height ~ Age, data = test) #ncvTest()函數對模型進行同方差檢驗,spreadLevelPlot()可以對不滿足同方差模型提供因變量轉換參數 ncvTest(mod) spreadLevelPlot(mod) endsubmit; *結束調用;quit;
結果: