迴歸方法(二):多項式迴歸告訴你身高和體重的關係

這是一個吸引眼球的題目,但是正是一篇正兒八經的乾貨。

昨天學習了線性迴歸,今天依舊是用lm函數,不過期望實現的是多項式迴歸。對於一元多項式y=a_{0}+a_{1}X+a_{2}X^2+....+a_{k}X^k+\varepsilon,若X_{1}=X,X_{2}=X^2.....X_{k}=X^k,多項式迴歸就變成了多元線性迴歸。                  同樣的對於多元多次多項式y=a_{0}+a_{1}X_{1}+a_{2}X_{2}+a_{3}X_{1}^2+....+a_{5}X_{1}X_{2}+\varepsilon,若X_{1}=X_{1},X_{2}=X_{2},X_{3}=X_{1}^2,...X_{5}=X_{1}X_{2},同樣的也可以用多元線性迴歸的方法來做。

多項式迴歸應盡少創建新的變量,儘量使用低次多項式,否則會增加模型複雜度,造成過擬合或欠擬合

用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條無法成爲科學依據,只是爲了學習多項式迴歸。所以,各位高、矮、胖、瘦還是散了吧,我是爲了瀏覽量。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章