0

glm() のドキュメントで説明されているように、glm() によって返される値の aic コンポーネントは有効な AIC ではありません。

ガウス、ガンマ、および逆ガウス ファミリの場合、分散は残留偏差から推定され、パラメータの数は係数の数に 1 を加えた数になります。ガウス ファミリの場合、分散の MLE が使用されるため、これは AIC の有効な値ですが、ガンマお​​よび逆ガウス ファミリの場合はそうではありません。

したがって、有効な 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 パッケージを使用する場合、上記の GammaAIC() または GammaAICc() 関数の使用を glmulti() の crit パラメータで指定するだけです。

于 2012-11-15T19:55:01.577 に答える