lme () ve lmer () çakışan sonuçlar veriyor


20

Tekrarlanan ölçümlerle ilgili bazı problemleri olan bazı verilerle çalışıyorum. Arasındaki Bunu yaparken çok farklı davranış fark lme()ve lmer()benim test verileri kullanılarak ve neden bilmek istiyorum.

Oluşturduğum sahte veri seti, her biri iki kez alınan 10 denek için boy ve kilo ölçümlerine sahiptir. Verileri, denekler arasında boy ve kilo arasında pozitif bir ilişki, ancak her bir bireyde tekrarlanan ölçümler arasında negatif bir ilişki olacak şekilde ayarladım.

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

Verilerin bir grafiği, her birinden iki ölçümü birbirine bağlayan çizgiler. resim açıklamasını buraya girin

Bu yüzden iki model, bir kez koştu lme()gelen nlmepaket ve bir kez lmer()gelen lme4. Her iki durumda da, her bireyin tekrarlanan ölçümlerini kontrol etmek için rastgele bir ID etkisi ile boyuta karşı bir ağırlık regresyonu yaptım.

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

Bu iki model genellikle (her zaman tohuma bağlı olmamakla birlikte) tamamen farklı sonuçlar vermiştir. Biraz farklı varyans tahminleri ürettiklerini, farklı serbestlik derecelerini hesapladıklarını vb. Gördüm, ancak burada katsayılar zıt yönlerde.

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

Görsel olarak açıklamak için, lme()

resim açıklamasını buraya girin

Ve modelle lmer()

resim açıklamasını buraya girin

Bu modeller neden bu kadar farklı?


2
Ne güzel bir örnek. Aynı zamanda, bireyin sabit ve rastgele etkilerinin takılmasının , ağırlık terimi için tamamen farklı katsayı tahminleri vermesinin yararlı bir örneğidir .
Jacob Socolar

Yanıtlar:


25

tl; dr Doktoru "nloptwrap" olarak değiştirirseniz, bu sorunlardan kaçınacağını düşünüyorum (muhtemelen).

Tebrikler, istatistiksel bir tahmin probleminde çoklu optima'nın en basit örneklerinden birini buldunuz! lme4Dahili olarak kullanılan parametre (örnekleme için uygun olan), rastgele etkilerin, yani gruplar arası standart artığın standart std'ye bölünen ölçekli standart sapmasıdır .

Orijinal için bu değerleri çıkarın lmeve aşağıdakilere lmeruyun:

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

Başka bir optimize ediciyle tekrar takın (muhtemelen bir sonraki sürümünde varsayılan olacaktır lme4):

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

Maçlar lme... neler olduğunu görelim. Tekli rastgele etkiye sahip LMM'ler için sapma fonksiyonu (-2 * log olasılığı) veya bu durumda benzer REML kriteri fonksiyonu, sadece bir argüman alır, çünkü sabit etki parametreleri profillenir ; RE standart sapmasının belirli bir değeri için otomatik olarak hesaplanabilir.

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

resim açıklamasını buraya girin

Ben uydurma, bunun üzerinde daha fazla takıntısı devam etmiş ve 1'den 1000'e kadar rastgele tohumlar için uyuyor koştu lme, lmerve lmerher vaka için + nloptwrap. Verilen bir yöntemin en az 0.001 sapma birimi diğerinden daha kötü olan cevaplar aldığı 1000'den sayıları ...

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

Başka bir deyişle, (1) her zaman en iyi sonucu veren yöntem yoktur; (2) lmervarsayılan iyileştirici ile en kötü (zamanın yaklaşık 1 / 3'ü başarısız olur); (3) lmer"nloptwrap" ile en iyisidir ( lmezamanın% 4'ünden daha kötüdür , nadiren daha kötüdür lmer).

Biraz güven verici olmak için, bu durumun küçük, yanlış tanımlanmış vakalar için en kötü olacağını düşünüyorum (yani, burada kalan hata Normal yerine tek tiptir). Yine de bunu daha sistematik olarak keşfetmek ilginç olurdu ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.