用多项式回归检查非线性

有时使用线性回归时,我们需要检查数据中的非线性。一种方法是拟合多项式模型,并检查它是否比线性模型更适合数据。还有其他原因,例如理论,表明适合二次或更高阶模型,因为人们认为变量关系本质上是多项式的。

让我们拟合 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 文档