畢業設計實用模型(四)——迴歸模型的實現(R語言)

0引言

在畢業實用模型123中介紹了時間序列模型的建模思路與在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

介紹一下數據的生成。六個自變量。其中x6x6是由x1x1線性生成的。也就是x1x6x1、x6具有很大的相關性。參數設置時。x1x2x3x6x1、x2、x3、x6的參數是1,x4x5x4、x5的參數是0。一元迴歸的建立與可視化參見R語言可視化——ggplot2畫迴歸曲線一文,裏面包含了一元迴歸的方差分析、迴歸線、R2R^2等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)

下面是兩幅圖的效果:
在這裏插入圖片描述
在這裏插入圖片描述可以在上面的相關圖中按自己的需求選一幅進行分析。除此之外在建模中之前還應該:

  • yy進行正態性檢驗。
  • 對數據進行中心或者標準化,儘量各個變量之間的的差距不是很大。具體理論參考文獻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)

R2R^2是0.6左右不是很顯著,係數的tt檢驗中常數項x4x4x5x5都不顯著。迴歸方程的檢驗顯著。還有一個模型的檢驗圖如下。

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

在這裏插入圖片描述可以看出biccpadjr2bic、cp、adjr2三個標準可以選擇出好的模型。r2的第二個模型是最優的。

5.3套索法

這個方法不同於上述兩種方式,是文獻5的作者首次在1996年提出的。在文獻二第三章的第四節中有此方法的具體介紹。本節使用ncvreg包來對上述模型實現變量選擇。
先介紹ncvregcv.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頁

7、參考文獻


  1. https://blog.csdn.net/weixin_46111814/article/details/105348265 ↩︎

  2. https://blog.csdn.net/weixin_46111814/article/details/105370507 ↩︎

  3. https://blog.csdn.net/weixin_46111814/article/details/105583080 ↩︎ ↩︎

  4. 何曉羣 應用迴歸分析第四版 ↩︎ ↩︎

  5. 統計學習基礎 ↩︎ ↩︎

  6. R語言實戰 ↩︎

  7. https://blog.csdn.net/weixin_46111814/article/details/105624660 ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章