這是一個吸引眼球的題目,但是正是一篇正兒八經的乾貨。
昨天學習了線性迴歸,今天依舊是用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條無法成爲科學依據,只是爲了學習多項式迴歸。所以,各位高、矮、胖、瘦還是散了吧,我是爲了瀏覽量。