Чому glmer не досягає максимальної ймовірності (як це підтверджено шляхом подальшої загальної оптимізації)?


37

Чисельне отримання MLE з GLMM є складним, і, на практиці, я знаю, ми не повинні використовувати оптимізацію грубої сили (наприклад, використовуючи optimпростий спосіб). Але для власного навчального призначення я хочу спробувати це, щоб переконатися, що я правильно розумію модель (див. Код нижче). Я виявив, що завжди отримую суперечливі результати glmer().

Зокрема, навіть якщо я використовую MLE з glmerпочаткових значень, відповідно до функції ймовірності, яку я написав ( negloglik), вони не є MLE ( opt1$valueменшими, ніж opt2). Я думаю, дві можливі причини:

  1. negloglik не написано добре, щоб в ньому було занадто багато числових помилок, і
  2. специфікація моделі неправильна. Для специфікації моделі призначена модель:

L=i=1н(-f(уi|N,а,б,ri)г(ri|с)гri)
де - двочленний pmf, а - звичайний pdf. Я намагаюся оцінити , і . Зокрема, я хочу знати, чи неправильна специфікація моделі, яка правильна специфікація.fгабс
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 

Чи порівняні ПДЧ (а не самі ймовірності журналу)? Тобто, ви просто відсторонений від постійної?
Бен Болкер

1
Оціночні показники MLE явно відрізняються ( MLE.glmerі MLE.optim) особливо для випадкового ефекту (див. Новий приклад), тому я думаю, що це не просто базується на деякому постійному факторі величин вірогідності.
каламбур

4
@Ben Встановлення високого значення nAGQв glmerMLE зробило порівнянні. Точність за замовчуванням glmerне була дуже хорошою.
примхнути

5
Посилання на подібне питання lme4, яке @Steve Walker допомогло мені вирішити: stats.stackexchange.com/questions/77313/…
Бен Огорек,

3
Що стосується старішого запитання з великою кількістю підсумків, це, ймовірно, може бути натхненним. Я не бачу потреби в цьому закривати.
gung - Відновити Моніку

Відповіді:


3

Установка високого значення nAGQв glmerвиклик зробив ОМП з еквівалента двох методів. Точність за замовчуванням glmerне була дуже хорошою. Це вирішує питання.

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

Дивіться відповідь @ SteveWalker тут. Чому я не можу зіставити результат glmer (family = binomial) з ручною реалізацією алгоритму Гаусса-Ньютона? для отримання детальної інформації.


1
Але оцінені ймовірності логгічності дуже різні (імовірно, деякі константи), тому різні методи не слід змішувати.
примхнути

1
хм, цікаво / дивно - дякую за налаштування цього прикладу, я спробую знайти час, щоб розглянути його.
Бен Болкер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.