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

子華發表於2016-01-15

線性迴歸一個重要的假設就是殘差沒有異方差性。簡單來說就是殘差的方差不會隨著響應變數的擬合值而增加。在本篇文章,我會解釋為什麼檢測異方差性是重要的?如何檢測模型的異方差性?如果存在,如何通過R程式碼來糾正這個問題。這個過程有時也被稱為殘差分析。

為什麼檢測異方差很重要?

一旦你建立線性迴歸模型,通常都要檢測殘差的異方差性。原因是我們想要檢測建立的模型能否解釋響應變數Y的一些模式,而它最終是顯示在殘差上的。如果存在異方差,得到的迴歸模型是低效並且不穩定的,後面就有可能會得到奇怪的預測結果。

如何檢測異方差?

下面通過R內建的cars資料集得到的一個迴歸模型來做說明。首先通過lm()函式來建立模型: lmMod <- lm(dist ~ speed, data=cars) # initial model 現在,模型已經準備好了。下面通過兩種方式來檢測異方差: 1.圖形法 2.統計檢驗

圖形法 par(mfrow=c(2,2)) # init 4 charts in 1 panel plot(lmMod) 圖形如下: enter image description here 我們感興趣的是左上角和左下角的兩幅圖。左上角是殘差對擬合值作圖。而左下角是標準化殘差對擬合值作圖。如果完全沒有異方差,你應該會看到一個完全隨機的,點在整個X軸範圍內是均勻分佈的,並且得到的是一條平坦的紅線。

但在這個案例中,從左上圖可以看出紅線稍微有些彎曲,殘差似乎隨著擬合值的增大而上升。因此,推測異方差是存在的。

統計檢驗

有時你可能需要一個演算法來檢測異方差。以便自動的量化它的存在並作出修改。這裡有兩種檢驗方法來判斷異方差是否存在—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) 圖形如下: enter image description here 左上圖的線更加扁平並且殘差是均勻分佈的。因此,異方差的問題已經解決了。

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

相關文章