从逻辑回归中手动计算logLik

时间:2016-09-21 22:41:50

标签: r regression glm genetic

我运行了混合模型逻辑回归,使用称为glmmkin()的R包(函数:theta)使用遗传关系矩阵调整我的模型。

我的模型输出包括(取自用户手册):

  • coefficients:色散参数估计[1]和方差分量参数估计[2]
  • linear.predictors:固定效果参数估计值(包括截距)。
  • fitted.values:线性预测因子。
  • Y:在原始比例上拟合平均值。
  • P:一个长度等于最终工作向量的样本大小的向量。
  • residuals:尺寸等于样本大小的投影矩阵。
  • cov:原始比例的残差。不要通过色散参数重新缩放。
  • converged:固定效果的协方差矩阵(包括截距)。
  • logLik.glm:收敛的逻辑指标。

我正在尝试获取对数似然,以便计算解释的方差。我的第一直觉是拆开stats::glm()函数以便“手动”计算这个并且我一直试图计算AIC。我使用了here的答案。

我使用model1$aic进行逻辑回归运算进行了一次完整性检查,其中{{1}}为4013.232但是使用我发现的Stack Overflow回答,我获得了30613.03。

我的问题是 - 是否有人知道如何使用我在R中列出的输出手动从逻辑回归计算对数似然?

1 个答案:

答案 0 :(得分:1)

这里没有统计学意见,只是我从glm.fit看到的解决方案。这仅适用于在拟合模型时未指定权重的情况(或者如果您这样做,则需要在模型对象中包含这些权重)

get_logLik <- function(s_model, family = binomial(logit)) {
    n <- length(s_model$y)
    wt <- rep(1, n) # or s_model$prior_weights if field exists
    deviance <- sum(family$dev.resids(s_model$y, s_model$fitted.values, wt))
    mod_rank <- sum(!is.na(s_model$coefficients)) # or s_model$rank if field exists

    aic <- family$aic(s_model$y, rep(1, n), s_model$fitted.values, wt, deviance) + 2 * mod_rank
    log_lik <- mod_rank - aic/2
    return(log_lik)
}

例如......

model <- glm(vs ~ mpg, mtcars, family = binomial(logit))
logLik(model)
# 'log Lik.' -12.76667 (df=2)

sparse_model <- model[c("theta", "coefficients", "linear.predictors", "fitted.values", "y", "P", "residuals", "cov", "converged")]
get_logLik(sparse_model)
#[1] -12.76667