Mi respuesta detallada está más abajo, pero la respuesta general (es decir, real) a este tipo de preguntas es: 1) experimentar, trastear, mirar los datos, no puedes romper el ordenador hagas lo que hagas, así que... experimenta; o 2) lee la documentación.
Aquí hay algunos R
código que replica el problema identificado en esta pregunta, más o 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))
La primera lm
devuelve la respuesta 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
El segundo lm
devuelve algo impar:
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
Desde lm
es el mismo en las dos llamadas, tienen que ser los argumentos de lm
que son diferentes. Así pues, veamos los argumentos. Obviamente, y
es el mismo. Son las otras partes. Veamos las primeras observaciones de las variables del lado derecho en la primera llamada de lm
. El regreso 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
Esto es lo que se esperaba. La primera columna es x
y la segunda columna es x^2
. ¿Qué tal la segunda llamada de lm
¿el que tiene poli? El regreso de head(poly(x,2))
parece:
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, eso es realmente diferente. La primera columna no es x
y la segunda columna no es x^2
. Por lo tanto, lo que poly(x,2)
no devuelve x
y x^2
. Si queremos saber qué poly
podemos empezar por leer su archivo de ayuda. Así que decimos help(poly)
. La descripción dice:
Devuelve o evalúa polinomios ortogonales de grado 1 a grado sobre el conjunto especificado de puntos x. Estos son todos ortogonales al polinomio constante de grado 0. Alternativamente, evalúa polinomios crudos.
Ahora bien, o sabes lo que son los "polinomios ortogonales" o no lo sabes. Si no lo sabes, entonces usa Wikipedia o Bing (no Google, por supuesto, porque Google es malo - no tan malo como Apple, naturalmente, pero sigue siendo malo). O puede que decidas que no te importa lo que son los polinomios ortogonales. Puede que te fijes en la frase "polinomios brutos" y que notes un poco más abajo en el archivo de ayuda que poly
tiene una opción raw
que es, por defecto, igual a FALSE
. Estas dos consideraciones podrían inspirarle a probar head(poly(x, 2, raw=TRUE))
que devuelve:
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
Entusiasmado por este descubrimiento (parece correcto, ahora, ¿sí?), podría pasar a probar summary(lm(y ~ poly(x, 2, raw=TRUE)))
Esto vuelve:
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
La respuesta anterior tiene al menos dos niveles. En primer lugar, he respondido a su pregunta. En segundo lugar, y mucho más importante, he ilustrado cómo se supone que debes responder tú mismo a preguntas como ésta. Todas las personas que "saben programar" han pasado por una secuencia como la anterior sesenta millones de veces. Incluso personas tan deprimentemente malas en programación como yo pasan por esta secuencia todo el tiempo. Es normal que el código no funcione. Es normal que no se entienda lo que hacen las funciones. La manera de lidiar con ello es atornillar, experimentar, mirar los datos, y RTFM. Salir del modo "seguir una receta sin sentido" y entrar en el modo "detective".
7 votos
Esta pregunta se responde en varios hilos que se pueden encontrar buscando en nuestro sitio polinomio ortogonal
20 votos
@whuber Si hubiera sabido que el problema era con "polinomios ortogonales", probablemente habría encontrado una respuesta. Pero si no sabes qué buscar, es un poco difícil.
4 votos
También puede encontrar respuestas buscando en poli que aparece de forma destacada en su código. Pongo esta información en los comentarios por dos razones: (1) los enlaces pueden ayudar a futuros lectores así como a ti mismo y (2) pueden ayudar a mostrar cómo explotar nuestro (algo idiosincrático) sistema de búsqueda.
8 votos
Usted publicó una pregunta relacionada con el uso de
poly
sin escribir?poly
¿en R primero? Eso dice ' Calcular polinomios ortogonales ' en la parte superior en letras grandes y amigables.7 votos
@Glen_b Sí, bueno, yo hizo teclear
?poly
para entender la sintaxis. Hay que admitir que tengo poco conocimiento de los conceptos que hay detrás. No sabía que había algo más (o una diferencia tan grande entre los polinomios "normales" y los polinomios ortogonales), y los ejemplos que vi en Internet utilizaban todospoly()
para el ajuste, especialmente conggplot
- por lo que no lo haría ¿Simplemente uso eso y me confundo si el resultado fue "incorrecto"? Eso sí, no soy experto en matemáticas, simplemente aplico lo que he visto hacer a otros y trato de entenderlo.0 votos
Creo que lo entiendo - habías visto el término, pero no entendías que $x$ y $x^2$ (digamos) no solían ser ortogonales.