@evilking
2018-05-15T22:31:50.000000Z
字数 5313
阅读 1219
回归分析篇
在讲回归分析的理论知识之前,笔者希望先通过一个简单的回归分析实例来对回归分析的过程有个大概的了解;
然后再来用回归分析理论去解释并介绍回归分析,这样更容易接受一些;
最后用一个相对复杂一些的实例,用R语言将前面讲的理论知识都用起来;
笔者相信读者在认真学习了这三个部分的内容之后,会对回归分析有个系统而清晰的认识
回归分析是处理变量x与y之间的关系的一种统计方法和技术
在实际的问题中,我们把x称为自变量,y称为因变量。如果要由x预测y,就是要利用x,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回归的,我们能做,至于更复杂的情况,目前也没找到什么好的办法,这个时候可以尝试机器学习方面的方法了
回归分析的重点是寻找最优的回归方程,需要不断的对拟合模型进行各种条件假设的检验,比如正态性检验,回归方程显著性检验,回归系数显著性检验,残差分析,逐步回归,多重共线性检验等等问题,当都通过检验后,拟合的模型才能使用,才能得到比较准备的预测结果
在后面的部分,我们开始从理论的角度系统的讲解各个部分的内容,这里先给出回归分析体系的知识图谱,读者可以先看看,有个整体的概念: