수치 유도 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
nAGQ
in을 높게 설정 glmer
하면 MLE을 비교할 수 있습니다. 기본 정밀도는 glmer
그리 좋지 않았습니다.
@Steve Walker가 나를 도와 준 비슷한 lme4 질문에 연결 : stats.stackexchange.com/questions/77313/…
—
Ben Ogorek
많은 공감대가있는 오래된 질문으로 아마도 할아버지가 될 수 있습니다. 나는 이것을 닫을 필요가 없다.
—
gung-Monica Monica 복원