Minha resposta detalhada está abaixo, mas a resposta geral (ou seja, real) a esse tipo de pergunta é: 1) experimente, dê uma olhada, veja os dados, você não pode quebrar o computador, não importa o que faça. . . experimentar; ou 2) RTFM .
Aqui está um R
código que replica o problema identificado nesta pergunta, mais ou menos:
# 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))
O primeiro lm
retorna a resposta esperada:
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
O segundo lm
retorna algo estranho:
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
Como lm
é o mesmo nas duas chamadas, os argumentos lm
são diferentes. Então, vamos olhar para os argumentos. Obviamente, y
é o mesmo. São as outras partes. Vejamos as primeiras observações sobre as variáveis do lado direito na primeira chamada de lm
. O retorno de head(cbind(x,x^2))
parece:
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
Isto é como esperado. A primeira coluna é x
e a segunda coluna é x^2
. Que tal a segunda chamada de lm
, aquela com poli? O retorno de se head(poly(x,2))
parece com:
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, isso é realmente diferente. A primeira coluna não é x
e a segunda coluna não x^2
. Então, o poly(x,2)
que quer que faça, ele não retorna x
e x^2
. Se quisermos saber o que poly
faz, podemos começar lendo seu arquivo de ajuda. É o que dizemos help(poly)
. A descrição diz:
Retorna ou avalia polinômios ortogonais de grau 1 a grau sobre o conjunto especificado de pontos x. Tudo isso é ortogonal ao polinômio constante de grau 0. Como alternativa, avalie os polinômios brutos.
Agora, você sabe o que são "polinômios ortogonais" ou não. Caso contrário, use a Wikipedia ou o Bing (não o Google, é claro, porque o Google é ruim - não tão ruim quanto a Apple, naturalmente, mas ainda ruim). Ou então, você pode decidir que não se importa com o que são polinômios ortogonais. Você pode notar a frase "polinômios brutos" e um pouco mais abaixo no arquivo de ajuda que poly
possui uma opção raw
que é, por padrão, igual a FALSE
. Essas duas considerações podem inspirá-lo a experimentar head(poly(x, 2, raw=TRUE))
quais retornos:
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
Animado com essa descoberta (parece certo, agora, sim?), Você pode tentar: summary(lm(y ~ poly(x, 2, raw=TRUE)))
Isso retorna:
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
Existem pelo menos dois níveis na resposta acima. Primeiro, eu respondi sua pergunta. Segundo, e muito mais importante, ilustrei como você deve responder a perguntas como essa. Toda pessoa que "sabe programar" passou por uma sequência como a acima de sessenta milhões de vezes. Até pessoas tão deprimente em programação quanto eu passam por essa sequência o tempo todo. É normal que o código não funcione. É normal entender mal o que as funções fazem. A maneira de lidar com isso é mexer, experimentar, examinar os dados e o RTFM. Saia do modo "sem pensar em seguir uma receita" e entre no modo "detetive".