lme () e lmer () dando resultados conflitantes

20

Eu tenho trabalhado com alguns dados que têm alguns problemas com medições repetidas. Ao fazer isso, notei um comportamento muito diferente entre lme()e lmer()usando meus dados de teste e quero saber o porquê.

O conjunto de dados falsos que criei possui medidas de altura e peso para 10 indivíduos, tiradas duas vezes cada. Configurei os dados para que, entre os sujeitos, houvesse uma relação positiva entre altura e peso, mas uma relação negativa entre as medidas repetidas dentro de cada indivíduo.

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$ID=as.factor(rep(1:10,2)) #add subject ID
DF$Number=as.factor(c(rep(1,10),rep(2,10))) #differentiate between first and second measurement

Aqui está um gráfico dos dados, com linhas conectando as duas medidas de cada indivíduo. insira a descrição da imagem aqui

Então, eu executei dois modelos, um com lme()o nlmepacote e outro com lmer()from lme4. Nos dois casos, executei uma regressão do peso contra a altura com um efeito aleatório da ID para controlar as medidas repetidas de cada indivíduo.

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

Esses dois modelos frequentemente (embora nem sempre dependendo da semente) geravam resultados completamente diferentes. Vi onde eles geram estimativas de variação ligeiramente diferentes, calculam diferentes graus de liberdade etc., mas aqui os coeficientes estão em direções opostas.

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

Para ilustrar visualmente, modele com lme()

insira a descrição da imagem aqui

E modelo com lmer()

insira a descrição da imagem aqui

Por que esses modelos divergem tanto?

Cody K
fonte
2
Que exemplo legal. Também é um exemplo útil de um caso em que o ajuste de efeitos fixos versus aleatórios do indivíduo fornece estimativas de coeficientes completamente diferentes para o termo de peso.
Jacob Socolar

Respostas:

25

tl; dr se você alterar o otimizador para "nloptwrap", acho que ele evitará esses problemas (provavelmente).

Parabéns, você encontrou um dos exemplos mais simples de ótimas ótimas em um problema de estimativa estatística! O parâmetro que lme4utiliza internamente (portanto, conveniente para ilustração) é o desvio padrão em escala dos efeitos aleatórios, ou seja, o desvio padrão entre os grupos dividido pelo desvio padrão do desvio residual.

Extraia estes valores para o original lmee lmerajuste:

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

Instale novamente com outro otimizador (esse provavelmente será o padrão na próxima versão do lme4):

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

Jogos lme... vamos ver o que está acontecendo. A função de desvio (-2 * log de verossimilhança) ou, neste caso, a função de critério REML análoga, para LMMs com um único efeito aleatório, usa apenas um argumento, porque os parâmetros de efeito fixo são definidos em perfil ; eles podem ser calculados automaticamente para um determinado valor do desvio padrão do ER.

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()

insira a descrição da imagem aqui

I continuou a obsess adicional sobre este e corri os ajustes para sementes aleatórios de 1 a 1000, encaixe lme, lmere lmer+ nloptwrap para cada caso. Aqui estão os números de 1000 em que um determinado método obtém respostas que são pelo menos 0,001 unidades de desvio piores que outras ...

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

Em outras palavras, (1) não existe um método que sempre funcione melhor; (2) lmercom o otimizador padrão é o pior (falha cerca de 1/3 do tempo); (3) lmercom "nloptwrap" é melhor (pior que lme4% das vezes, raramente pior que lmer).

Para ser um pouco tranquilizador, acho que essa situação provavelmente será pior para casos pequenos e mal especificados (ou seja, o erro residual aqui é uniforme e não normal). Seria interessante explorar isso de forma mais sistemática ...

Ben Bolker
fonte