手動の多項式展開とRの `poly`関数を使用して異なる予測を取得するのはなぜですか?


10

手動多項式展開と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にない場合、2つの線は同じになります。しかし、なぜ切片なしで2つの線が異なるのですか?

  • 別の「修正」はraw、直交多項式の代わりに多項式展開を使用することです。コードをに変更するfit2 = lm(y~ poly(x,degree=2, raw=T) -1)と、2行が同じになります。しかし、なぜ?


4
これはあなたの質問から外れたトピックですが、多くの場合、コメントに対して非常にオープンです。コードを読んでいるときに最初に気付くのは、使用=<-割り当てに一貫性がないことです。私は本当にこれをしません、それは正確に混乱するわけではありませんが、それはあなたのコードに多くの視覚的なノイズを追加し、利益はありません。あなたは自分の個人コードで使用するためにどちらか一方に落ち着いて、それに固執するべきです。
マシュードゥルーリー2017年

コーディングを手伝ってくれてありがとう!質問を修正しました。@MatthewDrury
Haitao Du

3
<-入力の手間を軽減するためのランダムなフォローアップのヒント:alt+-
JAD 2017年

@JarkoDubbeldamコーディングのヒントをありがとう。キーボードのショートカットが大好き
Haitao Du

回答:


12

最初の違いは、最初のケースでは「生の」多項式を使用しているのに対し、2番目のケースでは直交多項式を使用しているためです。したがって、後のlm呼び出しが次のように変更された場合、とのfit3<-lm(y~ poly(x,degree=2, raw = TRUE) -1)fitで同じ結果が得られ fit3ます。理由なぜ我々はこのケースで同じ結果を得るには、「些細な」です。に装着したモデルとまったく同じモデルを装着しfit<-lm(y~.-1,data=x_exp)ました。驚きはありません。

2つのモデルによるモデルマトリックスが同じであることを簡単に確認できます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')

ここに画像の説明を入力してください

OK ...切片を含むフィットが同じであるのに、切片なしのフィットが異なるのはなぜですか?キャッチは再び直交性の条件にあります。

fit_b使用されるモデルマトリックスに非直交要素が含まれている場合、グラムマトリックスcrossprod( model.matrix(fit_b) )は対角線から離れています。fit2_b要素が直交している場合(crossprod( model.matrix(fit2_b) )実質的に対角線)。

fitfit_b XTXfitfit2fit2_b

興味深い質問は、fit_bfit2_bが同じである理由です。後にすべてのモデルから行列fit_bfit2_b同じではありません額面で。ここでは、最終的にfit_bそれを覚えfit2_bて、同じ情報を持つ必要があるだけです。fit2_bの線形結合にfit_bすぎないので、基本的にはそれらの結果のフィットは同じになります。当てはめられた係数で観察された違いは、値をfit_b直交させるための値の線形再結合を反映しています。(別の例については、ここでもG. Grothendieckの回答を参照してください。)


+2.5すばらしい回答に感謝します。最終的なグラフについて、@ kjetilb halvorsenから学びました。これを説明するもう1つの抽象的な方法は、モデル自体が特定の線形部分空間、つまり計画行列によって定義された列空間にのみ依存するということです。しかし、パラメーターは、このサブスペースだけでなく、使用される特定の変数、つまり列自体によって与えられるそのサブスペースの基準にも依存します。たとえば、モデルからの予測は、選択した基準ではなく、線形部分空間にのみ依存します。
Haitao Du

あなたが気にしない願って、私は少し再フォーマット...
ハイタオ・ドゥを

@ hxd1011:少し問題を解消してくれてありがとう。
usεr11852
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.