¿Por qué obtengo resultados muy diferentes para poli (raw = T) frente a poly ()?

10

Quiero modelar dos variables de tiempo diferentes, algunas de las cuales son muy colineales en mis datos (edad + cohorte = período). Al hacer esto me encontré con algunos problemas lmere interacciones poly(), pero probablemente no se limite a lmer, obtuve los mismos resultados con nlmeIIRC.

Obviamente, no entiendo lo que hace la función poly (). Entiendo lo que poly(x,d,raw=T)hace y pensé que sin raw=Tél se hacen polinomios ortogonales (no puedo decir que realmente entiendo lo que eso significa), lo que facilita el ajuste, pero no te permite interpretar los coeficientes directamente.
Yo leí eso porque soy utilizando la función de predecir, las predicciones deben ser los mismos.

Pero no lo son, incluso cuando los modelos convergen normalmente. Estoy usando variables centradas y primero pensé que quizás el polinomio ortogonal conduce a una mayor correlación de efectos fijos con el término de interacción colineal, pero parece comparable. He pegado dos resúmenes de modelos por aquí .

Esperamos que estas tramas ilustren el alcance de la diferencia. Usé la función de predicción que solo está disponible en el desarrollador. versión de lme4 (lo escuché aquí ), pero los efectos fijos son los mismos en la versión CRAN (y también parecen estar apagados por sí mismos, por ejemplo, ~ 5 para la interacción cuando mi DV tiene un rango de 0-4).

La llamada de Lmer fue

cohort2_age =lmer(churchattendance ~ 
poly(cohort_c,2,raw=T) * age_c + 
ctd_c + dropoutalive + obs_c + (1+ age_c |PERSNR), data=long.kg)

La predicción fue solo efectos fijos, en datos falsos (todos los demás predictores = 0) donde marqué el rango presente en los datos originales como extrapolación = F.

predict(cohort2_age,REform=NA,newdata=cohort.moderates.age)

Puedo proporcionar más contexto si es necesario (no pude producir un ejemplo reproducible fácilmente, pero por supuesto puedo esforzarme más), pero creo que esta es una súplica más básica: explícame la poly()función, por favor.

Polinomios en bruto

Polinomios en bruto

Polinomios ortogonales (recortados, no recortados en Imgur )

Polinomios ortogonales

Rubén
fuente

Respuestas:

10

Creo que esto es un error en la función de predicción (y, por lo tanto, es mi culpa), que de hecho nlme no comparte. ( Editar : debe corregirse en la versión más reciente de R-forge de lme4). Vea a continuación un ejemplo ...

Creo que su comprensión de los polinomios ortogonales es probablemente buena. Lo difícil que necesita saber sobre ellos si está tratando de escribir un método de predicción para una clase de modelos es que la base de los polinomios ortogonales se define en función de un conjunto de datos dado, así que si ingenuamente (¡como hice yo! ) se utiliza model.matrixpara intentar generar la matriz de diseño para un nuevo conjunto de datos, se obtiene una nueva base, que ya no tiene sentido con los parámetros antiguos. Hasta que lo solucione, es posible que deba colocar una trampa que indique a las personas que predictno funcionan con bases polinómicas ortogonales (o bases de spline, que tienen la misma propiedad).

d <- expand.grid(x=seq(0,1,length=50),f=LETTERS[1:10])
set.seed(1001)
u.int <- rnorm(10,sd=0.5)
u.slope <- rnorm(10,sd=0.2)
u.quad <- rnorm(10,sd=0.1)
d <- transform(d,
               ypred = (1+u.int[f])+
               (2+u.slope[f])*x-
               (1+u.quad[f])*x^2)
d$y <- rnorm(nrow(d),mean=d$ypred,sd=0.2)
ggplot(d,aes(x=x,y=y,colour=f))+geom_line()+
    geom_line(aes(y=ypred),linetype=2)

library(lme4)
fm1 <- lmer(y~poly(x,2,raw=TRUE)+(1|f)+(0+x|f)+(0+I(x^2)|f),
            data=d)


fm2 <- lmer(y~poly(x,2)+(1|f)+(0+x|f)+(0+I(x^2)|f),
            data=d)
newdat <- data.frame(x=unique(d$x))
plot(predict(fm1,newdata=newdat,REform=NA))
lines(predict(fm2,newdata=newdat,REform=NA),col=2)
detach("package:lme4")

library(nlme)
fm3 <- lme(y~poly(x,2,raw=TRUE),
           random=list(~1|f,~0+x|f,~0+I(x^2)|f),
            data=d)
VarCorr(fm3)

fm4 <- lme(y~poly(x,2),
           random=list(~1|f,~0+x|f,~0+I(x^2)|f),
            data=d)

newdat <- data.frame(x=unique(d$x))
lines(predict(fm3,newdata=newdat,level=0),col=4)
lines(predict(fm4,newdata=newdat,level=0),col=5)
Ben Bolker
fuente
Gracias, eso es tranquilizador. Para reiterar: leí que no puedes tomar los efectos fijos polinómicos ortogonales al pie de la letra, pero a veces parecen increíblemente grandes. Por ejemplo, si ejecuto una interacción de dos polinomios cúbicos, obtengo efectos fijos para los polinomios y sus interacciones en el rango de -22 a -127400. Eso me parece muy extraño, especialmente teniendo en cuenta que todos los efectos fijos son negativos. ¿Tendría sentido una función de predicción revisada de estos efectos fijos o los modelos convergerían falsamente o, después de todo, su problema es incorrecto?
Ruben
De nuevo, sospecho (pero obviamente no estoy seguro) que todo está bien. Orth Los polinomios son buenos para la estabilidad numérica y la prueba de hipótesis, pero (como se está dando cuenta) los valores de los parámetros reales pueden ser más difíciles de interpretar. La versión actual de lme4-devel (acabo de publicar una versión que debería pasar las pruebas, podría tomar ~ 24 horas para reconstruir en r-forge, a menos que pueda construir desde SVN usted mismo) debería darle predicciones coincidentes entre polinomios en bruto / orto. Una alternativa es centrar y escalar predictores continuos a la Schielzeth 2010 Métodos en Ecología y Evolución ...
Ben Bolker
Sí, los dos polinomios están perfectamente de acuerdo ahora. ¡Muchas gracias! Había escalado y centrado mis predictores, pero algunos modelos no encajaban con polinomios en bruto.
Ruben