수치 유도 MLE 의의 GLMM가 실제로 어렵고, 나는 알고있다, 우리는 (사용, 예를 들면 무력 최적화를 사용하지 않아야 optim하는 간단한 방식으로). 그러나 내 교육 목적으로 모델을 올바르게 이해하기 위해 노력하고 싶습니다 (아래 코드 참조). 나는에서 일관되지 않은 결과를 얻는다는 것을 알았습니다 glmer().
특히, glmer내가 작성한 가능성 함수에 따라 MLE을 초기 값으로 사용하더라도 MLE negloglik이 아닙니다 ( opt1$value보다 작음 opt2). 두 가지 잠재적 이유는 다음과 같습니다.
negloglik수치 오류가 너무 많도록 잘 작성되지 않았습니다.- 모델 사양이 잘못되었습니다. 모델 사양의 경우 의도 된 모델은 다음과 같습니다.
여기서 는 이항 pmf이고 는 정규 pdf입니다. , 및 를 추정하려고합니다 . 특히, 모델 사양이 잘못된 지, 올바른 사양인지 알고 싶습니다.
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 (로그 가능성 자체가 아님)이 비슷한가? 즉, 당신은 상수에 의해 그냥 떨어져 있습니까?
—
Ben Bolker
추정 된 MLE은 특히 임의 효과 (새로운 예 참조)에 대해 명확하게 다르며 (
—
quibble
MLE.glmer및 MLE.optim) 다르기 때문에 가능성 값의 일정한 요인에 기초한 것이 아니라고 생각합니다.
@Ben
—
quibble
nAGQin을 높게 설정 glmer하면 MLE을 비교할 수 있습니다. 기본 정밀도는 glmer그리 좋지 않았습니다.
@Steve Walker가 나를 도와 준 비슷한 lme4 질문에 연결 : stats.stackexchange.com/questions/77313/…
—
Ben Ogorek
많은 공감대가있는 오래된 질문으로 아마도 할아버지가 될 수 있습니다. 나는 이것을 닫을 필요가 없다.
—
gung-Monica Monica 복원