Ayrıntılı cevabım aşağıda, ancak bu tür bir sorunun genel (yani gerçek) cevabı şöyledir: 1) deney yapın, etrafa bakın, verilere bakın, ne yaparsanız yapın, bilgisayarı kıramazsınız. . . deneme; veya 2) RTFM .
Aşağıda, R
bu soruda tanımlanan sorunu çoğaltan, az ya da çok kod:
# 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))
İlk lm
beklenen yanıtı verir:
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
İkincisi lm
garip bir şey döndürür:
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
Yana lm
iki arama aynıdır, bu argümanları olmak zorunda lm
farklı olan. Öyleyse tartışmalara bakalım. Açıkçası, y
aynı. Diğer kısımlar. İlk çağrıdaki sağ taraf değişkenleriyle ilgili ilk birkaç gözlemi inceleyelim lm
. head(cbind(x,x^2))
Gibi görünüyor dönüş :
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
Beklendiği gibi bu. Birinci sütun x
ve ikinci sütun x^2
. lm
Poli ile olan ikinci çağrıya ne dersiniz ? head(poly(x,2))
Gibi görünüyor dönüş :
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
Tamam, bu gerçekten farklı. İlk sütun değil x
ve ikinci sütun değil x^2
. Öyleyse, ne poly(x,2)
yaparsa yap, geri dönmüyor x
ve x^2
. Ne olduğunu bilmek istiyorsak poly
, yardım dosyasını okuyarak başlayabiliriz. Biz diyoruz help(poly)
. Açıklama diyor ki:
Belirtilen x nokta kümesi üzerinde dereceye kadar derece 1 dereceli ortogonal polinomları döndürür veya değerlendirir. Bunların hepsi derece 0 sabit polinomuna diktir. Alternatif olarak, ham polinomları değerlendirin.
Şimdi, ya “dikgen polinomların” ne olduğunu biliyorsunuz ya da bilmiyorsunuz. Bunu yapmazsanız, Wikipedia ya da Bing'i kullanın (elbette Google değil, çünkü Google kötüdür --- Apple kadar kötü değil, doğal ama yine de kötü). Veya, ortogonal polinomların ne olduğu ile ilgilenmediğinize karar verebilirsiniz. "Ham polinomlar" ifadesini fark edebilirsiniz ve yardım dosyasında , varsayılan olarak eşit olan poly
bir seçeneğe raw
sahip olan bir miktar daha fark edebilirsiniz FALSE
. Bu iki düşünce, head(poly(x, 2, raw=TRUE))
hangi sonuçların alınacağını denemenize ilham verebilir :
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
Bu keşifle heyecanlı (doğru görünüyor, şimdi, evet?), Denemeye devam edebilirsiniz summary(lm(y ~ poly(x, 2, raw=TRUE)))
Bu döner:
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
Yukarıdaki cevabın en az iki seviyesi vardır. İlk önce sorunuzu cevapladım. İkincisi, ve daha da önemlisi, bu gibi soruları kendiniz cevaplamaya nasıl devam etmeniz gerektiğini açıkladım. “Nasıl programlanacağını bilen” her bir kişi, altmış milyondan fazla olan bir sıralamadan geçmiştir. Programlamada benim kadar iç karartıcı derecede kötü insanlar bile bu sıradan geçiyorlar. Kodun çalışmaması normaldir. İşlevlerin ne yaptığını yanlış anlamak normaldir. Bununla başa çıkmanın yolu, etrafta dolaşmak, deney yapmak, verilere bakmak ve RTFM'yi incelemektir. Kendinizi "bir tarifi takip etmeden akılsızca" modundan ve "dedektif" modundan çıkarın.