lme () und lmer () liefern widersprüchliche Ergebnisse


20

Ich habe mit Daten gearbeitet, die Probleme mit wiederholten Messungen haben. Dabei habe ich ein sehr unterschiedliches Verhalten zwischen lme()und unter lmer()Verwendung meiner Testdaten festgestellt und möchte wissen warum.

Der von mir erstellte gefälschte Datensatz enthält Größen- und Gewichtsmessungen für 10 Probanden, die jeweils zweimal durchgeführt wurden. Ich habe die Daten so eingestellt, dass zwischen den Probanden eine positive Beziehung zwischen Größe und Gewicht besteht, aber eine negative Beziehung zwischen den wiederholten Messungen innerhalb jedes einzelnen.

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

Hier ist ein Diagramm der Daten mit Linien, die die beiden Messungen von jedem einzelnen verbinden. Bildbeschreibung hier eingeben

Also lief ich zwei Modelle, eines mit lme()aus dem nlmePaket und eines mit lmer()aus lme4. In beiden Fällen führte ich eine Regression des Gewichts gegen die Größe mit einem zufälligen ID-Effekt durch, um die wiederholten Messungen jedes Individuums zu kontrollieren.

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

Diese beiden Modelle führten häufig (wenn auch nicht immer abhängig von der Saat) zu völlig unterschiedlichen Ergebnissen. Ich habe gesehen, wo sie leicht unterschiedliche Varianzschätzungen erzeugen, unterschiedliche Freiheitsgrade berechnen usw., aber hier sind die Koeffizienten in entgegengesetzte Richtungen.

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

Zur Veranschaulichung modellieren Sie mit lme()

Bildbeschreibung hier eingeben

Und Modell mit lmer()

Bildbeschreibung hier eingeben

Warum weichen diese Modelle so stark voneinander ab?


2
Was für ein cooles Beispiel. Es ist auch ein nützliches Beispiel für einen Fall, in dem die Anpassung von festen und zufälligen Effekten von Individuum völlig unterschiedliche Koeffizientenschätzungen für den Gewichtsausdruck ergibt .
Jacob Socolar

Antworten:


25

tl; dr , wenn Sie den Optimierer „nloptwrap“ ändern Ich denke , es diese Probleme vermeiden wird (wahrscheinlich).

Herzlichen Glückwunsch, Sie haben eines der einfachsten Beispiele für mehrere Optima in einem statistischen Schätzungsproblem gefunden! Der Parameter, lme4der intern verwendet wird (daher zur Veranschaulichung zweckmäßig), ist die skalierte Standardabweichung der zufälligen Effekte, dh die gruppeninterne Standardabweichung geteilt durch die verbleibende Standardabweichung .

Extrahieren Sie diese Werte für das Original lmeund lmerpassen:

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

Mit einem anderen Optimierer nachrüsten (dies wird wahrscheinlich die Standardeinstellung in der nächsten Version von sein lme4):

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

Übereinstimmungen lme... mal sehen, was los ist. Die Abweichungsfunktion (-2 * log Likelihood) oder in diesem Fall die analoge REML-Kriteriumsfunktion für LMMs mit einem einzelnen Zufallseffekt verwendet nur ein Argument, da die Parameter für feste Effekte mit Profilen versehen sind . Sie können automatisch für einen bestimmten Wert der RE-Standardabweichung berechnet werden.

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

Bildbeschreibung hier eingeben

Ich fuhr fort , weiter über diese besessen und lief die Anfälle für zufällige Samen von 1 bis 1000, passend lme, lmerund lmer+ nloptwrap für jeden Fall. Hier sind die Zahlen von 1000, bei denen eine bestimmte Methode Antworten erhält, die mindestens 0,001 Abweichungseinheiten schlechter sind als bei einer anderen ...

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

Mit anderen Worten: (1) Es gibt keine Methode, die immer am besten funktioniert. (2) lmermit dem Standardoptimierer ist am schlechtesten (scheitert etwa 1/3 der Zeit); (3) lmermit "nloptwrap" ist am besten (schlechter als lme4% der Zeit, selten schlechter als lmer).

Ein bisschen beruhigend finde ich, dass diese Situation für kleine, falsch spezifizierte Fälle wahrscheinlich am schlimmsten ist (dh der verbleibende Fehler ist hier eher einheitlich als normal). Es wäre interessant, dies systematischer zu untersuchen ...

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.