Mengapa saya mendapatkan prediksi berbeda untuk ekspansi polinomial manual dan menggunakan fungsi R `poly`?

10

Mengapa saya mendapatkan prediksi berbeda untuk ekspansi polinomial manual dan menggunakan polyfungsi R ?

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)

masukkan deskripsi gambar di sini

Usaha saya:

  • Tampaknya menjadi masalah dengan mencegat, ketika saya cocok dengan model mencegat, yaitu, tidak ada -1dalam model formula, dua garis itu sama. Tetapi mengapa tanpa intersep kedua garis itu berbeda?

  • "Perbaikan" lainnya menggunakan rawekspansi polinomial alih-alih polinomial ortogonal. Jika kita mengubah kode menjadi fit2 = lm(y~ poly(x,degree=2, raw=T) -1), akan membuat 2 baris sama. Tapi kenapa?

Haitao Du
sumber
4
Ini bukan topik dari pertanyaan Anda, tetapi Anda sering sangat terbuka untuk komentar. Saat membaca kode Anda, hal pertama yang saya perhatikan adalah bahwa Anda menggunakan =dan <-untuk penugasan tidak konsisten. Saya benar-benar tidak akan melakukan ini, itu tidak benar-benar membingungkan, tetapi menambahkan banyak suara visual ke kode Anda tanpa manfaat. Anda harus memilih satu atau yang lain untuk digunakan dalam kode pribadi Anda, dan tetap menggunakannya.
Matthew Drury
terima kasih telah membantu saya dalam coding! pertanyaan diperbaiki. @MatthewDrury
Haitao Du
3
Acak tindak lanjut tip untuk membuat <-kurang dari kerumitan untuk mengetik: alt+-.
JAD
@JarkoDubbeldam terima kasih atas tip kodingnya. Saya suka jalan pintas papan kunci
Haitao Du

Jawaban:

12

Seperti yang Anda perhatikan dengan benar, perbedaan aslinya adalah karena dalam kasus pertama Anda menggunakan polinomial "mentah" sedangkan dalam kasus kedua Anda menggunakan polinomial ortogonal. Karenanya jika lmpanggilan selanjutnya diubah menjadi: fit3<-lm(y~ poly(x,degree=2, raw = TRUE) -1)kami akan mendapatkan hasil yang sama antara fitdan fit3. Alasan mengapa kami mendapatkan hasil yang sama dalam kasus ini adalah "sepele"; kami cocok dengan model yang sama persis seperti yang kami cocokkan fit<-lm(y~.-1,data=x_exp), tidak ada kejutan di sana.

Seseorang dapat dengan mudah memeriksa bahwa matriks model oleh kedua model itu sama all.equal( model.matrix(fit), model.matrix(fit3) , check.attributes= FALSE) # TRUE).


Yang lebih menarik adalah mengapa Anda akan mendapatkan plot yang sama saat menggunakan intersep. Hal pertama yang perlu diperhatikan adalah bahwa, saat memasang model dengan intersep

  • Dalam kasus fit2kami hanya memindahkan prediksi model secara vertikal; bentuk kurva yang sebenarnya sama.

  • Di sisi lain termasuk intersep dalam hal fithasil menjadi tidak hanya garis yang berbeda dalam hal penempatan vertikal tetapi dengan keseluruhan bentuk yang berbeda secara keseluruhan.

Kita dapat dengan mudah melihat bahwa hanya dengan menambahkan kecocokan berikut pada plot yang ada.

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')

masukkan deskripsi gambar di sini

OKE ... Mengapa cocok no-intersep berbeda sedangkan cocok intercept-termasuk adalah sama? Tangkapan sekali lagi pada kondisi orthogonality.

Dalam kasus fit_bmatriks model yang digunakan mengandung unsur-unsur non-ortogonal, matriks Gram crossprod( model.matrix(fit_b) )jauh dari diagonal; dalam kasus fit2_bunsur-unsurnya ortogonal ( crossprod( model.matrix(fit2_b) )efektif diagonal).

Seperti halnya dalam kasus fitketika kami memperluasnya untuk memasukkan intersep dalam fit_bkami mengubah entri off-diagonal dari matriks Gram dan dengan demikian cocok yang dihasilkan berbeda secara keseluruhan (kelengkungan berbeda, intersep, dll.) Sebagai perbandingan dengan fit yang disediakan oleh . Dalam kasus ketika kita memperluasnya untuk memasukkan intersep seperti pada kita hanya menambahkan kolom yang sudah ortogonal ke kolom yang kita miliki, ortogonalitas berlawanan dengan polinomial konstan derajat 0 . Ini hanya menghasilkan memindahkan garis dipasang secara vertikal oleh intersep. Inilah sebabnya mengapa plotnya berbeda.XTXfitfit2fit2_b

Yang menarik dari pertanyaan adalah mengapa fit_bdan fit2_bitu sama; setelah semua model dari matriks fit_bdan fit2_btidak sama dalam nilai nominal . Di sini kita hanya perlu mengingat itu pada akhirnya fit_bdan fit2_bmemiliki informasi yang sama. fit2_bhanya kombinasi linear dari fit_bjadi pada dasarnya cocok mereka akan sama. Perbedaan yang diamati dalam koefisien yang sesuai mencerminkan rekombinasi linear dari nilai-nilai fit_buntuk membuatnya ortogonal. (lihat G. Grothendieck menjawab di sini juga untuk contoh berbeda.)

usεr11852
sumber
+2.5 terima kasih atas jawaban Anda. Untuk grafik terakhir, saya belajar dari @kjetilb halvorsen: Satu lagi cara abstrak untuk menggambarkan ini adalah bahwa model itu sendiri hanya bergantung pada subruang linear tertentu, yaitu ruang kolom yang ditentukan oleh matriks desain. Tetapi parameternya, tidak hanya bergantung pada subruang ini, tetapi juga atas dasar subruang itu, diberikan oleh variabel spesifik yang digunakan, yaitu kolom itu sendiri. Prediksi dari model, misalnya, hanya akan bergantung pada subruang linier, bukan pada basis yang dipilih.
Haitao Du
harap Anda tidak keberatan, saya memformat ulang sedikit ..
Haitao Du
@ hxd1011: Tidak ada masalah sama sekali, terima kasih telah meluangkan waktu untuk "menyisir" sedikit.
usεr11852