Glmer neden maksimum olasılığa ulaşmıyor (başka bir genel optimizasyon uygulayarak doğrulandığı gibi)?


37

Sayısal olarak türetmek MLE s glmM pratikte zordur ve, biliyorum, biz (Örneğin; kaba kuvvet optimizasyonu kullanmamalısınız optimbasit şekilde). Ancak kendi eğitim amacım için, modeli doğru bir şekilde anladığımdan emin olmak için denemek istiyorum (aşağıdaki koda bakın). Her zaman tutarsız sonuçlar aldığımı öğrendim glmer().

Özellikle, MLE'leri glmerbaşlangıç ​​değerleri olarak kullansam bile, yazdığım olasılık fonksiyonuna göre negloglikbunlar MLE değildir (ondan opt1$valuedaha küçüktür opt2). İki olası neden olduğunu düşünüyorum:

  1. negloglik iyi yazılmamıştır, böylece içinde çok fazla sayısal hata vardır ve
  2. Model özellikleri yanlış. Model özellikleri için, amaçlanan model:

burada f isimli bir binom PMF ve g olan normal bir PDF. A , b ve s'yi tahmin etmeye çalışıyorum. Özellikle, modelin yanlış olup olmadığını, doğru olanın ne olduğunu bilmek istiyorum.

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...

Daha basit bir örnek

Büyük sayısal hata yapma olasılığını azaltmak için daha basit bir örnek oluşturdum.

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'ler (günlük olasılıklarının kendisi değil) karşılaştırılabilir mi? Yani, sadece bir sabit tarafından kapalı mısın?
Ben Bolker

Tahmini Mles açıkça farklı (vardır MLE.glmerve MLE.optimbu yüzden sadece olabilirlik değerlerinin bazı sabit faktör dayalı değil, (yeni örneğe bakın) özellikle rastgele etki için) sanırım.
kelime oyunu

4
Yüksek bir değere ayarlanması @Ben nAGQiçinde glmerMles karşılaştırılabilir yaptı. Varsayılan hassasiyeti glmerçok iyi değildi.
kelime oyunu

5
Steve Walker'ın bana yardım ettiği benzer bir lme4 sorusuna bağlanma: stats.stackexchange.com/questions/77313/…
Ben Ogorek

3
Daha büyük bir soru, çok fazla w / w / w, olarak, bu muhtemelen büyükbaba olabilir. Bunun kapatılması için bir ihtiyaç görmüyorum.
gung - Monica

Yanıtlar:


3

Yüksek değerini ayarlama nAGQiçinde glmerçağrı iki yöntem eşdeğeri Mles yaptı. Varsayılan hassasiyeti glmerçok iyi değildi. Bu sorunu çözer.

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

Burada @ SteveWalker'ın cevabına bakınız . Gauss-Newton algoritmasının manuel uygulaması ile neden glmer (family = binomial) çıktısını eşleştiremiyorum? daha fazla ayrıntı için.


1
Ancak tahmini mantıksallıklar çok farklıdır (muhtemelen bir miktar sabit ile), bu nedenle farklı yöntemler karıştırılmamalıdır.
kelime oyunu

hmm, ilginç / şaşırtıcı - bu örneği kurduğunuz için teşekkürler, içine bakmak için zaman bulmaya çalışacağım.
Ben Bolker
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.