为什么我对手动多项式展开和使用 R `poly` 函数得到不同的预测?

机器算法验证 r 回归 多项式
2022-03-07 20:53:59

为什么我对手动多项式展开和使用 Rpoly函数得到不同的预测?

set.seed(0)
x <- rnorm(10)
y <- runif(10)
plot(x,y,ylim=c(-0.5,1.5))
grid()

# xp is a grid variable for ploting
xp <- seq(-3,3,by=0.01)
x_exp <- data.frame(f1=x,f2=x^2)
fit <- lm(y~.-1,data=x_exp)
xp_exp <- data.frame(f1=xp,f2=xp^2)
yp <- predict(fit,xp_exp)
lines(xp,yp)

# using poly function
fit2 <- lm(y~ poly(x,degree=2) -1)
yp <- predict(fit2,data.frame(x=xp))
lines(xp,yp,col=2)

在此处输入图像描述

我的尝试:

  • 截距似乎有问题,当我用截距拟合模型时,即-1在模型中没有formula,两条线是相同的。但是为什么没有截距,两条线是不同的呢?

  • 另一个“修复”是使用raw多项式展开而不是正交多项式。如果我们将代码更改为fit2 = lm(y~ poly(x,degree=2, raw=T) -1), 将使 2 行相同。但为什么?

1个回答

正如您正确注意到的那样,原始差异是因为在第一种情况下您使用“原始”多项式,而在第二种情况下您使用正交多项式。因此,如果后面的lm调用更改为:fit3<-lm(y~ poly(x,degree=2, raw = TRUE) -1)我们将在 fit和之间得到相同的结果fit3在这种情况下我们得到相同结果的原因是“微不足道的”;我们安装的模型与我们安装的模型完全相同fit<-lm(y~.-1,data=x_exp),这并不奇怪。

可以很容易地检查两个模型的模型矩阵是否相同all.equal( model.matrix(fit), model.matrix(fit3) , check.attributes= FALSE) # TRUE)。


更有趣的是为什么在使用截距时会得到相同的图。首先要注意的是,当使用截距拟合模型时

  • fit2我们简单地垂直移动模型预测的情况下;曲线的实际形状是相同的。

  • 另一方面,在fit结果的情况下包括截距,不仅在垂直放置方面是不同的线,而且在整体上具有完全不同的形状。

我们可以很容易地看到,只需在现有图上添加以下拟合。

fit_b<-lm(y~. ,data=x_exp)
yp=predict(fit_b,xp_exp)
lines(xp,yp, col='green', lwd = 2)

fit2_b<-lm(y~ poly(x,degree=2, raw = FALSE) )
yp=predict(fit2_b,data.frame(x=xp))
lines(xp,yp,col='blue')

在此处输入图像描述

好的...为什么无截距拟合不同而包含截距的拟合相同?捕获再次处于正交性条件。

在使用fit_b的模型矩阵包含非正交元素的情况下,Gram 矩阵crossprod( model.matrix(fit_b) )远离对角线;fit2_b在元素是正交的情况下(crossprod( model.matrix(fit2_b) )实际上是对角线)。

因此,fit当我们将其扩展为包含截距时,fit_b我们更改了Gram 矩阵 的非对角线条目,因此结果拟合作为一个整体是不同的(不同的曲率、截距等)。与提供的配合尽管当我们将其扩展为包含截距时,因为我们只附加一个已经与我们拥有的列正交的列,但正交性与 0 次的常数多项式相反这只是导致我们的拟合线垂直移动截距。这就是为什么情节不同的原因。XTXfitfit2fit2_b

有趣的问题是为什么fit_bfit2_b是相同的?毕竟来自fit_b和的模型矩阵在面值fit2_b上是不一样的在这里,我们只需要最终记住这一点拥有相同的信息。只是它们的线性组合,因此它们的结果拟合基本上是相同的。在拟合系数中观察到的差异反映了值的线性重组,以便使它们正交。(参见 G. Grothendieck 的回答了解不同的示例。)fit_bfit2_bfit2_bfit_bfit_b