glm() のドキュメントで説明されているように、glm() によって返される値の aic コンポーネントは有効な AIC ではありません。
ガウス、ガンマ、および逆ガウス ファミリの場合、分散は残留偏差から推定され、パラメータの数は係数の数に 1 を加えた数になります。ガウス ファミリの場合、分散の MLE が使用されるため、これは AIC の有効な値ですが、ガンマおよび逆ガウス ファミリの場合はそうではありません。
したがって、有効な AIC を別の方法で取得する必要があります。
glm() のドキュメントで説明されているように、glm() によって返される値の aic コンポーネントは有効な AIC ではありません。
ガウス、ガンマ、および逆ガウス ファミリの場合、分散は残留偏差から推定され、パラメータの数は係数の数に 1 を加えた数になります。ガウス ファミリの場合、分散の MLE が使用されるため、これは AIC の有効な値ですが、ガンマおよび逆ガウス ファミリの場合はそうではありません。
したがって、有効な AIC を別の方法で取得する必要があります。
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 パラメータで指定するだけです。