这是一个吸引眼球的题目,但是正是一篇正儿八经的干货。
昨天学习了线性回归,今天依旧是用lm函数,不过期望实现的是多项式回归。对于一元多项式,若,多项式回归就变成了多元线性回归。 同样的对于多元多次多项式,若,同样的也可以用多元线性回归的方法来做。
(多项式回归应尽少创建新的变量,尽量使用低次多项式,否则会增加模型复杂度,造成过拟合或欠拟合)
用R实现多项式回归
这里我使用的数据是R自带的database中的women,里面收集了女性的身高(height)和体重(weight)数据,让我们来看一下:如图所示,数据似乎有些怪异,应该是计量单位的原因,不出意外的话身高单位是英寸,体重单位是lbs(磅)贴心的我附上换算公式(1英寸=2.54cm,1lbs=0.453kg),接下来我们分别用线性回归和多项式回归对数据进行 拟合。
x<-women$height#定义x为身高
y<-women$weight#定义y为体重
进行一元线性回归
> model1 <- lm(y ~x)#简单的一元线性回归
> summary(model1)#显示拟合细节
Call:
lm(formula = y ~ x)
Residuals:
Min 1Q Median 3Q Max
-1.7333 -1.1333 -0.3833 0.7417 3.1167
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -87.51667 5.93694 -14.74 1.71e-09 ***
x 3.45000 0.09114 37.85 1.09e-14 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1.525 on 13 degrees of freedom
Multiple R-squared: 0.991, Adjusted R-squared: 0.9903
F-statistic: 1433 on 1 and 13 DF, p-value: 1.091e-14
根据程序运行结果可知,确定系数已经非常高了,拟合程度已经不错了,那么多项式回归会更胜一筹吗?
> new_x <- cbind(x, x^2)##定义新的变量,把多项式变成多元一次
> model2 <- lm(y ~ new_x)##线性拟合
> summary(model2)#显示拟合细节
Call:
lm(formula = y ~ new_x)
Residuals:
Min 1Q Median 3Q Max
-0.50941 -0.29611 -0.00941 0.28615 0.59706
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 261.87818 25.19677 10.393 2.36e-07 ***
new_xx -7.34832 0.77769 -9.449 6.58e-07 ***
new_x 0.08306 0.00598 13.891 9.32e-09 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.3841 on 12 degrees of freedom
Multiple R-squared: 0.9995, Adjusted R-squared: 0.9994
F-statistic: 1.139e+04 on 2 and 12 DF, p-value: < 2.2e-16
天(⊙o⊙)…,多项式的拟合结果似乎逼近完美。 整个的操作非常简单,模型也很简单,为了更直观接下来画图看拟合程度。
library(ggplot2)##加载画图用的ggplot2包
ggplot(data =women)+
geom_point(aes(x ,y )) +
geom_line(aes(x = women$height,y = model1$fit),color = "red") +
geom_line(aes(x = women$height,y = model2$fit),color = "blue") +
theme(panel.background = element_blank())#画图,图中有x,y散点图、线性拟合的直线、多项式拟合的曲线
根据上图所示,多项式拟合的曲线几乎完美的触碰了所有的点,而线性回归拟合的直线虽然和曲线的距离超近但仍旧有差距,根据已有的数据我们还是可以得出身高和体重是正相关的,但是事实上,他们的取值都在一定的范围内,也应该有异常值才算是完整的,本题目只是为了哗众取宠,因为数据只有15条无法成为科学依据,只是为了学习多项式回归。所以,各位高、矮、胖、瘦还是散了吧,我是为了浏览量。