Saya mencoba membuat polinomial orde kedua untuk beberapa data yang saya miliki. Katakanlah saya merencanakan ini dengan ggplot()
:
ggplot(data, aes(foo, bar)) + geom_point() +
geom_smooth(method="lm", formula=y~poly(x, 2))
Saya mendapat:
Jadi, urutan kedua cocok dengan cukup baik. Saya menghitungnya dengan R:
summary(lm(data$bar ~ poly(data$foo, 2)))
Dan saya mendapatkan:
lm(formula = data$bar ~ poly(data$foo, 2))
# ...
# Coefficients:
# Estimate Std. Error t value Pr(>|t|)
# (Intercept) 3.268162 0.008282 394.623 <2e-16 ***
# poly(data$foo, 2)1 -0.122391 0.096225 -1.272 0.206
# poly(data$foo, 2)2 1.575391 0.096225 16.372 <2e-16 ***
# ....
Sekarang, saya akan menganggap formula untuk fit saya adalah:
Tapi itu hanya memberi saya nilai-nilai yang salah. Misalnya, dengan menjadi 3, saya harapkan menjadi sekitar 3,15. Namun, memasukkan ke rumus di atas saya dapatkan:
Apa yang menyebabkannya? Apakah saya salah menafsirkan koefisien model?
r
regression
interpretation
regression-coefficients
pengguna13907
sumber
sumber
poly
tanpa mengetik?poly
R terlebih dahulu? Yang mengatakan ' Hitung Polinomial Orthogonal ' di bagian atas dalam surat ramah besar.?poly
untuk memahami sintaks. Harus diakui, saya hanya memiliki sedikit pengetahuan tentang konsep di baliknya. Saya tidak tahu bahwa ada sesuatu yang lain (atau perbedaan besar antara polinom "normal" dan polinom ortogonal), dan contoh-contoh yang saya lihat online semuanya digunakanpoly()
untuk pemasangan, terutama denganggplot
- jadi mengapa saya tidak menggunakannya saja dan bingung apakah hasilnya "salah"? Pikiran Anda, saya tidak terampil dalam matematika — saya hanya menerapkan apa yang saya lihat dilakukan orang lain, dan mencoba memahaminya.Jawaban:
Jawaban terinci saya ada di bawah, tetapi jawaban umum (yaitu nyata) untuk pertanyaan seperti ini adalah: 1) bereksperimen, melihat-lihat, melihat data, Anda tidak dapat merusak komputer apa pun yang Anda lakukan, jadi. . . percobaan; atau 2) RTFM .
Berikut adalah beberapa
R
kode yang mereplikasi masalah yang diidentifikasi dalam pertanyaan ini, kurang lebih:Yang pertama
lm
mengembalikan jawaban yang diharapkan:Yang kedua
lm
mengembalikan sesuatu yang aneh:Karena
lm
sama dalam dua panggilan, itu harus menjadi argumenlm
yang berbeda. Jadi, mari kita lihat argumennya. Jelas,y
sama saja. Itu bagian lain. Mari kita lihat beberapa pengamatan pertama pada variabel sisi kanan pada panggilan pertamalm
. Pengembalianhead(cbind(x,x^2))
terlihat seperti:Ini seperti yang diharapkan. Kolom pertama adalah
x
dan kolom kedua adalahx^2
. Bagaimana dengan panggilan kedualm
, yang dengan poli? Pengembalianhead(poly(x,2))
terlihat seperti:Oke, itu sangat berbeda. Kolom pertama tidak
x
, dan kolom kedua tidakx^2
. Jadi, apa pun yangpoly(x,2)
terjadi, itu tidak kembalix
danx^2
. Jika kita ingin tahu apa yangpoly
terjadi, kita bisa mulai dengan membaca file bantuannya. Demikian kami katakanhelp(poly)
. Deskripsi mengatakan:Sekarang, apakah Anda tahu apa itu "polinomial ortogonal" atau tidak. Jika tidak, gunakan Wikipedia atau Bing (bukan Google, tentu saja, karena Google jahat --- tidak seburuk Apple, secara alami, tetapi masih buruk). Atau, Anda mungkin memutuskan bahwa Anda tidak peduli apa polinomial ortogonal itu. Anda mungkin memperhatikan frasa "polinomial mentah" dan Anda mungkin melihat sedikit lebih jauh di dalam file bantuan yang
poly
memiliki opsiraw
yang, secara default, sama denganFALSE
. Dua pertimbangan tersebut dapat menginspirasi Anda untuk mencobahead(poly(x, 2, raw=TRUE))
yang kembali:Gembira dengan penemuan ini (kelihatannya benar, sekarang, ya?), Anda mungkin mencoba
summary(lm(y ~ poly(x, 2, raw=TRUE)))
ini kembali:Setidaknya ada dua level untuk jawaban di atas. Pertama, saya jawab pertanyaan Anda. Kedua, dan yang jauh lebih penting, saya menggambarkan bagaimana Anda seharusnya menjawab pertanyaan seperti ini sendiri. Setiap orang yang "tahu cara memprogram" telah melalui urutan seperti yang di atas enam puluh juta kali. Bahkan orang-orang yang sangat buruk dalam pemrograman seperti saya melalui urutan ini sepanjang waktu. Itu normal untuk kode tidak bekerja. Adalah normal untuk salah memahami fungsi apa yang dilakukan. Cara untuk mengatasinya adalah dengan bermain-main, bereksperimen, melihat data, dan RTFM. Keluarlah dari mode "tanpa resep" dan masuk ke mode "detektif".
sumber
Ada pendekatan yang menarik untuk interpretasi regresi polinomial oleh Stimson et al. (1978) . Ini melibatkan penulisan ulang
sebagai
di manam = β0-β21/ 4 β2 β2 f=- β1/ 2 β2
sumber
Jika Anda hanya ingin dorongan ke arah yang benar tanpa penilaian terlalu banyak:
poly()
menciptakan polinomial ortogonal (tidak berkorelasi), yang bertentanganI()
, yang sepenuhnya mengabaikan korelasi antara polinomial yang dihasilkan. Korelasi antara variabel prediktor dapat menjadi masalah dalam model linier (lihat di sini untuk informasi lebih lanjut tentang mengapa korelasi dapat menjadi masalah), jadi mungkin lebih baik (secara umum) untuk digunakanpoly()
daripada menggunakanI()
. Sekarang, mengapa hasilnya terlihat sangat berbeda? Baik, keduanyapoly()
danI()
ambil x dan ubah menjadi x baru (dalam kasusI()
, x baru hanya x ^ 1 atau x ^ 2, dalam kasuspoly()
, x baru jauh lebih rumit (jika Anda ingin tahu dari mana mereka berasal (dan Anda mungkin tidak), Anda bisa memulaidi sini atau halaman Wikipedia yang disebutkan di atas atau buku teks). Intinya adalah, ketika Anda menghitung (memprediksi) y berdasarkan sekumpulan nilai x tertentu, Anda perlu menggunakan nilai x yang dikonversi yang dihasilkan oleh salah satupoly()
atauI()
(tergantung mana yang ada dalam model linier Anda). Begitu:Dalam hal ini, kedua model mengembalikan jawaban yang sama, yang menunjukkan bahwa korelasi antara variabel prediktor tidak mempengaruhi hasil Anda. Jika korelasi merupakan masalah, kedua metode akan memprediksi nilai yang berbeda.
sumber
'poli' melakukan Graham-Schmidt orto-normalisasi pada polinomial 1, x, x ^ 2, ..., x ^ deg Misalnya fungsi ini melakukan hal yang sama seperti 'poli' tanpa mengembalikan atribut 'coef' tentunya.
Saya mendarat di utas ini karena saya tertarik pada bentuk fungsional. Jadi bagaimana kita mengekspresikan hasil 'poli' sebagai ekspresi? Balikkan prosedur Graham-Schmidt. Anda akan berakhir berantakan!
sumber