[关闭]
@evilking 2018-05-15T14:31:50.000000Z 字数 5313 阅读 1102

回归分析篇

基础实例解析

在讲回归分析的理论知识之前,笔者希望先通过一个简单的回归分析实例来对回归分析的过程有个大概的了解;
然后再来用回归分析理论去解释并介绍回归分析,这样更容易接受一些;
最后用一个相对复杂一些的实例,用R语言将前面讲的理论知识都用起来;
笔者相信读者在认真学习了这三个部分的内容之后,会对回归分析有个系统而清晰的认识

什么是回归分析

回归分析是处理变量x与y之间的关系的一种统计方法技术

在实际的问题中,我们把x称为自变量,y称为因变量。如果要由x预测y,就是要利用x,y的观察值,即样本观测值


来建立一个公式 f(x),当给定x值后,就带入此公式中算出一个y值,这个值就称为y的预测值

而建立什么样的公式,以及如何来建立这样的公式,就是回归分析要解决的问题;比如


就表示该公式为一元线性回归方程,回归分析的方法就叫一元线性回归分析

一元回归分析

一元线性回归的原理比较简单:假设有关系y = c + bx + e,其中c+bx是y随x变化的部分,e是随机误差。就可以很容易的用函数lm()求出回归参数b,c并作相应的假设检验

构造数据

以后的代码量比较多,代码也比较复杂,不像基础篇时代码比较简单,一两句就能写完,所以以后的代码都是写在脚本里,然后用source("script_path")的方式来执行

> x <- data.frame(y=c(102,115,124,135,148,156,162,176,183,195),
                var1=runif(10,min=1,max=50),
                var2=runif(10,min=100,max=200),
                var3=c(235,321,412,511,654,745,821,932,1020,1123))

> x    #查看数据结果
     y     var1     var2 var3
1  102 29.27101 168.0699  235
2  115 33.92689 199.0317  321
3  124 45.91594 178.1866  412
4  135 44.18045 184.3150  511
5  148 12.03837 147.2264  654
6  156 25.18464 150.9380  745
7  162 44.90425 128.2943  821
8  176 32.68349 193.1738  932
9  183 23.67720 157.0307 1020
10 195 35.15807 146.6647 1123

这里我们创建了一个数据框x,该数据框内有4个元组,我们要考察的就是其中元组var1,var2,var3与元组y的关系

一元线性回归

> model <- lm(y ~ var1, data = x)    #一元线性回归

> summary(model)    #查看model对象的内容

Call:
lm(formula = y ~ var1, data = x)

Residuals:
   Min     1Q Median     3Q    Max 
-49.05 -17.59  -3.26  24.19  46.44 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)   
(Intercept) 163.4098    34.0422   4.800  0.00136 **
var1         -0.4224     0.9940  -0.425  0.68208   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 32.05 on 8 degrees of freedom
Multiple R-squared:  0.02207,   Adjusted R-squared:  -0.1002 
F-statistic: 0.1806 on 1 and 8 DF,  p-value: 0.6821

>

lm(formula,data)函数可以做线性回归分析,其中formula参数表示假设回归方程中因变量与自变量之间的关系;例如上面的例子中,y ~ var1~符号左边的y表示回归过程中的因变量,右边的var1表示自变量,所以这个例子是做的一元线性回归;在后面详细讲R做回归分析时再来详细解释lm()函数

从上面summary(model)显示的回归结果来看,p-value即p值为0.6821,变量var1不显著,无法拒绝原假设,正常情况下p值小于0.05则认为有高的显著性水平。另外,R-squared即称R方为0.02207距离1太远,说明两者之间不存在相关性

关于上面summary(model)显示的结果,各个参数具体是什么意思,笔者会在后面的R代码详解中解释,这里只是希望读者能对回归分析过程有个大概的认识

于是我们继续考察其他变量与因变量之间的关系,以y与var3为例:

> model <- lm(y ~ var3, data = x)

> summary(model)

Call:
lm(formula = y ~ var3, data = x)

Residuals:
    Min      1Q  Median      3Q     Max 
-3.0805 -0.9080  0.6566  1.0255  2.1451 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 81.431990   1.399442   58.19 8.45e-12 ***
var3         0.100632   0.001902   52.92 1.80e-11 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.73 on 8 degrees of freedom
Multiple R-squared:  0.9972,    Adjusted R-squared:  0.9968 
F-statistic:  2801 on 1 and 8 DF,  p-value: 1.802e-11

>

从回归结果看成,p值 << 0.05,p值非常显著,R方也达到0.9972,非常接近1了,说明整个模型的拟合度很高,可判断var3与y之间存在强的线性相关

回归的结果是由Coefficients参数显示,例如上面的截距项(Intercept)部分的(Estimate)估计值为81.431990,自变量va

r3的回归系数的估计值为0.1006

32,所以最后得到的回归方程为

> coefficients(model)
(Intercept)        var3 
 81.4319901   0.1006318 
>

对于回归系数结果的提取,也可以用coefficients(model)函数

预测

通过上面的一元回归分析过程后,我们得到了变量var3与y之间的回归方程,那么接下来就可以利用该回归方程做预测,即给定一个新的x值,带入方程,求得该x值对应的y值,就可以得到y的预测值

> pre <- data.frame(var3 = c(56,36))    #需要进行预测的x值准备

> predict(model,pre,interval = "prediction",level = 0.95)    # 对x进行预测
       fit      lwr      upr
1 87.06737 82.07491 92.05983
2 85.05474 80.01387 90.09560
>

以上就是预测的步骤:
先要准备需要进行预测的点的x值,这里需要对两个点进行预测,即x分别为56的点,和x值为36的点,因为predict()函数只能接受数据框,所以要先对x值用data.frame进行包装

predict(model,data,interval,level)函数可以利用回归结果对象model,对数据data进行预测,使用的置信水平为0.95

predict()函数得到的结果中fit就是预测的结果值,这里是对两个点进行预测,所以有两个值;lwr和upr分别是置信区间的下限和上限

一元回归分析小结

我们重新回顾一下一元线性回归分析的整个过程:

先是数据准备,对于实际的应用中,这一步需要读取数据,如果有必要的话,还要对数据进行清洗;

然后是做一元回归,分别用不同的变量去与因变量去做一元线性回归,然后查看回归的结果,看回归的效果是好还是不好,这里主要是看p值和R方,在后面会学到,还需要看回归系数是否显著,回归残差是否满足随机性假设等等问题;如果分析的结果比较好的话,就能得到最后我们所需要的适合的回归方程了

最后一步就是利用得到的回归方程来预测,再后面就包括画图等通过可视化的方式来展现预测的结果了


多元线性回归分析

多元线性回归分析是多个自变量与因变量的关系。在多元回归分析过程中,由于我们不知道因变量和哪几个自变量之间存在线性关系,或是否存在线性关系,如果一个一个的检验,整个过程将变得非常繁琐。

好在R中有自动进行逐步回归的函数,我们只要根据函数运行结果,选择合适的模型,并检验各项参数就可以了。

> model <- lm(y ~ .,data = x)    #考察var1,var2,var3与y之间的线性关系

> summary(model)

Call:
lm(formula = y ~ ., data = x)

Residuals:
    Min      1Q  Median      3Q     Max 
-2.4034 -0.9050  0.2584  0.7824  1.8531 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 72.131973   5.251497  13.736 9.26e-06 ***
var1         0.009976   0.050859   0.196    0.851    
var2         0.047123   0.026624   1.770    0.127    
var3         0.102381   0.001999  51.222 3.72e-09 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.598 on 6 degrees of freedom
Multiple R-squared:  0.9982,    Adjusted R-squared:  0.9973 
F-statistic:  1095 on 3 and 6 DF,  p-value: 1.326e-08

> 

从回归的结果来看,p值显著,R方也很大,但是变量var1和var2的回归系数不显著(Coefficients项后面的***表示非常显著,**表示很显著,*表示显著,没有标注表示不显著),我们的回归模型不仅要考察p值和R方,还需要每个回归系数都显著

对于回归系数不显著的情况,可能是解释变量不足或者过多,这个时候就要对原模型进行修改,可以使用逐步回归来确定最优的解释变量

> step(model)    #逐步回归,采用AIC值最小原则
Start:  AIC=12.27
y ~ var1 + var2 + var3

       Df Sum of Sq    RSS    AIC
- var1  1       0.1   15.4 10.332
<none>                15.3 12.268
- var2  1       8.0   23.3 14.469
- var3  1    6700.8 6716.1 71.097

Step:  AIC=10.33
y ~ var2 + var3

       Df Sum of Sq    RSS    AIC
<none>                15.4 10.332
- var2  1       8.5   23.9 12.727
- var3  1    6725.4 6740.8 69.133

Call:
lm(formula = y ~ var2 + var3, data = x)

Coefficients:
(Intercept)         var2         var3  
   72.33577      0.04797      0.10236  

> 

step(model)函数是R中用来做逐步回归的函数,还有参数可选择是向前逐步回归还是向后逐步回归,或是向前向后逐步回归,默认是采用向前向后逐步回归

从结果的AIC现象来看,最后一个只有y和var2,var3进行回归时,AIC值最小(AIC为赤池信息准则,逐步回归过程中,AIC值越小,说明模型拟合度越好)

依据上面的步骤,我们建立了模型model <- lm(y ~ var2 + var3),然后通过该模型可用来预测

多元线性回归分析小结

对于多元线性回归分析,因为我们事先并不知道因变量具体与哪些自变量有线性关系,所以我们一般采取如下两种办法:

第一种是最开始用全部变量进行回归,然后逐步使用逐步回归去掉不显著的解释变量,从而得到最优的模型

第二种是我们从一个解释变量开始,逐渐增加解释变量,从而找出AIC最小的那个最优模型

回归分析小结

经过上面两个简单的例子,我想读者应该对回归分析的过程有了个大概的了解,当然,上面主要是说的线性回归,对于非线性的情况,我们一般是先尽可能的转换成线性的情况来做,对于简单非线性的情况,比如能用多项式回归的,或者logistic回归的,我们能做,至于更复杂的情况,目前也没找到什么好的办法,这个时候可以尝试机器学习方面的方法了

回归分析的重点是寻找最优的回归方程,需要不断的对拟合模型进行各种条件假设的检验,比如正态性检验,回归方程显著性检验,回归系数显著性检验,残差分析,逐步回归,多重共线性检验等等问题,当都通过检验后,拟合的模型才能使用,才能得到比较准备的预测结果

在后面的部分,我们开始从理论的角度系统的讲解各个部分的内容,这里先给出回归分析体系的知识图谱,读者可以先看看,有个整体的概念:

回归分析知识图谱

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注