如何通过AIC在R中使用Gamma GLM进行模型选择?

时间:2012-11-15 19:55:02

标签: r glm model-comparison

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

  

对于高斯,伽马和逆高斯   根据残差来估计色散   偏差,参数的数量是多少   系数加一。对于一个高斯家庭的MLE   使用色散,因此这是AIC的有效值,但是   Gamma和反高斯族不是。

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

1 个答案:

答案 0 :(得分:1)

如果你想使用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()函数的使用。