用多项式回归检查非线性
有时使用线性回归时,我们需要检查数据中的非线性。一种方法是拟合多项式模型,并检查它是否比线性模型更适合数据。还有其他原因,例如理论,表明适合二次或更高阶模型,因为人们认为变量关系本质上是多项式的。
让我们拟合 mtcars
数据集的二次模型。对于线性模型,请参阅 mtcars 数据集上的线性回归 。
首先,我们制作变量 mpg
(Miles / gallon),disp
(Displacement(cu.in。))和 wt
(Weight(1000 lbs))的散点图。mpg
和 disp
之间的关系看起来是非线性的。
plot(mtcars[,c("mpg","disp","wt")])
线性拟合将表明 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
地块。这里我们使用 p3d
package 的 Fit3d
。
library(p3d)
Init3d(family="serif", cex = 1)
Plot3d(mpg ~ disp+wt, mtcars)
Axes3d()
Fit3d(fit1)