ग्लेमर अधिकतम संभावना को प्राप्त नहीं करता है (जैसा कि आगे सामान्य अनुकूलन लागू करके सत्यापित किया गया है)?


37

जीएलएमएम के MLE s को संख्यात्मक रूप से प्राप्त करना कठिन है और, व्यवहार में, मुझे पता है, हमें ब्रूट फोर्स ऑप्टिमाइज़ेशन (जैसे, सरल तरीके से उपयोग करना) का उपयोग नहीं करना चाहिए । लेकिन अपने स्वयं के शैक्षिक उद्देश्य के लिए, मैं यह सुनिश्चित करने के लिए कोशिश करना चाहता हूं कि मैं मॉडल को सही ढंग से समझता हूं (नीचे दिए गए कोड को देखें)। मैंने पाया कि मुझे हमेशा असंगत परिणाम मिलते हैं ।optimglmer()

विशेष रूप से, भले ही मैं glmerप्रारंभिक मूल्यों के रूप में MLEs का उपयोग करता हूं , मेरे द्वारा लिखे गए संभावना फ़ंक्शन ( negloglik) के अनुसार, वे MLEs ( opt1$valueसे छोटा है opt2) नहीं हैं। मुझे लगता है कि दो संभावित कारण हैं:

  1. negloglik अच्छी तरह से नहीं लिखा है ताकि इसमें बहुत अधिक संख्यात्मक त्रुटि हो, और
  2. मॉडल विनिर्देश गलत है। मॉडल विनिर्देश के लिए, इच्छित मॉडल है:

जहां एक द्विपद PMF और है एक सामान्य पीडीएफ। मैं , बी और एस का अनुमान लगाने की कोशिश कर रहा हूं। विशेष रूप से, मैं जानना चाहता हूं कि क्या मॉडल विनिर्देश गलत है, सही विनिर्देश क्या है।

L=i=1n(f(yi|N,a,b,ri)g(ri|s)dri)
fgabरों
p <- function(x,a,b) exp(a+b*x)/(1+exp(a+b*x))

a <- -4  # fixed effect (intercept)
b <- 1   # fixed effect (slope)
s <- 1.5 # random effect (intercept)
N <- 8
x <- rep(2:6, each=20)
n <- length(x) 
id <- 1:n
r  <- rnorm(n, 0, s) 
y  <- rbinom(n, N, prob=p(x,a+r,b))


negloglik <- function(p, x, y, N){
  a <- p[1]
  b <- p[2]
  s <- p[3]

  Q <- 100  # Inf does not work well
  L_i <- function(r,x,y){
    dbinom(y, size=N, prob=p(x, a+r, b))*dnorm(r, 0, s)
  }

  -sum(log(apply(cbind(y,x), 1, function(x){ 
    integrate(L_i,lower=-Q,upper=Q,x=x[2],y=x[1],rel.tol=1e-14)$value
  })))
}

library(lme4)
(model <- glmer(cbind(y,N-y)~x+(1|id),family=binomial))

opt0 <- optim(c(fixef(model), sqrt(VarCorr(model)$id[1])), negloglik, 
                x=x, y=y, N=N, control=list(reltol=1e-50,maxit=10000)) 
opt1 <- negloglik(c(fixef(model), sqrt(VarCorr(model)$id[1])), x=x, y=y, N=N)
opt0$value  # negative loglikelihood from optim
opt1        # negative loglikelihood using glmer generated parameters
-logLik(model)==opt1 # but these are substantially different...

एक सरल उदाहरण

बड़ी संख्यात्मक त्रुटि होने की संभावना को कम करने के लिए, मैंने एक सरल उदाहरण बनाया।

y  <- c(0, 3)
N  <- c(8, 8)
id <- 1:length(y)

negloglik <- function(p, y, N){
  a <- p[1]
  s <- p[2]
  Q <- 100  # Inf does not work well
  L_i <- function(r,y){
    dbinom(y, size=N, prob=exp(a+r)/(1+exp(a+r)))*dnorm(r,0,s)
  }
  -sum(log(sapply(y, function(x){
    integrate(L_i,lower=-Q, upper=Q, y=x, rel.tol=1e-14)$value
  })))
}

library(lme4)
(model <- glmer(cbind(y,N-y)~1+(1|id), family=binomial))
MLE.glmer <- c(fixef(model), sqrt(VarCorr(model)$id[1]))
opt0 <- optim(MLE.glmer, negloglik, y=y, N=N, control=list(reltol=1e-50,maxit=10000)) 
MLE.optim <- opt0$par
MLE.glmer # MLEs from glmer
MLE.optim # MLEs from optim

L_i <- function(r,y,N,a,s) dbinom(y,size=N,prob=exp(a+r)/(1+exp(a+r)))*dnorm(r,0,s)

L1 <- integrate(L_i,lower=-100, upper=100, y=y[1], N=N[1], a=MLE.glmer[1], 
                s=MLE.glmer[2], rel.tol=1e-10)$value
L2 <- integrate(L_i, lower=-100, upper=100, y=y[2], N=N[2], a=MLE.glmer[1], 
                s=MLE.glmer[2], rel.tol=1e-10)$value

(log(L1)+log(L2)) # loglikelihood (manual computation)
logLik(model)     # loglikelihood from glmer 

MLEs (स्वयं लॉग-लाइबिलिटी नहीं हैं) तुलनीय हैं? यही है, क्या आप एक निरंतर द्वारा बंद कर रहे हैं?
बेन बोलकर

अनुमानित MLEs स्पष्ट रूप से अलग हैं ( MLE.glmerऔर MLE.optim) विशेष रूप से यादृच्छिक प्रभाव के लिए (नया उदाहरण देखें), इसलिए यह संभावना के मूल्यों में कुछ निरंतर कारक पर आधारित नहीं है, मुझे लगता है।
वक्रोक्ति

4
के एक उच्च मूल्य की स्थापना @Ben nAGQमें glmerMLEs तुलनीय बनाया है। की डिफ़ॉल्ट परिशुद्धता glmerबहुत अच्छी नहीं थी।
वक्रोक्ति

5
इसी तरह के एक lme4 सवाल से जुड़ा हुआ है कि @Steve वाकर ने मेरी मदद की: आँकड़ा.स्टैकएक्सचेंज.com
बेन ओगोरक

3
एक पुराने प्रश्न w / बहुत सारे अपवित्रों के रूप में, यह शायद दादा हो सकता है। मुझे इसे बंद करने की आवश्यकता नहीं दिख रही है।
गंग -

जवाबों:


3

कॉल nAGQमें एक उच्च मूल्य सेट करना glmerMLEs को दो तरीकों के समकक्ष बनाता है। की डिफ़ॉल्ट परिशुद्धता glmerबहुत अच्छी नहीं थी। यह समस्या सुलझाता है।

glmer(cbind(y,N-y)~1+(1|id),family=binomial,nAGQ=20)

यहाँ देखें @ स्टीववल्कर का जवाब मैं गॉस-न्यू-न्यूजिक एल्गोरिथ्म के मैनुअल कार्यान्वयन के साथ ग्लैमर (परिवार = द्विपद) उत्पादन क्यों नहीं कर सकता? अधिक जानकारी के लिए।


1
लेकिन अनुमानित loglikelihoods बहुत अलग हैं (संभवतः कुछ निरंतर द्वारा), इसलिए विभिन्न तरीकों को मिश्रित नहीं किया जाना चाहिए।
वक्रोक्ति

हम्म, दिलचस्प / आश्चर्य की बात है - इस उदाहरण को स्थापित करने के लिए धन्यवाद, मैं इसे देखने के लिए समय खोजने की कोशिश करूंगा।
बेन बोल्कर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.