![6e795cc0d94e785009f1cb00be0fc6b0.png](https://i-blog.csdnimg.cn/blog_migrate/0940c79bf167878a216a690090aa2c9f.png)
从许多方面来看,回归分析都是统计学的核心。它其实是一个广义的概念,通指那些用一个或多个预测变量(也称自变量或解释变量)来预测响应变量(也称因变量、效标变量或结果变量)的方法。通常,回归分析可以用来挑选与响应变量相关的解释变量,可以描述两者的关系,也可以生成一个等式,通过解释变量来预测响应变量。本文主要讲述了线性回归的问题,详细描述了线性回归的建模、模型诊断、模型操作及模型可视化等。
《R语言实战--第2版》---------Robert I.Kabacoff
本文内容:
- 回归的多面性
- OLS回归
- 回归诊断
- 异常观测值
- 改进措施
1. 回归的多面性
对于回归模型的拟合,R提供的强大而丰富的功能和选项也同样令人困惑。
![3c02c26e8f21ca9f19d45a6a0f55d6e1.png](https://i-blog.csdnimg.cn/blog_migrate/ffc1023aef85dbe00fe7d72e8ee615ad.jpeg)
在本次分享中,我们的重点是普通最小二乘(OLS)回归法,包括简单线性回归、多项式回归和多元线性回归。
2. OLS回归
OLS回归拟合模型的形式:
![07cf42134ceef153e5580dc742aef768.png](https://i-blog.csdnimg.cn/blog_migrate/a3a1af4cdb7789b6ce53ffdc9454aec2.jpeg)
我们的目标是通过减少响应变量的真实值与预测值的差值来获得模型参数 (截距项和斜率) 。具体而言,即使得残差平方和最小。
![86df9cd28c60dae854ec7813dae61066.png](https://i-blog.csdnimg.cn/blog_migrate/e4632aa4f1c257ddb68dfe2a102dca22.jpeg)
![44e378b4c0ce15987cb923d5af8e7c7a.png](https://i-blog.csdnimg.cn/blog_migrate/c25bda4a5ac13e0cc33a9dd814b87cec.jpeg)
如果违背了以上假设, 你的统计显著性检验结果和所得的置信区间就很可能不精确了。 注意,OLS回归还假定自变量是固定的且测量无误差,但在实践中通常都放松了这个假设。
2.1 用 lm()拟合回归模型
在R中,拟合线性模型最基本的函数就是lm(),格式为:
myfit <- lm(formula, data)
其中,formula指要拟合的模型形式,data是一个数据框,包含了用于拟合模型的数据。结果对象(本例中是myfit)存储在一个列表中,包含了所拟合模型的大量信息。
表达式(formula)形式如下:
Y ~ X1 + X2 + … + Xk
~左边为响应变量,右边为各个预测变量,预测变量之间用+符号分隔。
![70f31280c1d6cc22fb61c2276c97f371.png](https://i-blog.csdnimg.cn/blog_migrate/ddb26a45eb2e46b95046e913aff2127b.jpeg)
除了lm(),表8-3还列出了其他一些对做简单或多元回归分析有用的函数。拟合模型后,将这些函数应用于lm()返回的对象,可以得到更多额外的模型信息。
![d663f0c61e836b3ab2fd4abcbeb73a61.png](https://i-blog.csdnimg.cn/blog_migrate/f3f39ecfab2586da558a75e51199e925.jpeg)
当回归模型包含一个因变量和一个自变量时, 我们称为简单线性回归。
当只有一个预测变量,但同时包含变量的幂(比如,
2.2 简单线性回归
数据集women提供了15个年龄在30~39岁间女性的身高和体重信息,我们想通过身高来预测体重,获得一个等式可以帮助我们分辨出那些过重或过轻的个体。
fit <- lm(weight~height,data = women)
summary(fit)
women$weight
fitted(fit)
residuals(fit)
plot(women$height,women$weight,xlab="Height (in inches)",ylab="Weight (in pounds)")
abline(fit)
![3b260189a7669c69bc27ae527b2e46c5.png](https://i-blog.csdnimg.cn/blog_migrate/51262ffe593837fd4fe86414d6d088ab.png)
![c3e5b955630576b338043de9a0d15daa.png](https://i-blog.csdnimg.cn/blog_migrate/cd535b8f2a60ad71c2b98352e49a8707.png)
![c28cffeb37f0e13a7c9771f5bb08a996.png](https://i-blog.csdnimg.cn/blog_migrate/563e88de03a1faed181d5eee2c016f29.png)
通过输出结果,可以得到预测等式:
因为身高不可能为0, 所以没必要给截距项一个物理解释, 它仅仅是一个常量调整项。 在Pr(>|t|)栏,可以看到回归系数(3.45)显著不为0(p<0.001) ,表明身高每增高1英寸,体重将预期增加3.45磅。R平方项(0.991)表明模型可以解释体重99.1%的方差,它也是实际和预测值之间相关系数的平方($R^2=r^2_{hat{y}y}$) 。残差标准误(1.53 lbs)则可认为是模型用身高预测体重的平均误差。F统计量检验所有的预测变量预测响应变量是否都在某个几率水平之上。由于简单回归只有一个预测变量,此处F检验等同于身高回归系数的t检验。
2.3多项式回归
fit2 <- lm(weight~height+I(height^2),data=women)
summary(fit2)
plot(women$height,women$weight,
xlab="Height (in inches)",
ylab="Weight (in lbs)")
lines(women$height,fitted(fit2))
![4648e2cb1e8b4007ca3a489f6d84e5c7.png](https://i-blog.csdnimg.cn/blog_migrate/9c475a9ebf9a8e390f3476194a93ff9e.png)
![efc098012a2f284af4b654648d50c2c1.png](https://i-blog.csdnimg.cn/blog_migrate/cfb14d4bd013b60924b4841c665838c4.png)
新的预测等式为:
在p<0.001水平下,回归系数都非常显著。模型的方差解释率已经增加到了99.9%。二次项的显著性(t=13.89,p<0.001)表明包含二次项提高了模型的拟合度。从图也可以看出曲线确实拟合得较好。
那线性回归的非线性回归的区别是什么呢?线性模型是指参数线性而不是x线性,同理,非线性模型是指参数非线性而非x非线性,如:
![25fcaeb4e78a93f2eb0246c3e0109476.png](https://i-blog.csdnimg.cn/blog_migrate/67bdcdf412b9a32e356fb7b1b14a6142.jpeg)
car包中的scatterplot()函数,它可以很容易、方便地绘制二元关系图:
library(car)
scatterplot(weight~height,data=women,spread=FALSE, smoother.args=list(lty=2), pch=19,
main="Women Age 30-39",
xlab="Height (inches)",
ylab="Weight (lbs.)")
![ab93aefe6d4ec38a29e408b0778525ee.png](https://i-blog.csdnimg.cn/blog_migrate/a71fbfb71ae83b0a1ea2691dd1947e33.jpeg)
这个功能加强的图形,既提供了身高与体重的散点图、线性拟合曲线和平滑拟合(loess)曲线,还在相应边界展示了每个变量的箱线图。spread=FALSE选项删除了残差正负均方根在平滑曲线上的展开和非对称信息。smoother.args=list(lty=2)选项设置loess拟合曲线为虚线。pch=19选项设置点为实心圆(默认为空心圆)。粗略地看一下图可知,两个变量基本对称,曲线拟合得比直线更好。
2.4 多元线性回归
当预测变量不止一个时,简单线性回归就变成了多元线性回归,分析也稍微复杂些。以基础包中的state.x77数据集为例, 我们想探究一个州的犯罪率和其他因素的关系, 包括人口、文盲率、平均收入和结霜天数(温度在冰点以下的平均天数) 。多元回归分析中,第一步最好检查一下变量间的相关性。cor()函数提供了二变量之间的相关系数, car包scatterplotMatrix()函数则会生成散点图矩阵 :
states <- as.data.fram