R語言與迴歸分析學習筆記(應用迴歸小結)(2)

三、異常點

        所謂的異常點一般指有着很大殘差(絕對值)的點,如果對模型的參數估計值影響出現了比例失衡,那麼我們稱之爲強影響點。爲了說明異常點與強影響點的判別,我們特意採用模擬的數據來證實它。

       爲了簡單起見,我們採用一元模型來說明問題。

       模擬數據:(模型: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函數要好一些。大部分情況下,全子集迴歸要優於逐步迴歸,但是大量預測變量時他會變得很慢。

發佈了53 篇原創文章 · 獲贊 97 · 訪問量 70萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章