三、異常點
所謂的異常點一般指有着很大殘差(絕對值)的點,如果對模型的參數估計值影響出現了比例失衡,那麼我們稱之爲強影響點。爲了說明異常點與強影響點的判別,我們特意採用模擬的數據來證實它。
爲了簡單起見,我們採用一元模型來說明問題。
模擬數據:(模型:y=0.5+1.7*x+e)
x<-rexp(100,0.2)
e<-rnorm(100)
y<-0.5+1.7*x+e
我們來看看這個迴歸結果
lm(y~x)
輸出結果:
Call:
lm(formula= y ~ x)
Coefficients:
(Intercept) x
0.5489 1.7955
我們來改變其中的一個點:
y[50]<-0.7+0.2*x[50]+e[50]
那麼他是異常點嗎?這個改變畢竟不大,能被觀測出來嗎?我們可以先看看回歸係數發生了什麼樣的改變?
lm.reg1<-lm(y~x)
lm.reg1
Call:
lm(formula= y ~ x)
Coefficients:
(Intercept) x
0.3827 1.7404
我們通過qq圖進行初步判斷:
顯然初步判斷它沒有成爲一個異常點。我們也可以通過car包裏的outlierTest()來判斷。
outlierTest(lm.reg1)
輸出結果:
NoStudentized residuals with Bonferonni p < 0.05
Largest|rstudent|:
rstudent unadjusted p-value Bonferonni p
36 2.285984 0.024431 NA
也就是說沒有異常點,其中殘差最大的點是36號點。這也告訴我們不是所有的不合模型的偏差都會歸結爲異常點。
我們來製造一個異常點且爲強影響點並且運用outliertest()分析它。
y[100]<-3+5.8*x[100]+2*e[100]
lm.reg<-lm(y~x)
outlierTest(lm.reg)
輸出結果:
rstudent unadjusted p-value Bonferonni p
100 27.85628 4.4912e-48 4.4912e-46
我們還是可以通過qq圖來直視這個結果:
100號點實在太明顯了。
接下來,我們來討論100號點是否爲強影響點?我們先看回歸模型:
lm.reg
Call:
lm(formula= y ~ x)
Coefficients:
(Intercept) x
0.6027 1.7503
截距項變化明顯,那麼它是強影響點無疑。但是我們不知道真實模型呢?我們使用cook距離來判斷。一般來說cook距離大於4/(n-k-1),則表明其爲強影響點,其中n爲觀測數,k爲變量數。
在R中輸入命令:
cooks.distance(lm.reg)
可以得到cook距離,在輸入:
result<-cooks.distance(lm.reg)
result[cooks.distance(lm.reg)>4/(100-1-1)]
輸出結果:
100
0.4524937
可以發現只有100號點爲強影響點。作圖來看:
(繪圖代碼:
cook<-4/(100-1-1)
plot(lm.reg,which=4,cook.levels=cook)
abline(h=cook,lty=2,col=2)
)
我們還可以使用influencePlot()將異常點繪入圖中:
influencePlot(lm.reg)
上圖爲影響圖。縱座標超過+2或小於-2可認爲是異常點,水平軸超過0.2或0.3有高槓杆值,圓圈越大的點越可能是強影響點。
圖中有標號的數據爲:
StudRes Hat CookD
47 -0.4933677 0.04839400 0.07897794
53 0.1907168 0.09983013 0.04513239
64 -0.7393266 0.02657122 0.08657289
71 -0.4238429 0.14366355 0.12327255
98 0.4161791 0.04972515 0.06760339
100 27.8562847 0.01028211 0.67267654
我們最後以state數據來做一幅影響圖(續二中的例子)來判斷二中的結論是否正確。
四、迴歸模型的改進
對於強影響點我們的處理異常的簡單,在迴歸時去掉它。但是我們必須注意的是對於異常點除非記錄有誤外都應當仔細對待,認真分析原因。記住:我們最偉大的進步一般都源於異於先驗認知的東西。在計量中這點尤爲重要。
對於復共線性,我們一般採用嶺迴歸或主成分迴歸來解決它。
對於異方差性,我們可以使用box-cox變換來處理它。
這兩個的具體例子分別參見《迴歸分析作業2》、《迴歸分析作業3》。在《R in action》一書中還提及了car包中的三個函數powerTransform(),boxTidwell(),spreadLevelPlot()來改善線性性與異方差性。我們還是以作業3中的例子來運用這幾個函數。
library(xlsx)
workbook<-"D:/R/data/3-15.xlsx"
mydataframe<-read.xlsx(workbook,1)
lm.reg2<-lm(Y~X,data=mydataframe)
spreadLevelPlot(lm.reg2)
輸出結果:
Suggested power transformation: 0.3641616
說明異方差性還是明顯的。
在R中輸入以下代碼:
library(xlsx)
workbook<-"D:/R/data/3-15.xlsx"
mydataframe<-read.xlsx(workbook,1)
lm.reg2<-lm(Y~X,data=mydataframe)
spreadLevelPlot(lm.reg2)
library(MASS)
boxcox(lm.reg2,lambda= seq(-1, 1, length = 50))
which.max(box$y)
box$x[77]
summary(powerTransform(mydataframe$Y))
boxTidwell(Y~X,data=mydataframe)
輸出結果:
>which.max(box$y)
[1] 77
>box$x[77]
[1] 0.5353535
>summary(powerTransform(mydataframe$Y))
bcPowerTransformation to Normality
Est.Power Std.Err. Wald Lower Bound Wald Upper Bound
mydataframe$Y 0.2773 0.1399 0.003 0.5516
Likelihoodratio tests about transformation parameters
LRT df pval
LR test,lambda = (0) 3.942405 1 4.708342e-02
LR test,lambda = (1) 25.999924 1 3.414308e-07
>boxTidwell(Y~X,data=mydataframe)
Score Statistic p-value MLE of lambda
1.529055 0.1262507 1.517633
iterations = 4
這裏三個變換得到的結果並不一致,powerTransform()給出的變幻是u=y^0.2773,boxcox()給出的變換是u=y^ 0.5353535,,boxTidwell()認爲將x變換爲z=x^1.517633線性性會有很好的改善。但是我們觀察boxcox給出的圖我們也很清楚的看到這三個結果都是可接受的,最後得到的結果都可以使得線性性極大地提高。至於選擇哪一個,我們得從數據本身出發來通過舍入得到答案。還有變量除了冪次變換,logit變換,對數變換都是常用的。
最後提醒一下,謹慎對待變量變換,畢竟我們的迴歸並不一定以提高R^2爲目的,特別是在經濟學中。
引用《R in action》中的一段話來作爲本節的結束:
The decision regarding when to try to improve the fit of an OLS regression model and when to try a different approach, is a complex one. It’s typically based on knowledge of the subject matter and an assessment of which approach will provide the best result.
五、迴歸的變量選擇
變量選擇是個非常有意思的話題,嶺迴歸,lasso都是在變量選擇上可以使用的方法,我們今天不提他們,僅介紹《線性統計模型》一書中提到的兩種方法:逐步迴歸與全子集迴歸。例子參見《迴歸分析作業4》
我們只補充介紹car包中的subsets()函數。其調用格式爲:
subsets(object,
names=abbreviate(object$xnames, minlength = abbrev),
abbrev=1, min.size=1, max.size=length(names), legend,
statistic=c("bic", "cp", "adjr2","rsq", "rss"),
las=par('las'), cex.subsets=1, ...)
它支持各種準則的子集迴歸判斷。比逐步迴歸的step函數要好一些。大部分情況下,全子集迴歸要優於逐步迴歸,但是大量預測變量時他會變得很慢。