내 자세한 답변은 아래에 있지만 이런 종류의 질문에 대한 일반적인 (즉, 실제) 답변은 다음과 같습니다. 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
두 번째 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
이고 두 번째 열은 x^2
입니다. lm
폴리 가있는의 두 번째 호출은 어떻습니까? 의 반환은 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
네, 정말 다릅니다. 첫 번째 열은 아니고 x
두 번째 열은 그렇지 않습니다 x^2
. 그래서, 어떤 poly(x,2)
않습니다, 그것은 반환하지 않습니다 x
와 x^2
. 우리가 무엇을 알고 싶다면 poly
도움말 파일을 읽는 것으로 시작할 수 있습니다. 그래서 우리는 말합니다 help(poly)
. 설명은 다음과 같습니다.
지정된 점 집합 x에 대해 차수 1에서 차수의 직교 다항식을 반환하거나 평가합니다. 이것들은 모두 0 도의 상수 다항식에 직교합니다. 또는 원시 다항식을 평가하십시오.
지금, 당신은 "직교 다항식"이 무엇인지 안다. 그렇지 않은 경우 Wikipedia 또는 Bing 을 사용하십시오 (물론 Google은 애플만큼 나쁘지 않지만 여전히 나쁘기 때문에 Google이 아닙니다). 또는 직교 다항식이 무엇인지 상관하지 않을 수도 있습니다. "원시 다항식"이라는 문구가 표시 될 수 있으며 도움말 파일에서 기본적으로 poly
옵션 raw
과 같은 옵션 이 조금 더 FALSE
있습니다. 이 두 가지 고려 사항은 다음 중 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
위의 답변에는 두 가지 수준이 있습니다. 먼저, 나는 당신의 질문에 대답했습니다. 둘째, 훨씬 더 중요한 것은 여러분이 이와 같은 질문에 어떻게 대답해야하는지 설명했습니다. "프로그래밍 방법을 알고있는"모든 사람은 6 천만 번 이상의 순서를 거쳤습니다. 이 순서를 항상 거치면서 프로그래밍에 우울한 사람들조차도. 코드가 작동하지 않는 것은 정상입니다. 기능이 무엇인지 오해하는 것은 정상입니다. 이를 처리하는 방법은 주변을 둘러보고 실험하고 데이터를보고 RTFM을 보는 것입니다. "무시한 레시피 따르기"모드에서 "탐지"모드로 전환하십시오.