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:
# This program written in response to a Cross Validated question
# http://stats.stackexchange.com/questions/95939/
#
# It is an exploration of why the result from lm(y_x+I(x^2))
# looks so different from the result from lm(y~poly(x,2))
library(ggplot2)
epsilon <- 0.25*rnorm(100)
x <- seq(from=1, to=5, length.out=100)
y <- 4 - 0.6*x + 0.1*x^2 + epsilon
# Minimum is at x=3, the expected y value there is
4 - 0.6*3 + 0.1*3^2
ggplot(data=NULL,aes(x, y)) + geom_point() +
geom_smooth(method = "lm", formula = y ~ poly(x, 2))
summary(lm(y~x+I(x^2))) # Looks right
summary(lm(y ~ poly(x, 2))) # Looks like garbage
# What happened?
# What do x and x^2 look like:
head(cbind(x,x^2))
#What does poly(x,2) look like:
head(poly(x,2))
Yang pertama lm
mengembalikan jawaban yang diharapkan:
Call:
lm(formula = y ~ x + I(x^2))
Residuals:
Min 1Q Median 3Q Max
-0.53815 -0.13465 -0.01262 0.15369 0.61645
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.92734 0.15376 25.542 < 2e-16 ***
x -0.53929 0.11221 -4.806 5.62e-06 ***
I(x^2) 0.09029 0.01843 4.900 3.84e-06 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.2241 on 97 degrees of freedom
Multiple R-squared: 0.1985, Adjusted R-squared: 0.182
F-statistic: 12.01 on 2 and 97 DF, p-value: 2.181e-05
Yang kedua lm
mengembalikan sesuatu yang aneh:
Call:
lm(formula = y ~ poly(x, 2))
Residuals:
Min 1Q Median 3Q Max
-0.53815 -0.13465 -0.01262 0.15369 0.61645
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.24489 0.02241 144.765 < 2e-16 ***
poly(x, 2)1 0.02853 0.22415 0.127 0.899
poly(x, 2)2 1.09835 0.22415 4.900 3.84e-06 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.2241 on 97 degrees of freedom
Multiple R-squared: 0.1985, Adjusted R-squared: 0.182
F-statistic: 12.01 on 2 and 97 DF, p-value: 2.181e-05
Karena lm
sama dalam dua panggilan, itu harus menjadi argumen lm
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 pertama lm
. Pengembalian head(cbind(x,x^2))
terlihat seperti:
x
[1,] 1.000000 1.000000
[2,] 1.040404 1.082441
[3,] 1.080808 1.168146
[4,] 1.121212 1.257117
[5,] 1.161616 1.349352
[6,] 1.202020 1.444853
Ini seperti yang diharapkan. Kolom pertama adalah x
dan kolom kedua adalah x^2
. Bagaimana dengan panggilan kedua lm
, yang dengan poli? Pengembalian head(poly(x,2))
terlihat seperti:
1 2
[1,] -0.1714816 0.2169976
[2,] -0.1680173 0.2038462
[3,] -0.1645531 0.1909632
[4,] -0.1610888 0.1783486
[5,] -0.1576245 0.1660025
[6,] -0.1541602 0.1539247
Oke, itu sangat berbeda. Kolom pertama tidak x
, dan kolom kedua tidak x^2
. Jadi, apa pun yang poly(x,2)
terjadi, itu tidak kembali x
dan x^2
. Jika kita ingin tahu apa yang poly
terjadi, kita bisa mulai dengan membaca file bantuannya. Demikian kami katakan help(poly)
. Deskripsi mengatakan:
Mengembalikan atau mengevaluasi polinomial ortogonal dari derajat 1 ke derajat selama set poin yang ditentukan x. Ini semua ortogonal ke polinomial konstan derajat 0. Atau, mengevaluasi polinomial mentah.
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 opsi raw
yang, secara default, sama dengan FALSE
. Dua pertimbangan tersebut dapat menginspirasi Anda untuk mencoba head(poly(x, 2, raw=TRUE))
yang kembali:
1 2
[1,] 1.000000 1.000000
[2,] 1.040404 1.082441
[3,] 1.080808 1.168146
[4,] 1.121212 1.257117
[5,] 1.161616 1.349352
[6,] 1.202020 1.444853
Gembira dengan penemuan ini (kelihatannya benar, sekarang, ya?), Anda mungkin mencoba summary(lm(y ~ poly(x, 2, raw=TRUE)))
ini kembali:
Call:
lm(formula = y ~ poly(x, 2, raw = TRUE))
Residuals:
Min 1Q Median 3Q Max
-0.53815 -0.13465 -0.01262 0.15369 0.61645
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.92734 0.15376 25.542 < 2e-16 ***
poly(x, 2, raw = TRUE)1 -0.53929 0.11221 -4.806 5.62e-06 ***
poly(x, 2, raw = TRUE)2 0.09029 0.01843 4.900 3.84e-06 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.2241 on 97 degrees of freedom
Multiple R-squared: 0.1985, Adjusted R-squared: 0.182
F-statistic: 12.01 on 2 and 97 DF, p-value: 2.181e-05
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".