正如glm()的文档所解释的那样,glm()返回的值的aic组件不是有效的AIC:
对于高斯,伽马和逆高斯 根据残差来估计色散 偏差,参数的数量是多少 系数加一。对于一个高斯家庭的MLE 使用色散,因此这是AIC的有效值,但是 Gamma和反高斯族不是。
因此,需要以其他方式获得有效的AIC。
答案 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()函数的使用。