線性迴歸一個重要的假設就是殘差沒有異方差性。簡單來講就是殘差的方差不會隨着響應變量的擬合值而增長。在本篇文章,我會解釋爲何檢測異方差性是重要的?如何檢測模型的異方差性?若是存在,如何經過R代碼來糾正這個問題。這個過程有時也被稱爲殘差分析。算法
一旦你創建線性迴歸模型,一般都要檢測殘差的異方差性。緣由是咱們想要檢測創建的模型可否解釋響應變量Y的一些模式,而它最終是顯示在殘差上的。若是存在異方差,獲得的迴歸模型是低效而且不穩定的,後面就有可能會獲得奇怪的預測結果。app
下面經過R內置的cars
數據集獲得的一個迴歸模型來作說明。首先經過lm()
函數來創建模型:函數
lmMod <- lm(dist ~ speed, data=cars) # initial model
如今,模型已經準備好了。下面經過兩種方式來檢測異方差:spa
圖形法翻譯
統計檢驗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