用多項式迴歸檢查非線性

有時使用線性迴歸時,我們需要檢查資料中的非線性。一種方法是擬合多項式模型,並檢查它是否比線性模型更適合資料。還有其他原因,例如理論,表明適合二次或更高階模型,因為人們認為變數關係本質上是多項式的。

讓我們擬合 mtcars 資料集的二次模型。對於線性模型,請參閱 mtcars 資料集上的線性迴歸

首先,我們製作變數 mpg(Miles / gallon),disp(Displacement(cu.in。))和 wt(Weight(1000 lbs))的散點圖。mpgdisp 之間的關係看起來是非線性的。

plot(mtcars[,c("mpg","disp","wt")])

StackOverflow 文件

線性擬合將表明 disp 不重要。

fit0 = lm(mpg ~ wt+disp, mtcars)
summary(fit0)

# Coefficients:
#            Estimate Std. Error t value Pr(>|t|)    
#(Intercept) 34.96055    2.16454  16.151 4.91e-16 ***
#wt          -3.35082    1.16413  -2.878  0.00743 ** 
#disp        -0.01773    0.00919  -1.929  0.06362 .  
#---
#Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#Residual standard error: 2.917 on 29 degrees of freedom
#Multiple R-squared:  0.7809,    Adjusted R-squared:  0.7658

然後,為了得到二次模型的結果,我們新增了 I(disp^2)。在檢視 R^2 時,新模型看起來更好,所有變數都很重要。

fit1 = lm(mpg ~ wt+disp+I(disp^2), mtcars)
summary(fit1)

# Coefficients:
#              Estimate Std. Error t value Pr(>|t|)    
#(Intercept) 41.4019837  2.4266906  17.061  2.5e-16 ***
#wt          -3.4179165  0.9545642  -3.581 0.001278 ** 
#disp        -0.0823950  0.0182460  -4.516 0.000104 ***
#I(disp^2)    0.0001277  0.0000328   3.892 0.000561 ***
#---
#Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#Residual standard error: 2.391 on 28 degrees of freedom
#Multiple R-squared:  0.8578,    Adjusted R-squared:  0.8426 

由於我們有三個變數,擬合模型是一個表示為:

mpg = 41.4020-3.4179*wt-0.0824*disp+0.0001277*disp^2

另一種指定多項式迴歸的方法是使用 poly 和引數 raw=TRUE,否則將考慮正交多項式 (更多資訊請參見 help(ploy))。我們得到相同的結果:

summary(lm(mpg ~ wt+poly(disp, 2, raw=TRUE),mtcars))

最後,如果我們需要顯示估計表面的圖表怎麼辦?那麼有很多選擇可以在 R 製作 3D 地塊。這裡我們使用 p3dpackage 的 Fit3d

library(p3d)
Init3d(family="serif", cex = 1)
Plot3d(mpg ~ disp+wt, mtcars)
Axes3d()
Fit3d(fit1)

StackOverflow 文件