私の詳細な答えは下にありますが、この種の質問に対する一般的な(つまり本物の)答えは次のとおりです。1)実験、ねじ回し、データを見て、何をしようともコンピュータを壊すことはできません。。。実験; または2)RTFM。
以下にR
、この質問で特定された問題を多かれ少なかれ再現するコードを示します。
# 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))
最初lm
は期待される答えを返します:
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
2番目lm
は奇妙な何かを返します:
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
ためlm
の二つの呼び出しに同じであり、それは、引数でなければならないlm
異なっています。それでは、引数を見てみましょう。明らかにy
、同じです。他の部分です。の最初の呼び出しで、右側の変数に関する最初のいくつかの観察結果を見てみましょうlm
。の戻り値はhead(cbind(x,x^2))
次のようになります。
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
これは予想どおりです。最初の列はx
2番目の列はx^2
です。の2番目の呼び出しであるlm
polyの呼び出しはどうですか?の戻り値はhead(poly(x,2))
次のようになります。
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
OK、それは本当に違います。最初の列はそうx
ではなく、2番目の列はそうではありませんx^2
。そのため、何poly(x,2)
が返されてもx
、およびは返されませんx^2
。何poly
が必要かを知りたい場合は、ヘルプファイルを読むことから始めます。だから私たちは言いhelp(poly)
ます。説明は言う:
指定された点xのセットで次数1から次数の直交多項式を返すか評価します。これらはすべて次数0の定数多項式に直交します。あるいは、生の多項式を評価します。
これで、「直交多項式」が何であるかを知っているか、知らないかのどちらかです。そうでない場合は、ウィキペディアまたはBingを使用します(Googleはもちろん、Googleが悪であるため、Googleではありません。Appleほど悪くはありませんが、当然ですが、まだ悪いです)。または、直交多項式が何であるかを気にしないと決めるかもしれません。「生の多項式」というフレーズに気付くかもしれません。また、デフォルトではに等しいpoly
オプションraw
を持つヘルプファイルの少し下に気付くかもしれませんFALSE
。これらの2つの考慮事項は、head(poly(x, 2, raw=TRUE))
どのリターンを試すかを刺激します。
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
この発見に興奮して(今は正しいように見えますが、そうですか?)、試してみてくださいsummary(lm(y ~ poly(x, 2, raw=TRUE)))
。
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
上記の答えには少なくとも2つのレベルがあります。最初に、あなたの質問に答えました。第二に、さらに重要なことは、このような質問に自分で答える方法を説明したことです。「プログラミングの方法を知っている」すべての人が、600万回を超えるようなシーケンスを経験しています。私がいつもこのシーケンスを経験しているのと同じくらい、プログラミングが苦手な人でもです。コードが機能しないのは正常です。関数が何をするのかを誤解するのは普通です。それに対処する方法は、いじくり回し、実験し、データを見て、RTFMすることです。「ひたすらレシピに従う」モードから抜け出し、「探偵」モードにします。