Мой подробный ответ ниже, но общий (то есть реальный) ответ на этот вопрос: 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)
. В описании сказано:
Возвращает или оценивает ортогональные полиномы степени 1 в степени по указанному набору точек x. Все они ортогональны постоянному многочлену степени 0. В качестве альтернативы оценивают необработанные многочлены.
Теперь либо вы знаете, что такое "ортогональные полиномы", либо нет. Если вы этого не сделаете, то используйте Википедию или Bing (конечно, не Google, потому что Google злой - естественно, не такой плохой, как Apple, но все же плохой). Или вы можете решить, что вам все равно, что такое ортогональные многочлены. Вы можете заметить фразу «необработанные полиномы» и заметить немного дальше в файле справки, 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
На ответ выше есть как минимум два уровня. Сначала я ответил на ваш вопрос. Во-вторых, и, что гораздо важнее, я проиллюстрировал, как вы должны сами отвечать на подобные вопросы. Каждый человек, который «знает, как программировать», прошел последовательность, подобную приведенной выше, шестьдесят миллионов раз. Даже люди, столь же удручающе плохие в программировании, как и я, постоянно проходят через эту последовательность. Это нормально, когда код не работает. Нормально неправильно понимать, что делают функции. Способ справиться с этим - обойтись, поэкспериментировать, посмотреть на данные и RTFM. Выйдите из режима «бездумного следования рецепту» и «детективного» режима.