25 votos

LME() y lmer(), dando resultados contradictorios

He estado trabajando con algunos de los datos que tiene algunos problemas con mediciones repetidas. Al hacerlo me di cuenta de comportamiento muy diferente entre lme() y lmer() el uso de mis datos de prueba y quieren saber por qué.

El falso conjunto de datos que he creado tiene la altura y el peso de las mediciones de 10 temas, tomado dos veces cada uno. Puedo configurar los datos de modo que entre los sujetos que habría una relación positiva entre la altura y el peso, pero una relación negativa entre las medidas repetidas de cada individuo.

set.seed(21)
Height=1:10; Height=Height+runif(10,min=0,max=3) #First height measurement
Weight=1:10; Weight=Weight+runif(10,min=0,max=3) #First weight measurement

Height2=Height+runif(10,min=0,max=1) #second height measurement
Weight2=Weight-runif(10,min=0,max=1) #second weight measurement

Height=c(Height,Height2) #combine height and wight measurements
Weight=c(Weight,Weight2)

DF=data.frame(Height,Weight) #generate data frame
DF

Aquí es un gráfico de los datos, con líneas que conectan las dos mediciones de cada individuo. enter image description here

Así que me encontré con dos modelos, uno con $ID=as.factor(rep(1:10,2)) #add subject ID DF$ de la Number=as.factor(c(rep(1,10),rep(2,10))) #differentiate between first and second measurement paquete y uno con lme() de nlme. En ambos casos me encontré con una regresión de peso en contra de altura, con un efecto aleatorio de IDENTIFICACIÓN para el control de las mediciones repetidas de cada individuo.

lmer()

A estos dos modelos, a menudo (aunque no siempre, dependiendo de la semilla) generado resultados completamente diferentes. He visto donde se generan ligeramente diferentes estimaciones de la variación, calcular diferentes grados de libertad, etc., pero aquí los coeficientes son en direcciones opuestas.

lme4

Para ilustrar visualmente, modelo con library(nlme) Mlme=lme(Height~Weight,random=~1|ID,data=DF) library(lme4) Mlmer=lmer(Height~Weight+(1|ID),data=DF)

enter image description here

Y el modelo con coef(Mlme) # (Intercept) Weight #1 1.57102183 0.7477639 #2 -0.08765784 0.7477639 #3 3.33128509 0.7477639 #4 1.09639883 0.7477639 #5 4.08969282 0.7477639 #6 4.48649982 0.7477639 #7 1.37824171 0.7477639 #8 2.54690995 0.7477639 #9 4.43051687 0.7477639 #10 4.04812243 0.7477639 coef(Mlmer) # (Intercept) Weight #1 4.689264 -0.516824 #2 5.427231 -0.516824 #3 6.943274 -0.516824 #4 7.832617 -0.516824 #5 10.656164 -0.516824 #6 12.256954 -0.516824 #7 11.963619 -0.516824 #8 13.304242 -0.516824 #9 17.637284 -0.516824 #10 18.883624 -0.516824

enter image description here

¿Por qué son estos modelos divergentes tanto?

31voto

Ben Bolker Puntos 8729

tl;dr si cambia el optimizador "nloptwrap" creo que va a evitar estos problemas (probablemente).

Enhorabuena, has encontrado uno de los más simples ejemplos de varios optima en una estimación estadística problema! El parámetro lme4 utiliza internamente (por lo tanto conveniente para la ilustración) es la escala de desviación estándar de los efectos aleatorios, es decir, el entre-grupo std dev dividido por el residual std dev.

Extracto de estos valores para el original lme y lmer se ajusta:

(sd1 <- sqrt(getVarCov(Mlme)[[1]])/sigma(Mlme))
## 2.332469
(sd2 <- getME(Mlmer,"theta")) ## 14.48926

Vuelva a colocar con otro optimizador (este será probablemente el defecto en la próxima versión de lme4):

Mlmer2 <- update(Mlmer,
  control=lmerControl(optimizer="nloptwrap"))
sd3 <- getME(Mlmer2,"theta")   ## 2.33247

Partidos lme ... vamos a ver lo que está pasando. La desviación de la función (-2*log probabilidad), o en este caso el análogo REML-el criterio de la función, para LMMs con un único efecto aleatorio sólo toma un argumento, porque fija los parámetros de efectos se perfila a cabo; pueden ser calculadas automáticamente para un valor dado de la RE desviación estándar.

ff <- as.function(Mlmer)
tvec <- seq(0,20,length=101)
Lvec <- sapply(tvec,ff)
png("CV38425.png")
par(bty="l",las=1)
plot(tvec,Lvec,type="l",
     ylab="REML criterion",
     xlab="scaled random effects standard deviation")
abline(v=1,lty=2)
points(sd1,ff(sd1),pch=16,col=1)
points(sd2,ff(sd2),pch=16,col=2)
points(sd3,ff(sd3),pch=1,col=4)
dev.off()

enter image description here

Seguí a obsesionarse más sobre este y ejecutó los ataques de semillas aleatorias de 1 a 1000, montaje lme, lmery lmer+nloptwrap para cada caso. Aquí están los números de 1000 en los que un determinado método obtiene respuestas que sean al menos de 0.001 unidades de desviación peor que otro ...

          lme.dev lmer.dev lmer2.dev
lme.dev         0       64        61
lmer.dev      369        0       326
lmer2.dev      43        3         0

En otras palabras, (1) no hay ningún método que siempre funciona mejor; (2) lmer con el valor predeterminado optimizer es peor (no sobre 1/3 del tiempo); (3) lmer con "nloptwrap" es el mejor (peor que el lme 4% de las veces, rara vez peor que lmer).

Para ser un poco tranquilizador, creo que esta situación es probable que sea peor para los pequeños, mal especificada de los casos (es decir, error residual aquí es uniforme en lugar de lo Normal). Sería interesante explorar de forma más sistemática, aunque ...

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X