GLM 的对数似然

机器算法验证 r 自习 广义线性模型
2022-03-08 07:39:38

在以下代码中,我使用 glm 对分组数据执行逻辑回归,并使用 mle2“手动”执行逻辑回归。为什么 R 中的 logLik 函数给我的对数似然 logLik(fit.glm)=-2.336 与我手动获得的 logLik(fit.ml)=-5.514 不同?

library(bbmle)

#successes in first column, failures in second
Y <- matrix(c(1,2,4,3,2,0),3,2)

#predictor
X <- c(0,1,2)

#use glm
fit.glm <- glm(Y ~ X,family=binomial (link=logit))
summary(fit.glm)

#use mle2
invlogit <- function(x) { exp(x) / (1+exp(x))}
nloglike <- function(a,b) {
  L <- 0
  for (i in 1:n){
     L <- L + sum(y[i,1]*log(invlogit(a+b*x[i])) + 
               y[i,2]*log(1-invlogit(a+b*x[i])))
  }
 return(-L) 
}  

fit.ml <- mle2(nloglike,
           start=list(
             a=-1.5,
             b=2),
           data=list(
             x=X,
             y=Y,
             n=length(X)),
           method="Nelder-Mead",
           skip.hessian=FALSE)
summary(fit.ml)

#log likelihoods
logLik(fit.glm)
logLik(fit.ml)


y <- Y
x <- X
n <- length(x)
nloglike(coef(fit.glm)[1],coef(fit.glm)[2])
nloglike(coef(fit.ml)[1],coef(fit.ml)[2])
1个回答

似乎 R 中的 logLik 函数计算了 SAS 中称为“完全似然函数”的内容,在这种情况下包括二项式系数。我没有在 mle2 计算中包含二项式系数,因为它对参数估计没有影响。一旦在 mle2 计算中将此常数添加到对数似然中,glm 和 mle2 就一致了。