Tại sao glmer không đạt được khả năng tối đa (như được xác minh bằng cách áp dụng tối ưu hóa chung hơn nữa)?


37

Rất nhiều lần lấy được MLE của GLMM rất khó và trong thực tế, tôi biết, chúng ta không nên sử dụng tối ưu hóa vũ lực (ví dụ, sử dụng optimmột cách đơn giản). Nhưng với mục đích giáo dục của riêng tôi, tôi muốn thử nó để đảm bảo rằng tôi hiểu chính xác mô hình (xem mã bên dưới). Tôi thấy rằng tôi luôn nhận được kết quả không nhất quán từ glmer().

Cụ thể, ngay cả khi tôi sử dụng MLE từ glmercác giá trị ban đầu, theo hàm khả năng tôi đã viết ( negloglik), chúng không phải là MLE ( opt1$valuenhỏ hơn opt2). Tôi nghĩ hai lý do tiềm năng là:

  1. negloglik không được viết tốt để có quá nhiều lỗi số trong đó và
  2. đặc điểm kỹ thuật mô hình là sai. Đối với đặc tả mô hình, mô hình dự định là:

f g a b s

L= =Πtôi= =1n(-f(ytôi|N,một,b,rtôi)g(rtôi|S)drtôi)
trong đó là nhị phân pmf và là pdf bình thường. Tôi đang cố gắng ước tính , và . Cụ thể, tôi muốn biết nếu đặc tả mô hình là sai, đặc điểm kỹ thuật chính xác là gì.fgmộtbS
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...

Một ví dụ đơn giản hơn

Để giảm khả năng có lỗi số lớn, tôi đã tạo một ví dụ đơn giản hơn.

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 

các MLE (không phải bản thân khả năng đăng nhập) có thể so sánh được không? Đó là, bạn chỉ tắt bởi một hằng số?
Ben Bolker

1
Các MLE ước tính rõ ràng khác nhau ( MLE.glmerMLE.optim) đặc biệt là đối với hiệu ứng ngẫu nhiên (xem ví dụ mới), vì vậy nó không chỉ dựa trên một số yếu tố không đổi trong các giá trị khả năng, tôi nghĩ.
ngụy biện

4
@Ben Đặt giá trị cao nAGQtrong glmerlàm cho các MLE có thể so sánh được. Độ chính xác mặc định glmerkhông được tốt lắm.
ngụy biện vào

5
Liên kết với một câu hỏi lme4 tương tự mà @Steve Walker đã giúp tôi với: stats.stackexchange.com/questions/77313/ mẹo
Ben Ogorek

3
Là một câu hỏi cũ hơn với rất nhiều câu hỏi, đây có thể là câu hỏi hay. Tôi không thấy cần phải đóng cái này.
gung - Phục hồi Monica

Câu trả lời:


3

Đặt giá trị cao nAGQtrong glmercuộc gọi đã tạo ra các MLE từ hai phương thức tương đương. Độ chính xác mặc định glmerkhông được tốt lắm. Điều này giải quyết vấn đề.

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

Xem câu trả lời của @ SteveWalker tại đây Tại sao tôi không thể kết hợp đầu ra glmer (gia đình = nhị thức) với triển khai thủ công thuật toán Gauss-Newton? để biết thêm chi tiết.


1
Nhưng các loglikabilities ước tính rất khác nhau (có lẽ là bởi một số hằng số), vì vậy các phương pháp khác nhau không nên được trộn lẫn.
ngụy biện vào

1
hmm, thú vị / đáng ngạc nhiên - cảm ơn vì đã thiết lập ví dụ này, tôi sẽ cố gắng tìm thời gian để xem xét nó.
Ben Bolker
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.