glmerが最尤を達成しないのはなぜですか(さらに一般的な最適化を適用することにより検証されます)?


37

数値的に導出MLE SのGLMMは実際には、困難であると、私は知っている、我々は(使用して、例えばブルートフォース最適化を使用しないでくださいoptimシンプルな方法で)。しかし、私自身の教育目的のために、モデルを正しく理解するために試してみたいと思います(以下のコードを参照)。私はいつも矛盾した結果を得ることがわかったglmer()

特に、MLE glmerを初期値として使用しても、記述した尤度関数に従って(negloglik)、MLEではありません(opt1$valueより小さいopt2)。次の2つの理由が考えられます。

  1. negloglik うまく記述されていないため、数値エラーが多すぎます。
  2. モデルの仕様が間違っています。モデル仕様の場合、対象モデルは次のとおりです。

fは二項PMFであり、Gは正常PDFです。a b、および sを推定しようとしています。特に、モデルの仕様が間違っているかどうか、正しい仕様は何かを知りたい。

L==1nfy|Nabrgr|sdr
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...

より簡単な例

大きな数値誤差が生じる可能性を減らすために、より単純な例を作成しました。

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(対数尤度そのものではない)は同等ですか?つまり、あなたは定数でちょうど離れていますか?
ベンボルカー

1
推定されたMLEはMLE.glmerMLE.optim特にランダム効果(および新しい例を参照)については明らかに異なっている(および)ため、尤度値の一定の要因に基づいているだけではないと思います。
めき

4
@Ben nAGQinの高い値を設定するとglmer、MLEが同等になりました。のデフォルトの精度はglmerあまり良くありませんでした。
よじれ

5
@Steveウォーカーで私を助けたことと同様のlme4の質問へのリンク:stats.stackexchange.com/questions/77313/...
ベンOgorek

3
多くの賛成票を持つ古い質問として、これはおそらく祖父である可能性があります。これを閉じる必要はありません。
gung-モニカの回復

回答:


3

呼び出しnAGQで高い値を設定するとglmer、2つのメソッドのMLEは同等になりました。のデフォルトの精度はglmerあまり良くありませんでした。これで問題が解決します。

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

@SteveWalkerの回答はこちら なぜglmer(family = binomial)出力をGauss-Newtonアルゴリズムの手動実装と一致させられないのですか?詳細については。


1
ただし、推定される対数尤度は非常に異なるため(おそらく一定の定数による)、異なる方法を混在させることはできません。
安っぽい

1
うーん、面白い/驚くべきこと-この例を設定してくれてありがとう、私はそれを調べる時間を見つけようとします。
ベンボルカー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.