0

正如 glm() 的文档所解释的,glm() 返回的值的 aic 组件不是有效的 AIC:

对于高斯、伽玛和逆高斯族,色散是从残余偏差估计的,参数的数量是系数的数量加一。对于高斯族,使用色散的 MLE,因此这是 AIC 的有效值,但对于 Gamma 和逆高斯族则不是。

因此,需要以其他方式获得有效的 AIC。

4

1 回答 1

2

如果您想使用 step() 或 MASS::stepAIC() 模型选择函数,您可以首先通过执行以下操作确保正确计算 AIC:

GammaAIC <- function(fit){
  disp <- MASS::gamma.dispersion(fit)
  mu <- fit$fitted.values
  p <- fit$rank
  y <- fit$y
  -2 * sum(dgamma(y, 1/disp, scale = mu * disp, log = TRUE)) + 2 * p
}
GammaAICc <- function(fit){
  val <- logLik(fit)
  p <- attributes(val)$df
  n <- attributes(val)$nobs
  GammaAIC(fit) + 2 * p * (p + 1) / (n - p - 1)      
}

my_extractAIC <- function(fit, scale=0, k=2, ...){
  n <- length(fit$residuals)
  edf <- n - fit$df.residual  
  if (fit$family$family == "Gamma"){
    aic <- GammaAIC(fit)
  } else {
    aic <- fit$aic
  }
  c(edf, aic + (k - 2) * edf)
}
assignInNamespace("extractAIC.glm", my_extractAIC, ns="stats")

如果你使用 glmulti 包,你可以简单地通过 glmulti() 的 crit 参数指定使用上述 GammaAIC() 或 GammaAICc() 函数。

于 2012-11-15T19:55:01.577 回答