lme () e lmer () che danno risultati contrastanti


20

Ho lavorato con alcuni dati che hanno alcuni problemi con misurazioni ripetute. In tal modo ho notato un comportamento molto diverso tra lme()e lmer()utilizzando i miei dati di test e voglio sapere perché.

Il set di dati falsi che ho creato ha misurazioni di altezza e peso per 10 soggetti, prese due volte ciascuna. Ho impostato i dati in modo che tra i soggetti ci fosse una relazione positiva tra altezza e peso, ma una relazione negativa tra le misure ripetute all'interno di ciascun 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$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

Ecco un diagramma dei dati, con linee che collegano le due misurazioni da ciascun individuo. inserisci qui la descrizione dell'immagine

Quindi ho eseguito due modelli, uno con lme()dal nlmepacchetto e uno con lmer()da lme4. In entrambi i casi ho eseguito una regressione del peso rispetto all'altezza con un effetto casuale di ID per controllare le misurazioni ripetute di ciascun individuo.

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

Questi due modelli spesso (sebbene non sempre dipendano dal seme) hanno generato risultati completamente diversi. Ho visto dove generano stime di varianza leggermente diverse, calcolano diversi gradi di libertà, ecc., Ma qui i coefficienti sono in direzioni opposte.

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

Per illustrare visivamente, modellare con lme()

inserisci qui la descrizione dell'immagine

E modella con lmer()

inserisci qui la descrizione dell'immagine

Perché questi modelli stanno divergendo così tanto?


2
Che bell'esempio. È anche un utile esempio di un caso in cui l'adattamento degli effetti fissi a quelli casuali dell'individuo fornisce stime del coefficiente completamente diverse per il termine peso.
Jacob Socolar,

Risposte:


25

tl; dr se cambi l'ottimizzatore in "nloptwrap" penso che eviterà questi problemi (probabilmente).

Congratulazioni, hai trovato uno dei più semplici esempi di optima multipli in un problema di stima statistica! Il parametro che lme4utilizza internamente (quindi conveniente per l'illustrazione) è la deviazione standard in scala degli effetti casuali, vale a dire lo dev std tra i gruppi diviso per lo dev std residuo.

Estrai questi valori per l'originale lmee si lmeradatta:

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

Rimontalo con un altro ottimizzatore (questo sarà probabilmente il valore predefinito nella prossima versione di lme4):

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

Partite lme... vediamo cosa sta succedendo. La funzione di devianza (-2 * log verosimiglianza), o in questo caso l'analoga funzione di criterio REML, per gli LMM con un singolo effetto casuale accetta solo un argomento, poiché i parametri degli effetti fissi sono profilati ; possono essere calcolati automaticamente per un dato valore della deviazione standard RE.

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

inserisci qui la descrizione dell'immagine

Ho continuato a ossessionare ulteriormente su questo ed ho fatto funzionare le crisi di numeri casuali da 1 a 1000, il montaggio lme, lmere lmer+ nloptwrap per ogni caso. Ecco i numeri su 1000 in cui un determinato metodo ottiene risposte che sono almeno 0,001 unità di devianza peggiori di un altro ...

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

In altre parole, (1) non esiste un metodo che funzioni sempre meglio; (2) lmercon l'ottimizzatore predefinito è la cosa peggiore (fallisce circa 1/3 del tempo); (3) lmercon "nloptwrap" è meglio (peggio del lme4% delle volte, raramente peggio di lmer).

Per essere un po 'rassicurante, penso che questa situazione sia probabilmente la peggiore per casi piccoli e non specificati (cioè l'errore residuo qui è uniforme piuttosto che normale). Sarebbe interessante esplorarlo in modo più sistematico però ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.