为什么glmer无法达到最大可能性(已通过应用进一步的通用优化方法进行了验证)?


37

数值推导MLEGLMM是困难的,在实践中,我知道,我们不应该用蛮力优化(例如,使用optim一个简单的方法)。但是出于我自己的教育目的,我想尝试一下以确保正确理解该模型(请参见下面的代码)。我发现我总是从中得到不一致的结果glmer()

特别是,即使我使用MLE glmer作为初始值,根据我写的似然函数(negloglik),它们也不是MLE(opt1$value小于opt2)。我认为两个潜在的原因是:

  1. negloglik 写得不好,以至于其中有太多的数字误差,并且
  2. 型号规格错误。对于模型规范,预期模型为:

其中 ˚F是二项式PMF和是一个正常的PDF文件。我试图估计 a b s。我特别想知道模型规格是否错误,正确的规格是什么。

L=i=1n(f(yi|N,a,b,ri)g(ri|s)dri)
fgabs
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(不是对数可能性本身)具有可比性吗?也就是说,您是否刚刚离开一个常数?
本·博克

我认为,估计的MLE明显不同(MLE.glmerMLE.optim),特别是对于随机效应(请参见新示例),因此,它不仅仅基于似然值中的某些常数。
古怪的

4
@Ben设置高的nAGQin glmer使MLE 具有可比性。的默认精度glmer不是很好。
狡辩

5
链接到类似lme4疑问,@Steve沃克帮我出:stats.stackexchange.com/questions/77313/...
奔Ogorek

3
作为一个带有很多反对意见的老问题,这可能是祖父。我认为无需关闭此功能。
gung-恢复莫妮卡

Answers:


3

nAGQglmer调用中设置高值会使两个方法中的MLE等效。的默认精度glmer不是很好。这解决了问题。

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

见@ SteveWalker的答案在这里我为什么不能用手动实现高斯-牛顿算法的匹配glmer(家族=二项式)输出?更多细节。


1
但是估计的对数似然有很大不同(大概有一定的常数),因此不应混用不同的方法。
古怪的

嗯,有趣/令人惊讶-感谢您设置了此示例,我将尝试抽出时间来研究它。
本·博克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.