R做多元線性回歸全攻略

R中的線性回歸函數(shù)比較簡單,就是lm(),比較復(fù)雜的是對線性模型的診斷和調(diào)整。這里結(jié)合Statistical Learning和杜克大學(xué)的Data Analysis and Statistical Inference的章節(jié)以及《R語言實戰(zhàn)》的OLS(Ordinary Least Square)回歸模型章節(jié)來總結(jié)一下,診斷多元線性回歸模型的操作分析步驟。

1、選擇預(yù)測變量

因變量比較容易確定,多元回歸模型中難在自變量的選擇。自變量選擇主要可分為向前選擇(逐次加使RSS最小的自變量),向后選擇(逐次扔掉p值最大的變量)。個人傾向于向后選擇法,一來p值比較直觀,模型返回結(jié)果直接給出了各變量的p值,卻沒有直接給出RSS;二來當(dāng)自變量比較多時,一個個加比較麻煩。

Call:
lm(formula = Sales ~ . + Income:Advertising + Age:Price, data = Carseats)
Residuals:
Min      1Q  Median      3Q     Max
-2.9208 -0.7503  0.0177  0.6754  3.3413
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept)         6.5755654  1.0087470   6.519 2.22e-10 ***
CompPrice           0.0929371  0.0041183  22.567  < 2e-16 ***
Income              0.0108940  0.0026044   4.183 3.57e-05 ***
Advertising         0.0702462  0.0226091   3.107 0.002030 **
Population          0.0001592  0.0003679   0.433 0.665330
Price              -0.1008064  0.0074399 -13.549  < 2e-16 ***
ShelveLocGood       4.8486762  0.1528378  31.724  < 2e-16 ***
ShelveLocMedium     1.9532620  0.1257682  15.531  < 2e-16 ***
Age                -0.0579466  0.0159506  -3.633 0.000318 ***
Education          -0.0208525  0.0196131  -1.063 0.288361
UrbanYes            0.1401597  0.1124019   1.247 0.213171
USYes              -0.1575571  0.1489234  -1.058 0.290729
Income:Advertising  0.0007510  0.0002784   2.698 0.007290 **
Price:Age           0.0001068  0.0001333   0.801 0.423812
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1.011 on 386 degrees of freedom
Multiple R-squared:  0.8761,    Adjusted R-squared:  0.8719
F-statistic:   210 on 13 and 386 DF,  p-value: < 2.2e-16

構(gòu)建一個回歸模型后,先看F統(tǒng)計量的p值,這是對整個模型的假設(shè)檢驗,原假設(shè)是各系數(shù)都為0,如果連這個p值都不顯著,無法證明至少有一個自變量對因變量有顯著性影響,這個模型便不成立。然后看Adjusted R2,每調(diào)整一次模型,應(yīng)該力使它變大;Adjusted R2越大說明模型中相關(guān)的自變量對因變量可解釋的變異比例越大,模型的預(yù)測性就越好。

構(gòu)建了線性模型后,如果是一元線性回歸,可以畫模型圖初步判斷一下線性關(guān)系(多元回歸模型不好可視化):

par(mfrow=c(1,1))
plot(medv~lstat,Boston)
fit1=lm(medv~lstat,data=Boston)
abline(fit1,col="red")

2、模型診斷


確定了回歸模型的自變量并初步得到一個線性回歸模型,并不是直接可以拿來用的,還要進行驗證和診斷。診斷之前,先回顧多元線性回歸模型的假設(shè)前提(by Data Analysis and Statistical Inference):

(數(shù)值型)自變量要與因變量有線性關(guān)系;

殘差基本呈正態(tài)分布;

殘差方差基本不變(同方差性);

殘差(樣本)間相關(guān)獨立。

一個好的多元線性回歸模型應(yīng)當(dāng)盡量滿足這4點假設(shè)前提。

用lm()構(gòu)造一個線性模型fit后,plot(fit)即可返回4張圖(可以par(mfrow=c(2,2))一次展現(xiàn)),這4張圖可作初步檢驗:


左上圖用來檢驗假設(shè)1,如果散點看不出什么規(guī)律,則表示線性關(guān)系良好,若有明顯關(guān)系,則說明非線性關(guān)系明顯。右上圖用來檢驗假設(shè)2,若散點大致都集中在QQ圖中的直線上,則說明殘差正態(tài)性良好。左下圖用來檢驗假設(shè)3,若點在曲線周圍隨機分布,則可認為假設(shè)3成立;若散點呈明顯規(guī)律,比如方差隨均值而增大,則越往右的散點上下間距會越大,方差差異就越明顯。假設(shè)4的獨立性無法通過這幾張圖來檢驗,只能通過數(shù)據(jù)本身的來源的意義去判斷。

右下圖是用來檢驗異常值。異常值與三個概念有關(guān):

離群點:y遠離散點主體區(qū)域的點

杠桿點:x遠離散點主體區(qū)域的點,一般不影響回歸直線的斜率

強影響點:影響回歸直線的斜率,一般是高杠桿點。

對于多元線性回歸,高杠桿點不一定就是極端點,有可能是各個變量的取值都正常,但仍然偏離散點主體。

對于異常值,可以謹慎地刪除,看新的模型是否效果更好。


《R語言實戰(zhàn)》里推薦了更好的診斷方法,總結(jié)如下。

1、多元線性回歸假設(shè)驗證:

gvlma包的gvlma()函數(shù)可對擬合模型的假設(shè)作綜合驗證,并對峰度、偏度進行驗證。

states <- as.data.frame(state.x77[, c("Murder", "Population",
"Illiteracy", "Income", "Frost")])
fit <- lm(Murder ~ Population + Illiteracy + Income +
Frost, data = states)
library(gvlma)
gvmodel <- gvlma(fit)
summary(gvmodel)
Call:
gvlma(x = fit)
Value p-value                Decision
Global Stat        2.7728  0.5965 Assumptions acceptable.
Skewness           1.5374  0.2150 Assumptions acceptable.
Kurtosis           0.6376  0.4246 Assumptions acceptable.
Link Function      0.1154  0.7341 Assumptions acceptable.
Heteroscedasticity 0.4824  0.4873 Assumptions acceptable.

最后的Global Stat是對4個假設(shè)條件進行綜合驗證,通過了即表示4個假設(shè)驗證都通過了。最后的Heterosceasticity是進行異方差檢測。注意這里假設(shè)檢驗的原假設(shè)都是假設(shè)成立,所以當(dāng)p>0.05時,假設(shè)才能能過驗證。

如果綜合驗證不通過,也有其他方法對4個假設(shè)條件分別驗證:

線性假設(shè)

library(car)
crPlots(fit)

返回的圖是各個自變量與殘差(因變量)的線性關(guān)系圖,若存著明顯的非線性關(guān)系,則需要對自變量作非線性轉(zhuǎn)化。書中說這張圖表明線性關(guān)系良好。

正態(tài)性

library(car)
qqPlot(fit,labels = row.names(states),id.method = "identify",simulate = TRUE,main = "Q-Q Plot")

qqPlot()可以生成交互式的qq圖,選中異常點,就返回該點的名稱。該圖中除了Nevad點,其他點都在直線附近,可見正態(tài)性良好。

同方差性

library(car)
ncvTest(fit)
Non-constant Variance Score Test
Variance formula: ~ fitted.values
Chisquare = 1.746514    Df = 1     p = 0.1863156

p值大于0.05,可認為滿足方差相同的假設(shè)。

獨立性

library(car)
durbinWatsonTest(fit)
lag Autocorrelation D-W Statistic p-value
1? ? ? -0.2006929? ? ? 2.317691?  0.258
Alternative hypothesis: rho != 0

p值大于0.05,可認為誤差之間相互獨立。

除了以上4點基本假設(shè),還有其他方面需要進行診斷——

2、多重共線性

理想中的線性模型各個自變量應(yīng)該是線性無關(guān)的,若自變量間存在共線性,則會降低回歸系數(shù)的準(zhǔn)確性。一般用方差膨脹因子VIF(Variance Inflation Factor)來衡量共線性,《統(tǒng)計學(xué)習(xí)》中認為VIF超過5或10就存在共線性,《R語言實戰(zhàn)》中認為VIF大于4則存在共線性。理想中的線性模型VIF=1,表完全不存在共線性。

library(car)
vif(fit)
Population Illiteracy     Income      Frost
1.245282   2.165848   1.345822   2.082547

可見這4個自變量VIF都比較小,可認為不存在多重共線性的問題。

3、異常值檢驗

離群點

離群點有三種判斷方法:一是用qqPlot()畫QQ圖,落在置信區(qū)間(上圖中兩條虛線)外的即可認為是離群點,如上圖中的Nevad點;一種是判斷學(xué)生標(biāo)準(zhǔn)化殘差值,絕對值大于2(《R語言實戰(zhàn)》中認為2,《統(tǒng)計學(xué)習(xí)》中認為3)的可認為是離群點。

plot(x=fitted(fit),y=rstudent(fit))
abline(h=3,col="red",lty=2)
abline(h=-3,col="red",lty=2)
which(abs(rstudent(fit))>3)
Nevada
28

還有一種方法是利用car包里的outlierTest()函數(shù)進行假設(shè)檢驗:

library(car)
outlierTest(fit)
rstudent unadjusted p-value Bonferonni p
Nevada 3.542929         0.00095088     0.047544

這個函數(shù)用來檢驗最大的標(biāo)準(zhǔn)化殘差值,如果p>0.05,可以認為沒有離群點;若p<0.05,則該點是離群點,但不能說明只有一個離群點,可以把這個點刪除之后再作檢驗。第三種方法可以與第二種方法結(jié)合起來使用。

高杠桿點

高杠桿值觀測點,即是與其他預(yù)測變量有關(guān)的離群點。換句話說,它們是由許多異常的預(yù)測變量值組合起來的,與響應(yīng)變量值沒有關(guān)系。《統(tǒng)計學(xué)習(xí)》中給出了一個杠桿統(tǒng)計量,《R語言實戰(zhàn)》中給出了一種具體的操作方法。(兩本書也稍有出入,《統(tǒng)計學(xué)習(xí)》中平均杠桿值為(p+1)/n,而在《R語言實戰(zhàn)》中平均杠桿值為p/n;事實上在樣本量n比較大時,幾乎沒有差別。)

hat.plot <- function(fit){
p <- length(coefficients(fit))
n <- length(fitted(fit))
plot(hatvalues(fit),main = "Index Plot of Hat Values")
abline(h=c(2,3)*p/n,col="red",lty=2)
identify(1:n, hatvalues(fit), names(hatvalues(fit)))  #這句產(chǎn)生交互效果,選中某個點后,關(guān)閉后返回點的名稱
}
hat.plot(fit)

超過2倍或3倍的平均杠桿值即可認為是高杠桿點,這里把Alaska和California作為高杠桿點。

強影響點

強影響點是那種若刪除則模型的系數(shù)會產(chǎn)生明顯的變化的點。一種方法是計算Cook距離,一般來說, Cook’s D值大于4/(n-k -1),則表明它是強影響點,其中n 為樣本量大小, k 是預(yù)測變量數(shù)目。

cutoff <- 4/(nrow(states-length(fit$coefficients)-2)) #coefficients加上了截距項,因此要多減1
plot(fit,which=4,cook.levels = cutoff)
abline(h=cutoff,lty=2,col="red")

實際上這就是前面診斷的4張圖之一,語句還是plot(fit),which=4表示指定第4張圖,cook.levels可設(shè)定標(biāo)準(zhǔn)值。紅色虛線以上就返回了強影響點。

car包里的influencePlot()函數(shù)能一次性同時檢查離群點、高杠桿點、強影響點。

library(car)?
influencePlot(fit,id.method = "identity", main="Influence Plot",
sub="Circle size is proportional to Cook's distance")
StudRes        Hat     CookD
Alaska 1.753692 0.43247319 0.4480510
Nevada 3.542929 0.09508977 0.2099157

縱坐標(biāo)超過+2或小于-2的點可被認為是離群點,水平軸超過0.2或0.3的州有高杠桿值(通常為預(yù)測值的組合)。圓圈大小與影響成比例,圓圈很大的點可能是對模型參數(shù)的估計造成的不成比例影響的強影響點。

3、模型調(diào)整

到目前為止,《統(tǒng)計學(xué)習(xí)》中提到的多元線性回歸模型潛在的問題,包括4個假設(shè)不成立、異常值、共線性的診斷方法在上面已經(jīng)全部得到解決。這里總結(jié)、延伸《R語言實戰(zhàn)》里提到的調(diào)整方法——

刪除觀測點

對于異常值一個最簡單粗暴又高效的方法就是直接刪除,不過有兩點要注意。一是當(dāng)數(shù)據(jù)量大的時候可以這么做,若數(shù)據(jù)量較小則應(yīng)慎重;二是根據(jù)數(shù)據(jù)的意義判斷,若明顯就是錯誤就可以直接刪除,否則需判斷是否會隱藏著深層的現(xiàn)象。

另外刪除觀測點后要與刪除之前的模型作比較,看模型是否變得更好。

變量變換

?

在進行非線性變換之前,先看看4個假設(shè)是否成立,如果成立可以不用變換;沒必要追求更好的擬合效果而把模型搞得太復(fù)雜,這有可能出現(xiàn)過擬合現(xiàn)象。如果連假設(shè)檢驗都不通過,可以通過變量變換來調(diào)整模型。這里只討論線性關(guān)系不佳的情況,其他情況遇到了再說。

(1)多項式回歸

如果殘差圖中呈現(xiàn)明顯的非線性關(guān)系,可以考慮對自變量進行多項式回歸。舉一個例子:

library(MASS)
library(ISLR)
fit1=lm(medv~lstat,data=Boston)
plot(fit1,which = 1)

可以看到這個一元線性回歸模型的殘差圖中,散點的規(guī)律還是比較明顯,說明線性關(guān)系較弱。

fit1_1 <- lm(medv~poly(lstat,2),data = Boston)
plot(fit1_1,which = 1)

將自變量進行2次多項式回歸后,發(fā)現(xiàn)現(xiàn)在的殘差圖好多了,散點基本無規(guī)律,線性關(guān)系較明顯。

再看看兩個模型的整體效果——

summary(fit1)
summary(fit1_1)

可見多項式回歸的模型Adjusted R2也增大了,模型的解釋性也變強了。

多項式回歸在《統(tǒng)計學(xué)習(xí)》后面的非線性模型中還會提到,到時候再討論。

(2)Box-Tidwell變換

car包中的boxTidwell() 函數(shù)通過獲得預(yù)測變量冪數(shù)的最大似然估計來改善線性關(guān)系。

library(car)
boxTidwell(Murder~Population+Illiteracy,data=states)
Score Statistic   p-value MLE of lambda
Population      -0.3228003 0.7468465     0.8693882
Illiteracy       0.6193814 0.5356651     1.3581188
iterations =  19
#這里看lambda,表示各個變量的冪次數(shù)
lmfit <- lm(Murder~Population+Illiteracy,data=states)
lmfit2 <- lm(Murder~I(Population^0.87)+I(Illiteracy^1.36),data=states)
plot(lmfit,which = 1)
plot(lmfit2,which = 1)
summary(lmfit)
summary(lmfit2)

可以發(fā)現(xiàn)殘差圖和Adjusted R2的提升都甚微,因此沒有必要作非線性轉(zhuǎn)換。


4、模型分析

(1)模型比較

前面只是簡單得用Adjusted R2來比較模型,《R語言實戰(zhàn)》里介紹了可以用方差分析來比較嵌套模型(即它的一些項完全包含在另一個模型中)有沒有顯著性差異。方差分析的思想是:如果線性模型y~x1+x2+x3與y~x1+x2沒有顯著性差異,若同時x3變量對模型也不顯著,那就沒必要加上變量x3。下面進行試驗:

aovfit1 <- lm(Murder~Population+Illiteracy+Income+Frost,data=states)
aovfit2 <- lm(Murder~Population+Illiteracy,data=states)
anova(aovfit1,aovfit2)
Analysis of Variance Table
Model 1: Murder ~ Population + Illiteracy + Income + Frost
Model 2: Murder ~ Population + Illiteracy
Res.Df    RSS Df Sum of Sq      F Pr(>F)
1     45 289.17
2     47 289.25 -2 -0.078505 0.0061 0.9939
summary(aovfit1)
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.235e+00  3.866e+00   0.319   0.7510
Population  2.237e-04  9.052e-05   2.471   0.0173 *
Illiteracy  4.143e+00  8.744e-01   4.738 2.19e-05 ***
Income      6.442e-05  6.837e-04   0.094   0.9253
Frost       5.813e-04  1.005e-02   0.058   0.9541
Residual standard error: 2.535 on 45 degrees of freedom
Multiple R-squared:  0.567,    Adjusted R-squared:  0.5285
F-statistic: 14.73 on 4 and 45 DF,  p-value: 9.133e-08
summary(aovfit2)
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.652e+00  8.101e-01   2.039  0.04713 *
Population  2.242e-04  7.984e-05   2.808  0.00724 **
Illiteracy  4.081e+00  5.848e-01   6.978 8.83e-09 ***
Residual standard error: 2.481 on 47 degrees of freedom
Multiple R-squared:  0.5668,    Adjusted R-squared:  0.5484
F-statistic: 30.75 on 2 and 47 DF,  p-value: 2.893e-09

Income和Frost兩個變量不顯著,兩個模型之間沒有顯著性差異,就可以不加這兩個變量。刪去這兩個不顯著的變量后,R2略微減少,Adjusted R2增大,這也符合二者的定義。

《R語言實戰(zhàn)》里還介紹到了用AIC(Akaike Information Criterion,赤池信息準(zhǔn)則)值來比較模型,AIC值越小的模型優(yōu)先選擇,原理不明。

aovfit1 <- lm(Murder~Population+Illiteracy+Income+Frost,data=states)
aovfit2 <- lm(Murder~Population+Illiteracy,data=states)
AIC(aovfit1,aovfit2)
df      AIC
aovfit1  6 241.6429
aovfit2  4 237.6565

第二個模型AIC值更小,因此選第二個模型(真是簡單粗暴)。注:ANOVA需限定嵌套模型,AIC則不需要??梢夾IC是更簡單也更實用的模型比較方法。

(2)變量選擇

這里的變量選擇與最開始的變量選擇同也不同,雖然是一回事,但一開始是一個粗略的變量的選擇,主要是為了構(gòu)建模型;這里則要進行細致的變量選擇來調(diào)整模型。

逐步回歸

前面提到的向前或向后選擇或者是同時向前向后選擇變量都是逐步回歸法。MASS包中的stepAIC() 函數(shù)可以實現(xiàn)逐步回歸模型(向前、向后和向前向后),依據(jù)的是精確AIC準(zhǔn)則。以下實例是向后回歸法:

library(MASS)
aovfit1 <- lm(Murder~Population+Illiteracy+Income+Frost,data=states)
stepAIC(aovfit1,direction = "backward")  # “forward”為向前選擇,"backward"為向后選擇,"both"為混合選擇
Start:  AIC=97.75
Murder ~ Population + Illiteracy + Income + Frost
Df Sum of Sq    RSS     AIC
- Frost       1     0.021 289.19  95.753
- Income      1     0.057 289.22  95.759
                    289.17  97.749
- Population  1    39.238 328.41 102.111
- Illiteracy  1   144.264 433.43 115.986
Step:  AIC=95.75
Murder ~ Population + Illiteracy + Income
Df Sum of Sq    RSS     AIC
- Income      1     0.057 289.25  93.763
                    289.19  95.753
- Population  1    43.658 332.85 100.783
- Illiteracy  1   236.196 525.38 123.605
Step:  AIC=93.76
Murder ~ Population + Illiteracy
Df Sum of Sq    RSS     AIC
                    289.25  93.763
- Population  1    48.517 337.76  99.516
- Illiteracy  1   299.646 588.89 127.311
Call:
lm(formula = Murder ~ Population + Illiteracy, data = states)
Coefficients:
(Intercept)   Population   Illiteracy
1.6515497    0.0002242    4.0807366

可見原本的4元回歸模型向后退了兩次,最終穩(wěn)定成了2元回歸模型,與前面模型比較的結(jié)果一致。

全子集回歸

《R語言實戰(zhàn)》里提到了逐步回歸法的局限:不是每個模型都評價了,不能保證選擇的是“最佳”模型。比如上例中,從Murder ~ Population + Illiteracy + Income + Frost到Murder ~ Population + Illiteracy + Income再到Murder~Population+Illiteracy雖然AIC值確實在減少,但Murder ~ Population + Illiteracy + Frost沒評價,如果遇到變量很多的情況下,逐步回歸只沿一個方向回歸,就有可能錯過最優(yōu)的回歸方向。

library(leaps)
leaps <- regsubsets(Murder~Population+Illiteracy+Income+Frost,data=states,nbest=4)
plot(leaps,scale = "adjr2")

橫坐標(biāo)是變量,縱坐標(biāo)是Adjusted R2,可見除截距項以外,只選定Population和Illiteracy這兩個變量,可以使線性模型有最大的Adjusted R2。

全子集回歸比逐步回歸范圍更廣,模型優(yōu)化效果更好,但是一旦變量數(shù)多了之后,全子集回歸迭代的次數(shù)就很多,就會很慢。

事實上,變量的選擇不是機械式地只看那幾個統(tǒng)計指標(biāo),更主要的是根據(jù)數(shù)據(jù)的實際意義,從業(yè)務(wù)角度上來選擇合適的變量。

線性模型變量的選擇在《統(tǒng)計學(xué)習(xí)》后面的第6章還會繼續(xù)講到,到時繼續(xù)綜合討論。

(3)交互項

交互項《統(tǒng)計學(xué)習(xí)》中花了一定篇幅來描寫,但在《R語言實戰(zhàn)》是在方差分析章節(jié)中討論。添加變量間的交互項有時可以改善線性關(guān)系,提高Adjusted R2。針對數(shù)據(jù)的實際意義,如果兩個基本上是獨立的,也很難產(chǎn)生交互、產(chǎn)生協(xié)同效應(yīng)的變量,那就不必考慮交互項;只有從業(yè)務(wù)角度分析,有可能產(chǎn)生協(xié)同效應(yīng)的變量間才考慮交互項。

涉及到交互項有一個原則:如果交互項是顯著的,那么即使變量不顯著,也要放在回歸模型中;若變量和交互項都不顯著,則可以都不放。

(4)交叉驗證

Andrew Ng的Machine Learning中就提到了,模型對舊數(shù)據(jù)擬合得好不一定就對新數(shù)據(jù)預(yù)測得好。因此一個數(shù)據(jù)集應(yīng)當(dāng)被分兩訓(xùn)練集和測試集兩部分(或者訓(xùn)練集、交叉驗證集、測試集三部分),訓(xùn)練好的模型還要在新數(shù)據(jù)中測試性能。

所謂交叉驗證,即將一定比例的數(shù)據(jù)挑選出來作為訓(xùn)練樣本,另外的樣本作保留樣本,先在訓(xùn)練樣本上獲取回歸方程,然后在保留樣本上做預(yù)測。由于保留樣本不涉及模型參數(shù)的選擇,該樣本可獲得比新數(shù)據(jù)更為精確的估計。

在k 重交叉驗證中,樣本被分為k個子樣本,輪流將k-1個子樣本組合作為訓(xùn)練集,另外1個子樣本作為保留集。這樣會獲得k 個預(yù)測方程,記錄k 個保留樣本的預(yù)測表現(xiàn)結(jié)果,然后求其平均值。

bootstrap包中的crossval()函數(shù)可以實現(xiàn)k重交叉驗證。

shrinkage <- function(fit, k = 10) {
require(bootstrap)
# define functions
theta.fit <- function(x, y) {
lsfit(x, y)
}
theta.predict <- function(fit, x) {
cbind(1, x) %*% fit$coef
}
# matrix of predictors
x <- fit$model[, 2:ncol(fit$model)]
# vector of predicted values
y <- fit$model[, 1]
results <- crossval(x, y, theta.fit, theta.predict, ngroup = k)
r2 <- cor(y, fit$fitted.values)^2
r2cv <- cor(y, results$cv.fit)^2
cat("Original R-square =", r2, "\n")
cat(k, "Fold Cross-Validated R-square =", r2cv, "\n")
cat("Change =", r2 - r2cv, "\n")
}

這個自定義的shrinkage()函數(shù)用來做k重交叉驗證,比計算訓(xùn)練集和交叉驗證集的R方差異。這個函數(shù)里涉及到一個概念:復(fù)相關(guān)系數(shù)。復(fù)相關(guān)系數(shù)實際上就是y和fitted(y)的簡單相關(guān)系數(shù)。對于一元線性回歸,R2就是簡單相關(guān)系數(shù)的平方;對于多元線性回歸,R2是復(fù)相關(guān)系數(shù)的平方。這個我沒有成功地從公式上推導(dǎo)證明成立,就記下吧。這個方法用到了自助法的思想,這個在統(tǒng)計學(xué)習(xí)后面會細致講到。

fit <- lm(Murder ~ Population + Income + Illiteracy +
Frost, data = states)
shrinkage(fit)
Original R-square = 0.5669502
10 Fold Cross-Validated R-square = 0.441954
Change = 0.1249963

可見這個4元回歸模型在交叉驗證集中的R2下降了0.12之多。若換成前面分析的2元回歸模型——

fit2 <- lm(Murder ~ Population  + Illiteracy , data = states)
shrinkage(fit2)
Original R-square = 0.5668327
10 Fold Cross-Validated R-square = 0.517304
Change = 0.04952868

這次R2下降只有約0.05。R2減少得越少,則預(yù)測得越準(zhǔn)確。

5、模型應(yīng)用

(1)預(yù)測

最重要的應(yīng)用毫無疑問就是用建立的模型進行預(yù)測了。構(gòu)建好模型后,可用predict()函數(shù)進行預(yù)測——

fit2 <- lm(Murder ~ Population  + Illiteracy , data = states)
predict(fit2,
newdata = data.frame(Population=c(2000,3000),Illiteracy=c(1.7,2.2)),
interval = "confidence")
fit      lwr      upr
1  9.037174 8.004911 10.06944
2 11.301729 9.866851 12.73661

這里newdata提供了兩個全新的點供模型來預(yù)測。還可以用interval指定返回置信區(qū)間(confidence)或者預(yù)測區(qū)間(prediction),這也反映了統(tǒng)計與機器學(xué)習(xí)的一個差異——可解釋性。注意置信區(qū)間考慮的是平均值,而預(yù)測區(qū)間考慮的是單個觀測值,所以預(yù)測區(qū)間永遠比置信區(qū)間廣,因此預(yù)測區(qū)間考慮了單個觀測值的不可約誤差;而平均值同時也把不可約誤差給抵消掉了。

(2)相對重要性

有的時候需要解釋模型中各個自變量對因變量的重要程度,簡單處理可以直接看系數(shù)即可,《R語言實戰(zhàn)》里自定義了一個relweights()函數(shù)可以計算各個變量的權(quán)重:

relweights <- function(fit, ...) {
R <- cor(fit$model)
nvar <- ncol(R)
rxx <- R[2:nvar, 2:nvar]
rxy <- R[2:nvar, 1]
svd <- eigen(rxx)
evec <- svd$vectors
ev <- svd$values
delta <- diag(sqrt(ev))
# correlations between original predictors and new orthogonal variables
lambda <- evec %*% delta %*% t(evec)
lambdasq <- lambda^2
# regression coefficients of Y on orthogonal variables
beta <- solve(lambda) %*% rxy
rsquare <- colSums(beta^2)
rawwgt <- lambdasq %*% beta^2
import <- (rawwgt/rsquare) * 100
lbls <- names(fit$model[2:nvar])
rownames(import) <- lbls
colnames(import) <- "Weights"
# plot results
barplot(t(import), names.arg = lbls, ylab = "% of R-Square",
xlab = "Predictor Variables", main = "Relative Importance of Predictor Variables",
sub = paste("R-Square = ", round(rsquare, digits = 3)),
...)
return(import)
}

不要在意算法原理和代碼邏輯這種細節(jié),直接看結(jié)果:

fit <- lm(Murder ~ Population + Illiteracy + Income +
Frost, data = states)
relweights(fit, col = "lightgrey")
Weights
Population 14.723401
Illiteracy 59.000195
Income      5.488962
Frost      20.787442
fit$coefficients
(Intercept)   Population   Illiteracy       Income        Frost
1.2345634112 0.0002236754 4.1428365903 0.0000644247 0.0005813055
barplot(fit$coefficients[2:5])

?

在本例中,相對權(quán)重與系數(shù)的排序結(jié)果一致。推薦用相對權(quán)重。

?


?


?


?


?


?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容