जीएलएमएम के MLE s को संख्यात्मक रूप से प्राप्त करना कठिन है और, व्यवहार में, मुझे पता है, हमें ब्रूट फोर्स ऑप्टिमाइज़ेशन (जैसे, सरल तरीके से उपयोग करना) का उपयोग नहीं करना चाहिए । लेकिन अपने स्वयं के शैक्षिक उद्देश्य के लिए, मैं यह सुनिश्चित करने के लिए कोशिश करना चाहता हूं कि मैं मॉडल को सही ढंग से समझता हूं (नीचे दिए गए कोड को देखें)। मैंने पाया कि मुझे हमेशा असंगत परिणाम मिलते हैं ।optim
glmer()
विशेष रूप से, भले ही मैं glmer
प्रारंभिक मूल्यों के रूप में MLEs का उपयोग करता हूं , मेरे द्वारा लिखे गए संभावना फ़ंक्शन ( negloglik
) के अनुसार, वे MLEs ( opt1$value
से छोटा है opt2
) नहीं हैं। मुझे लगता है कि दो संभावित कारण हैं:
negloglik
अच्छी तरह से नहीं लिखा है ताकि इसमें बहुत अधिक संख्यात्मक त्रुटि हो, और- मॉडल विनिर्देश गलत है। मॉडल विनिर्देश के लिए, इच्छित मॉडल है:
जहां च एक द्विपद PMF और छ है एक सामान्य पीडीएफ। मैं ए , बी और एस का अनुमान लगाने की कोशिश कर रहा हूं। विशेष रूप से, मैं जानना चाहता हूं कि क्या मॉडल विनिर्देश गलत है, सही विनिर्देश क्या है।
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
MLE.glmer
और MLE.optim
) विशेष रूप से यादृच्छिक प्रभाव के लिए (नया उदाहरण देखें), इसलिए यह संभावना के मूल्यों में कुछ निरंतर कारक पर आधारित नहीं है, मुझे लगता है।
nAGQ
में glmer
MLEs तुलनीय बनाया है। की डिफ़ॉल्ट परिशुद्धता glmer
बहुत अच्छी नहीं थी।