lme () और lmer () परस्पर विरोधी परिणाम देते हैं


20

मैं कुछ डेटा के साथ काम कर रहा हूं जिसमें बार-बार माप के साथ कुछ समस्याएं हैं। ऐसा करने में मैंने अपने परीक्षण डेटा का उपयोग करने के बीच बहुत अलग व्यवहार देखा lme()और lmer()जानना चाहा कि क्यों।

मेरे द्वारा बनाए गए नकली डेटा सेट में 10 विषयों के लिए ऊंचाई और वजन माप है, प्रत्येक को दो बार लिया जाता है। मैंने डेटा सेट किया ताकि विषयों के बीच ऊंचाई और वजन के बीच सकारात्मक संबंध हो, लेकिन प्रत्येक व्यक्ति के भीतर दोहराया उपायों के बीच एक नकारात्मक संबंध।

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

यहां डेटा का एक प्लॉट है, जिसमें प्रत्येक व्यक्ति से दो मापों को जोड़ने वाली लाइनें हैं। यहां छवि विवरण दर्ज करें

इसलिए मैं दो मॉडल, के साथ एक भाग lme()से nlmeपैकेज और के साथ एक lmer()से lme4। दोनों मामलों में मैंने प्रत्येक व्यक्ति के दोहराए गए मापों को नियंत्रित करने के लिए आईडी के एक यादृच्छिक प्रभाव के साथ ऊंचाई के खिलाफ वजन का एक प्रतिगमन चलाया।

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

ये दो मॉडल अक्सर (हालांकि हमेशा बीज के आधार पर नहीं) पूरी तरह से अलग परिणाम उत्पन्न करते हैं। मैंने देखा है कि वे कहाँ भिन्न भिन्न अनुमान उत्पन्न करते हैं, स्वतंत्रता की विभिन्न डिग्री आदि की गणना करते हैं, लेकिन यहाँ गुणांक विपरीत दिशाओं में हैं।

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

नेत्रहीन चित्रण करने के लिए, के साथ मॉडल lme()

यहां छवि विवरण दर्ज करें

और के साथ मॉडल lmer()

यहां छवि विवरण दर्ज करें

ये मॉडल इतना क्यों बदल रहे हैं?


2
क्या मस्त मिसाल है। यह एक ऐसे मामले का भी एक उपयोगी उदाहरण है जहाँ व्यक्ति के नियत बनाम यादृच्छिक प्रभाव को निर्धारित किया जाता है , जो वजन की अवधि के लिए पूरी तरह से अलग गुणांक का अनुमान देता है ।
याकूब सोकोलर

जवाबों:


25

tl; dr अगर आप ऑप्टिमाइज़र को "nloptwrap" में बदलते हैं तो मुझे लगता है कि यह इन मुद्दों (शायद) से बच जाएगा।

बधाई हो, आपने सांख्यिकीय अनुमान समस्या में कई ऑप्टिमा के सबसे सरल उदाहरणों में से एक पाया है! पैरामीटर जो lme4आंतरिक रूप से उपयोग करता है (इस प्रकार चित्रण के लिए सुविधाजनक है) यादृच्छिक प्रभावों का बढ़ा हुआ मानक विचलन है, अर्थात अवशिष्ट एसटी देव द्वारा विभाजित समूह-समूह std dev।

मूल lmeऔर lmerफिट के लिए इन मूल्यों को निकालें :

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

दूसरे ऑप्टिमाइज़र के साथ रिफिट करें (यह संभवतः अगली रिलीज़ में डिफ़ॉल्ट होगा lme4):

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

मेल खाता है lme... देखते हैं क्या हो रहा है करते हैं। विचलन समारोह (-2 * लॉग संभावना), या इस मामले में एक यादृच्छिक प्रभाव के साथ LMMs के लिए अनुरूप REML- मानदंड समारोह, केवल एक तर्क लेता है, क्योंकि निश्चित-प्रभाव मापदंडों को बाहर निकाल दिया जाता है ; वे आरई मानक विचलन के दिए गए मूल्य के लिए स्वचालित रूप से गणना की जा सकती हैं।

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

यहां छवि विवरण दर्ज करें

मैं इस पर आगे obsess करना जारी रखा और 1 से 1000 तक यादृच्छिक बीज के लिए फिट भाग गया, फिटिंग lme, lmerऔर lmer+ प्रत्येक मामले के लिए nloptwrap। यहाँ 1000 में से संख्याएँ हैं जहाँ किसी दिए गए तरीके के उत्तर मिलते हैं जो कम से कम 0.001 अवमूल्यन इकाइयाँ हैं जो एक से भी बदतर हैं ...

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

दूसरे शब्दों में, (1) ऐसा कोई तरीका नहीं है जो हमेशा सबसे अच्छा काम करता है; (2) lmerडिफ़ॉल्ट ऑप्टिमाइज़र सबसे खराब है (समय के 1/3 के बारे में विफल रहता है); (3) lmer"nloptwrap" के साथ सबसे अच्छा है (समय के lme4% से अधिक , शायद ही कभी से भी बदतर lmer)।

थोड़ा आश्वस्त होने के लिए, मुझे लगता है कि यह स्थिति छोटे, गलत मामलों के लिए सबसे खराब होने की संभावना है (यानी यहां अवशिष्ट त्रुटि सामान्य के बजाय एक समान है)। हालांकि इसे और व्यवस्थित रूप से देखना दिलचस्प होगा ...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.