Моя детальна відповідь наведена нижче, але загальна (тобто реальна) відповідь на таке питання: 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 до ступеня над заданим набором точок х. Всі вони є ортогональними до постійного многочлена ступеня 0. Крім того, оцініть неочищені многочлени.
Тепер ви або знаєте, що таке "ортогональні поліноми", або не знаєте. Якщо ви цього не зробите, то використовуйте Wikipedia або 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. Вийдіть з режиму "бездумно дотримуючись рецепта" і перейдіть в режим "детективу".