R

為什麼我對手動多項式展開和使用 R poly 函數得到不同的預測?

  • May 1, 2017

為什麼我對手動多項式展開和使用 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 行相同。但為什麼?

正如您正確注意到的那樣,原始差異是因為在第一種情況下您使用“原始”多項式,而在第二種情況下您使用正交多項式。因此,如果後面的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 矩陣的非對角線項 因此,與 提供的擬合相比,得到的擬合作為一個整體(不同的曲率、截距等)是不同的fit。儘管當fit2我們將其擴展為包含一個截距時,fit2_b我們只附加一個已經與我們擁有的列正交的列,但正交性與 0 次的常數多項式相反。這只是導致我們的擬合線垂直移動截距。這就是為什麼情節不同的原因。

有趣的問題是為什麼fit_bfit2_b是相同的?畢竟來自fit_b和的模型矩陣在面值fit2_b上是不一樣的。在這裡,我們只需要最終記住這一點並擁有相同的信息。只是它們的線性組合,因此它們的結果擬合基本上是相同的。在擬合係數中觀察到的差異反映了值的線性重組,以便使它們正交。(參見 G. Grothendieck 的回答了解不同的示例。)fit_b``fit2_b``fit2_b``fit_b``fit_b

引用自:https://stats.stackexchange.com/questions/276987

comments powered by Disqus