Estoy tratando de crear un ajuste polinómico de segundo orden para algunos datos que tengo. Digamos que trazo esto en forma con ggplot()
:
ggplot(data, aes(foo, bar)) + geom_point() +
geom_smooth(method="lm", formula=y~poly(x, 2))
Yo obtengo:
Por lo tanto, un ajuste de segundo orden funciona bastante bien. Lo calculo con R:
summary(lm(data$bar ~ poly(data$foo, 2)))
Y obtengo:
lm(formula = data$bar ~ poly(data$foo, 2))
# ...
# Coefficients:
# Estimate Std. Error t value Pr(>|t|)
# (Intercept) 3.268162 0.008282 394.623 <2e-16 ***
# poly(data$foo, 2)1 -0.122391 0.096225 -1.272 0.206
# poly(data$foo, 2)2 1.575391 0.096225 16.372 <2e-16 ***
# ....
Ahora, supongo que la fórmula para mi ajuste es:
Pero eso solo me da los valores incorrectos. Por ejemplo, con siendo 3, esperaría que convierta en algo alrededor de 3.15. Sin embargo, insertando en la fórmula anterior obtengo:
¿Lo que da? ¿Estoy interpretando incorrectamente los coeficientes del modelo?
r
regression
interpretation
regression-coefficients
usuario13907
fuente
fuente
poly
sin escribir?poly
primero en R? Eso dice ' Calcular polinomios ortogonales ' en la parte superior en letras grandes y amigables.?poly
entender la sintaxis. Es cierto que tengo muy poco conocimiento de los conceptos detrás de esto. 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 línea todos se usabanpoly()
para el ajuste, especialmente conggplot
, entonces, ¿por qué no usaría eso y confundirse si el resultado fue "incorrecto"? Eso sí, no soy experto en matemáticas, simplemente estoy aplicando lo que he visto hacer a otros y tratando de entenderlo.Respuestas:
Mi respuesta detallada está a continuación, pero la respuesta general (es decir, real) a este tipo de pregunta es: 1) experimentar, atornillar, mirar los datos, no puedes romper la computadora sin importar lo que hagas, entonces. . . experimentar; o 2) RTFM .
Aquí hay un
R
código que replica el problema identificado en esta pregunta, más o menos:El primero
lm
devuelve la respuesta esperada:El segundo
lm
devuelve algo extraño:Dado que
lm
es lo mismo en las dos llamadas, tiene que ser los argumentos de loslm
cuales son diferentes. Entonces, veamos los argumentos. Obviamente,y
es lo mismo. Son las otras partes. Veamos las primeras observaciones sobre las variables del lado derecho en la primera llamada delm
. El regreso dehead(cbind(x,x^2))
parece:Esto es como se esperaba. La primera columna es
x
y la segunda columna esx^2
. ¿Qué tal la segunda llamada delm
, la que tiene poli? El regreso dehead(poly(x,2))
parece:OK, eso es muy diferente. La primera columna no es
x
, y la segunda columna no lo esx^2
. Entonces,poly(x,2)
haga lo que haga, no regresax
yx^2
. Si queremos saber quépoly
hace, podríamos comenzar leyendo su archivo de ayuda. Eso decimos nosotroshelp(poly)
. La descripción dice:Ahora, o sabes qué son los "polinomios ortogonales" o no. Si no lo hace, use Wikipedia o Bing (no Google, por supuesto, porque Google es malvado, no tan malo como Apple, naturalmente, pero sigue siendo malo). O bien, puede decidir que no le importa qué son los polinomios ortogonales. Puede notar la frase "polinomios en bruto" y puede notar un poco más abajo en el archivo de ayuda que
poly
tiene una opciónraw
que, por defecto, es igual aFALSE
. Esas dos consideraciones pueden inspirarlo a probarhead(poly(x, 2, raw=TRUE))
qué retornos:Emocionado por este descubrimiento (parece correcto, ahora, ¿sí?), Puede continuar.
summary(lm(y ~ poly(x, 2, raw=TRUE)))
Esto devuelve:Hay al menos dos niveles para la respuesta anterior. Primero, respondí tu pregunta. Segundo, y mucho más importante, ilustré cómo se supone que debes responder preguntas como esta tú mismo. Cada persona que "sabe programar" ha pasado por una secuencia como la que se menciona más de sesenta millones de veces. Incluso las personas tan deprimentemente malas en la programación como yo pasan por esta secuencia todo el tiempo. Es normal que el código no funcione. Es normal entender mal las funciones que hacen. La forma de lidiar con esto es atornillar, experimentar, mirar los datos y RTFM. Sal del modo de "seguir una receta sin pensar" y entra en el modo "detective".
fuente
Hay un enfoque interesante para la interpretación de la regresión polinómica por Stimson et al. (1978) . Implica reescribir
como
fuente
Si solo desea un empujón en la dirección correcta sin tanto juicio:
poly()
crea polinomios ortogonales (no correlacionados), en lugar deI()
, que ignora por completo la correlación entre los polinomios resultantes. La correlación entre las variables predictoras puede ser un problema en los modelos lineales (consulte aquí para obtener más información sobre por qué la correlación puede ser problemática), por lo que probablemente sea mejor (en general) usar enpoly()
lugar deI()
. Ahora, ¿por qué los resultados se ven tan diferentes? Bueno, ambospoly()
yI()
tome x y conviértalo en una nueva x (en el caso deI()
, la nueva x es solo x ^ 1 o x ^ 2, en el caso depoly()
, las nuevas x son mucho más complicadas (si quiere saber de dónde vienen (y probablemente no), puede comenzaraquí o la página de Wikipedia antes mencionada o un libro de texto). El punto es que, cuando estás calculando (prediciendo) y en función de un conjunto particular de valores de x, debes usar los valores de x convertidos producidos por cualquierapoly()
oI()
(dependiendo de cuál estaba en tu modelo lineal). Asi que:En este caso, ambos modelos devuelven la misma respuesta, lo que sugiere que la correlación entre las variables predictoras no influye en los resultados. Si la correlación fuera un problema, los dos métodos predecirían valores diferentes.
fuente
'poly' realiza la orto-normalización de Graham-Schmidt en los polinomios 1, x, x ^ 2, ..., x ^ deg Por ejemplo, esta función hace lo mismo que 'poly' sin devolver los atributos 'coef', por supuesto.
Llegué a este hilo porque estaba interesado en la forma funcional. Entonces, ¿cómo expresamos el resultado de 'poli' como expresión? Simplemente invierta el procedimiento de Graham-Schmidt. ¡Terminarás con un desastre!
fuente