সংখ্যাসূচকভাবে আহরিত MLE s এর GLMM কঠিন এবং বাস্তবে,, আমি জানি, আমরা পাশব বল অপ্টিমাইজেশান ব্যবহার করা উচিত নয় (যেমন, ব্যবহার optim
একটি সহজ ভাবে)। তবে আমার নিজের শিক্ষাগত উদ্দেশ্যে, আমি মডেলটি সঠিকভাবে বুঝতে পেরেছি কিনা তা চেষ্টা করার চেষ্টা করতে চাই (নীচের কোডটি দেখুন)। আমি দেখতে পেয়েছি যে আমি সবসময়ই এর থেকে বেমানান ফলাফল পাই glmer()
।
বিশেষত, আমি যদি এমএলইগুলি glmer
প্রাথমিক মান হিসাবে ব্যবহার করি তবে আমার লেখা সম্ভাবনা ফাংশন অনুযায়ী ( negloglik
), সেগুলি এমএলই নয় (এর opt1$value
চেয়ে ছোট opt2
)। আমি মনে করি দুটি সম্ভাব্য কারণ হ'ল:
negloglik
এটি ভালভাবে লেখা হয় নি যাতে এতে খুব বেশি সংখ্যাসূচক ত্রুটি থাকে এবং- মডেল স্পেসিফিকেশন ভুল। মডেল নির্দিষ্টকরণের জন্য, উদ্দেশ্যে করা মডেলটি হ'ল:
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
খুব ভাল ছিল না।