為什麼我對手動多項式展開和使用 R poly
函數得到不同的預測?
為什麼我對手動多項式展開和使用 R
poly
函數得到不同的預測?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_b
和fit2_b
是相同的?畢竟來自fit_b
和的模型矩陣在面值fit2_b
上是不一樣的。在這裡,我們只需要最終記住這一點並擁有相同的信息。只是它們的線性組合,因此它們的結果擬合基本上是相同的。在擬合係數中觀察到的差異反映了值的線性重組,以便使它們正交。(參見 G. Grothendieck 的回答,了解不同的示例。)fit_b``fit2_b``fit2_b``fit_b``fit_b