目錄
0引言
在畢業實用模型一1、二2、三3中介紹了時間序列模型的建模思路與在R語言中的調參,今天來講解一下回歸模型的建模思路和實現。
在這裏你將會學到:
- 推薦的迴歸模型的書籍
- 高效簡介的相關性分析圖
- 多元迴歸模型的建立
- 迴歸模型的診斷的閱讀導讀
- 有效變量的選擇方法
- 迴歸常用的函數
1、課本介紹
本文的案例偏向R語言的實現和分析理論較少。在做迴歸模型之前,介紹幾本做迴歸的書籍,其中一本是偏向理論的,大學本科的教材,有概率論數理統計基礎即可看懂。一本是R語言實戰的第八章,偏重講迴歸模型的實現。
1.1理論的書
要想看懂本文的思路,需要一些基本的迴歸分析的理論,下面這本書4可以給你這些:考慮版權這裏就不貼鏈接了。
還有一本書叫統計學習基礎5,這本書是偏向理論的統計模型,介紹迴歸和相關的模型理論比較深一點,如果遇到的問題上面的書解決不了可以選擇求助這本書,本書的三、四、七、八章是關於迴歸的,大家查閱學習。
1.2 R語言的書
R語言實戰6被很多人說成R語言的聖經,好好讀完,你的R語言水平會提高一個檔次。今天主要參考的是他的第八章。
展示部分目錄:
2、構造數據
做迴歸分析需要有實際的數據,本篇使用隨機模型的方式去生成規範化的數據進行建模。提前設定好真實參數,可以更好的看到模型的效果。下面是構造數據的代碼:
library(MASS) # 生成多元正態分佈
> n = 300; p = 6
> Beta <- c(rep(1,3),0,0,1) # 設置真實迴歸模型參數
> set.seed(0) # 設置種子
> x = mvrnorm(n = n, mu = rep(0, p-1), Sigma = diag(rep(1, p-1))) # 需要載入MASS包
> x6 <- x[,1] + rnorm(n, 0, 0.3)
> x = cbind(x, x6)
> colnames(x) <- paste0("x", 1:6)
> y = x %*% Beta + + rnorm(n, 0, 2)
> Data <- data.frame(x, y = y)
> head(Data)
x1 x2 x3 x4 x5 x6
1 -0.9593164 -0.59188422 -1.6878010 -0.1244350 1.2629543 -0.9356879
2 -1.6203166 -0.37099306 0.6476460 1.4667446 -0.3262334 -1.6357428
3 0.8225133 0.08792426 0.4487942 0.6739287 1.3297993 0.7442811
4 0.1087127 -0.03472634 1.0263022 1.9564253 1.2724293 0.5785931
5 0.7609948 1.80637427 1.0749782 -0.2690410 0.4146414 0.6493902
6 -2.3062566 -0.34023607 0.4583096 -1.2445515 -1.5399500 -1.7836732
y
1 -4.5420488
2 -2.5045986
3 0.9620528
4 3.0366120
5 1.3610465
6 -6.2472318
介紹一下數據的生成。六個自變量。其中是由線性生成的。也就是具有很大的相關性。參數設置時。的參數是1,的參數是0。一元迴歸的建立與可視化參見R語言可視化——ggplot2畫迴歸曲線一文,裏面包含了一元迴歸的方差分析、迴歸線、等R語言的實現。下面討論多元迴歸模型的建立。
3、相關性分析
在相關性分析時,往往需要繪製一幅比較清晰明瞭的相關圖。下面我就對上述數據畫出一部分吧相關圖。
library(corrplot) # 畫相關圖的包
library(customLayout) # 加載拼圖包
# 創建拼圖畫布
lay1 <- lay_new(
mat = matrix(1:2, ncol = 1),
heights = c(1,1)
)
lay2 <- lay_new(
mat = matrix(1:4, ncol = 1),
heights = c(1,1,1,1)
)
lay3 <- lay_bind_col(lay1, lay2, widths = c(2, 1)) # 合併畫布
par(mar = c(1, 1, 1, 1))
lay_show(lay3)
lay_set(lay3)
M <- cor(Data)
col1 <- colorRampPalette(c("#7F0000", "red", "#FF7F00", "yellow", "white",
"cyan", "#007FFF", "blue","#00007F"))
corrplot(M, method = "number", col = "black", cl.pos = "n")
corrplot(M, method = "pie", order = "AOE")
corrplot(M, method = "number")
corrplot(M, order = "AOE", addCoef.col = "grey")
corrplot(M, order = "AOE", col = col1(20), cl.length = 21, addCoef.col = "grey")
corrplot(M, method = "color", col = col1(20), cl.length = 21, order = "AOE",
addCoef.col = "grey")
plot(Data)
下面是兩幅圖的效果:
可以在上面的相關圖中按自己的需求選一幅進行分析。除此之外在建模中之前還應該:
- 對進行正態性檢驗。
- 對數據進行中心或者標準化,儘量各個變量之間的的差距不是很大。具體理論參考文獻4第75-78頁。
- n是不是遠大於p,如果n不是遠大於p或者數量比較接近,則可能導致過擬合、估計的參數可信度不大。
4、多元迴歸模型的建立
4.1建立模型
> par(mfrow = c(2, 2))
> fit <- lm(y~., data = Data)
> summary(fit)
Call:
lm(formula = y ~ ., data = Data)
Residuals:
Min 1Q Median 3Q Max
-5.8223 -1.3649 -0.1257 1.5422 6.0490
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.04555 0.12520 -0.364 0.71627
x1 1.13727 0.40586 2.802 0.00541 **
x2 1.09968 0.11920 9.225 < 2e-16 ***
x3 0.99557 0.12964 7.679 2.41e-13 ***
x4 -0.08748 0.12495 -0.700 0.48442
x5 0.03488 0.13029 0.268 0.78913
x6 1.02470 0.39657 2.584 0.01025 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 2.159 on 293 degrees of freedom
Multiple R-squared: 0.6168, Adjusted R-squared: 0.6089
F-statistic: 78.59 on 6 and 293 DF, p-value: < 2.2e-16
> plot(fit)
是0.6左右不是很顯著,係數的檢驗中常數項和都不顯著。迴歸方程的檢驗顯著。還有一個模型的檢驗圖如下。
5.2模型分析
上圖的分析方式參見文獻3的第八章。
5.3方差分析表
在R語言裏是可以輸出方差分析表的:
> anova(fit)
Analysis of Variance Table
下面準備剔除變量介紹一般的變量選擇的方法。
Response: y
Df Sum Sq Mean Sq F value Pr(>F)
x1 1 1508.74 1508.74 323.7227 < 2.2e-16 ***
x2 1 363.08 363.08 77.9040 < 2.2e-16 ***
x3 1 290.80 290.80 62.3947 5.704e-14 ***
x4 1 3.63 3.63 0.7792 0.37812
x5 1 0.40 0.40 0.0857 0.76995
x6 1 31.12 31.12 6.6766 0.01025 *
Residuals 293 1365.55 4.66
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
5、變量選擇
在多元線性迴歸中變量選擇的方法衆多,包含向前向後迴歸所有子集以及套索壓縮係數法。本節以上面的數據模型爲例演示這幾種方式。
5.1 逐步迴歸
逐步迴歸的實現需要用到MASS
包中的step
或者stepAIC
函數。
下面是step的具體參數
> step
function (object, scope, scale = 0, direction = c("both",
"backward", "forward"), trace = 1, keep = NULL,
steps = 1000, use.start = FALSE, k = 2, ...)
參數說明:
- object:模型的對象
- diretion:選擇方法,both逐步迴歸,backward向前,forward向後。
代碼案例:
> step(fit, direction = c("both")) # 逐步迴歸
Start: AIC=468.66
y ~ x1 + x2 + x3 + x4 + x5 + x6
Df Sum of Sq RSS AIC
- x5 1 0.33 1365.9 466.73
- x4 1 2.28 1367.8 467.16
<none> 1365.5 468.66
- x6 1 31.12 1396.7 473.42
- x1 1 36.60 1402.2 474.59
- x3 1 274.85 1640.4 521.67
- x2 1 396.64 1762.2 543.16
Step: AIC=466.73
y ~ x1 + x2 + x3 + x4 + x6
Df Sum of Sq RSS AIC
- x4 1 2.24 1368.1 465.23
<none> 1365.9 466.73
+ x5 1 0.33 1365.5 468.66
- x6 1 31.18 1397.1 471.51
- x1 1 36.44 1402.3 472.63
- x3 1 281.26 1647.2 520.91
- x2 1 398.89 1764.8 541.60
Step: AIC=465.23
y ~ x1 + x2 + x3 + x6
Df Sum of Sq RSS AIC
<none> 1368.1 465.23
+ x4 1 2.24 1365.9 466.73
+ x5 1 0.29 1367.8 467.16
- x6 1 32.57 1400.7 470.28
- x1 1 35.65 1403.8 470.94
- x3 1 282.58 1650.7 519.55
- x2 1 404.83 1773.0 540.99
Call:
lm(formula = y ~ x1 + x2 + x3 + x6, data = Data)
Coefficients:
(Intercept) x1 x2 x3 x6
-0.04082 1.12071 1.10693 1.00183 1.04557
> step(fit, direction = c("backward")) # 向前迴歸
Start: AIC=468.66
y ~ x1 + x2 + x3 + x4 + x5 + x6
Df Sum of Sq RSS AIC
- x5 1 0.33 1365.9 466.73
- x4 1 2.28 1367.8 467.16
<none> 1365.5 468.66
- x6 1 31.12 1396.7 473.42
- x1 1 36.60 1402.2 474.59
- x3 1 274.85 1640.4 521.67
- x2 1 396.64 1762.2 543.16
Step: AIC=466.73
y ~ x1 + x2 + x3 + x4 + x6
Df Sum of Sq RSS AIC
- x4 1 2.24 1368.1 465.23
<none> 1365.9 466.73
- x6 1 31.18 1397.1 471.51
- x1 1 36.44 1402.3 472.63
- x3 1 281.26 1647.2 520.91
- x2 1 398.89 1764.8 541.60
Step: AIC=465.23
y ~ x1 + x2 + x3 + x6
Df Sum of Sq RSS AIC
<none> 1368.1 465.23
- x6 1 32.57 1400.7 470.28
- x1 1 35.65 1403.8 470.94
- x3 1 282.58 1650.7 519.55
- x2 1 404.83 1773.0 540.99
Call:
lm(formula = y ~ x1 + x2 + x3 + x6, data = Data)
Coefficients:
(Intercept) x1 x2 x3 x6
-0.04082 1.12071 1.10693 1.00183 1.04557
> step(fit, direction = c("forward")) # 向後迴歸
Start: AIC=468.66
y ~ x1 + x2 + x3 + x4 + x5 + x6
Call:
lm(formula = y ~ x1 + x2 + x3 + x4 + x5 + x6, data = Data)
Coefficients:
(Intercept) x1 x2 x3 x4
-0.04555 1.13727 1.09968 0.99557 -0.08748
x5 x6
0.03488 1.02470
其中逐步迴歸和向前迴歸選擇出了重要的變量,而且估計的參數效果比較好。向後迴歸沒有選擇出好的變量。當然不是說向後迴歸選擇變量不好,可能換個數據向前迴歸也會失效。下面介紹所有子集法,從所有可能的自變量的集合中選出最優的模型,缺點是計算量比較大。這裏變量只有6個,所有我們使用相關函數進行計算。
5.2所有子集法
實現所有子集所用的包是leaps,打開下面的函數參數需要用到泛型函數的知識,具體參見泛型函數的講解和案例7。
plot(x, labels=obj$xnames, main=NULL, scale=c("bic", "Cp", "adjr2", "r2"),
col=gray(seq(0, 0.9, length = 10)),...)
- scale這個參數是調整模型的選擇順序。例子如下:
leap <- regsubsets(y~.,data = Data)
class(leap)
par(mfrow = c(2,2))
plot(leap,scale="bic")
plot(leap,scale="Cp")
plot(leap,scale="adjr2")
plot(leap,scale="r2")
?plot.regsubsets
可以看出三個標準可以選擇出好的模型。r2的第二個模型是最優的。
5.3套索法
這個方法不同於上述兩種方式,是文獻5的作者首次在1996年提出的。在文獻二第三章的第四節中有此方法的具體介紹。本節使用ncvreg
包來對上述模型實現變量選擇。
先介紹ncvreg
和cv.ncvreg
這兩個函數。
> ncvreg
function (X, y, family = c("gaussian", "binomial",
"poisson"), penalty = c("MCP", "SCAD",
"lasso"), gamma = switch(penalty, SCAD = 3.7, 3), alpha = 1,
lambda.min = ifelse(n > p, 0.001, 0.05), nlambda = 100, lambda,
eps = 1e-04, max.iter = 10000, convex = TRUE, dfmax = p +
1, penalty.factor = rep(1, ncol(X)), warn = TRUE, returnX,
...)
> cv.ncvreg
function (X, y, ..., cluster, nfolds = 10, seed, fold, returnY = FALSE,
trace = FALSE)
- X因變量矩陣
- 響應變量向量
- family 廣義線性模型的分佈族這裏用高斯即可。
- penalty懲罰函數這裏用MCP和lasso即可。
案例:
> X <- as.matrix(Data[,1:6])
> Y <- Data[,7]
> fit1 <- cv.ncvreg(X,Y,penalty = "MCP", trace = T)
Starting CV fold #1
Starting CV fold #2
Starting CV fold #3
Starting CV fold #4
Starting CV fold #5
Starting CV fold #6
Starting CV fold #7
Starting CV fold #8
Starting CV fold #9
Starting CV fold #10
> coef(fit1)
(Intercept) x1 x2 x3 x4 x5
-0.04211208 1.12333734 1.10523022 1.00117800 -0.02642666 0.00000000
x6
1.04100244
> summary(fit1)
MCP-penalized linear regression with n=300, p=6
At minimum cross-validation error (lambda=0.0685):
-------------------------------------------------
Nonzero coefficients: 5
Cross-validation error (deviance): 4.81
R-squared: 0.60
Signal-to-noise ratio: 1.47
Scale estimate (sigma): 2.192
> fit2 <- ncvreg(X,Y,penalty = "lasso")
> fit3 <- ncvreg(X, Y, penalty = "lasso", lambda = 0.2)
> coef(fit3)
(Intercept) x1 x2 x3 x4 x5
-0.06064812 1.03875142 0.90957439 0.80761377 0.00000000 0.00000000
x6
0.94863056
plot(fit1)
plot(fit2)
6、迴歸模型常用函數總結
這篇知識講了迴歸模型的基本一些方法除此之外你還可能會用到迴歸診斷和異常值的改進,最後列舉一寫常用的函數。
函數 | 功能 | 所在R包 | 所在課本頁碼 |
---|---|---|---|
confint | 輸出模型預測的置信區間 | 基礎包 | (R實戰第一版171) |
qqPlot | 正態檢驗 | car包 | (R實戰第一版175) |
durbinWatsonTest | 對誤差自相關性 | car包 | (R實戰第一版175) |
crPlots | 成分與殘差圖:檢驗模型的線性 | car包 | (R實戰第一版175) |
outlierTest | Bonferroni離羣點檢驗 | car包 | (R實戰第一版175) |
vif | 對誤差自相關性 | car包 | (R實戰第一版175) |
ressidplot | 殘差圖 | 自編函數 | (R實戰第一版177) |
durbinWatsonTest | 方差膨脹因子 | car包 | (R實戰第一版177) |
fitted | 列出擬合模型的預測值 | 基礎包 | R實戰第一版162頁 |
residuals | 列出擬合模型的殘差值 | 基礎包 | R實戰第一版162頁 |
vcov | 列出模型參數的協方差矩陣 | 基礎包 | R實戰第一版162頁 |
AIC | 輸出赤池信息統計量 | 基礎包 | R實戰第一版162頁 |
plot | 生成評價擬合模型的診斷圖 | 基礎包 | R實戰第一版162頁 |
predict | 用擬合模型對新的數據集預測響應變量值 | 基礎包 | R實戰第一版162頁 |