如何檢測異方差並糾正它?

線性迴歸一個重要的假設就是殘差沒有異方差性。簡單來講就是殘差的方差不會隨着響應變量的擬合值而增長。在本篇文章,我會解釋爲何檢測異方差性是重要的?如何檢測模型的異方差性?若是存在,如何經過R代碼來糾正這個問題。這個過程有時也被稱爲殘差分析算法

爲何檢測異方差很重要?

一旦你創建線性迴歸模型,一般都要檢測殘差的異方差性。緣由是咱們想要檢測創建的模型可否解釋響應變量Y的一些模式,而它最終是顯示在殘差上的。若是存在異方差,獲得的迴歸模型是低效而且不穩定的,後面就有可能會獲得奇怪的預測結果。app

如何檢測異方差?

下面經過R內置的cars數據集獲得的一個迴歸模型來作說明。首先經過lm()函數來創建模型:函數

lmMod <- lm(dist ~ speed, data=cars) # initial model

如今,模型已經準備好了。下面經過兩種方式來檢測異方差:spa

  1. 圖形法翻譯

  2. 統計檢驗code

圖形法 orm

par(mfrow=c(2,2)) # init 4 charts in 1 panel
plot(lmMod)

圖形以下:對象

咱們感興趣的是左上角和左下角的兩幅圖。左上角是殘差對擬合值做圖。而左下角是標準化殘差對擬合值做圖。若是徹底沒有異方差,你應該會看到一個徹底隨機的,點在整個X軸範圍內是均勻分佈的,而且獲得的是一條平坦的紅線。ip

但在這個案例中,從左上圖能夠看出紅線稍微有些彎曲,殘差彷佛隨着擬合值的增大而上升。所以,推測異方差是存在的。ci

統計檢驗

有時你可能須要一個算法來檢測異方差。以便自動的量化它的存在並做出修改。這裏有兩種檢驗方法來判斷異方差是否存在—Breush-Pagan檢驗和NCV檢驗。

Breush Pagan 檢驗

lmtest::bptest(lmMod)  # Breusch-Pagan test
    studentized Breusch-Pagan test

data:  lmMod
BP = 3.2149, df = 1, p-value = 0.07297

NCV檢驗

car::ncvTest(lmMod)  # Breusch-Pagan test
Non-constant Variance Score Test 
Variance formula: ~ fitted.values 
Chisquare = 4.650233    Df = 1     p = 0.03104933

在給定顯著性水平0.05的狀況下,這兩個檢驗的P值都很小。所以咱們能夠拒絕殘差的方差是恆定的零假設,並推斷出異方差確實是存在的,從而證明了上面的圖形推斷。

如何糾正異方差?

從新構建預測模型

變量變換,如Box-Cox變換

Box-Cox變換

Box-Cox變換是一種將變量轉化爲近似正態分佈的數學變換。一般狀況下,對Y變量作Box-Cox變換能夠解決這個問題,這正是我要作的。

library(caret)
distBCMod <- caret::BoxCoxTrans(cars$dist)
print(distBCMod)
Box-Cox Transformation

50 data points used to estimate Lambda

Input data summary:
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   2.00   26.00   36.00   42.98   56.00  120.00 

Largest/Smallest: 60 
Sample Skewness: 0.759 

Estimated Lambda: 0.5

由Box-Cox變換獲得的模型對象已經有了,如今把它應用到car$dist上並添加到一個新的數據框。

cars <- cbind(cars, dist_new=predict(distBCMod, cars$dist)) # append the transformed variable to cars
head(cars) # view the top 6 rows
  speed dist  dist_new
1     4    2 0.8284271
2     4   10 4.3245553
3     7    4 2.0000000
4     7   22 7.3808315
5     8   16 6.0000000
6     9   10 4.3245553

針對新的迴歸模型,變換後的數據已經有了。如今開始建立模型並檢查異方差。

lmMod_bc <- lm(dist_new ~ speed, data=cars)
bptest(lmMod_bc)
        studentized Breusch-Pagan test

data:  lmMod_bc
BP = 0.011192, df = 1, p-value = 0.9157

對於P值爲0.91,咱們不能拒絕零假設(殘差的方差是恆定的)。所以推斷殘差的方差是相同的。一樣地,用圖形來檢查下異方差。

plot(lmMod_bc)

圖形以下:

左上圖的線更加扁平而且殘差是均勻分佈的。所以,異方差的問題已經解決了。

本文由雪晴數據網負責翻譯整理,原文請參考How to detect heteroscedasticity and rectify it?做者Selva Prabhakaran。轉載請註明原文連接http://www.xueqing.cc/cms/article/113

相關文章
相關標籤/搜索