这是一个非常简单的lm模型来自?lm
ctl <- c(4.17,5.58,5.18,6.11,4.50,4.61,5.17,4.53,5.33,5.14)
trt <- c(4.81,4.17,4.41,3.59,5.87,3.83,6.03,4.89,4.32,4.69)
group <- gl(2,10,20, labels=c("Ctl","Trt"))
weight <- c(ctl, trt)
lm.D9 <- lm(weight ~ group)
如果我使用stepAIC到lm.D9,在第一行它说AIC = -12.58
require(MASS)
stepAIC(lm.D9)
如果我直接在lm.D9上使用AIC,它会给出不同的值46.17648
AIC(lm.D9)
我的问题是为什么2个AIC值不同。谢谢!
答案 0 :(得分:4)
AIC仅定义为任意常量。只要在比较不同模型的AIC时使用相同的常数值,就无所谓了。如果您查看?extractAIC
和?AIC
,您会找到两种方法使用的公式。
基本上,使用extractAIC
或AIC
,但不能同时使用。{/ p>
答案 1 :(得分:4)
这让我感到烦恼,所以我决定从第一原则开始研究它。
重新适应模型:
d <- data.frame(weight=
c(ctl=c(4.17,5.58,5.18,6.11,4.50,4.61,5.17,4.53,5.33,5.14),
trt=c(4.81,4.17,4.41,3.59,5.87,3.83,6.03,4.89,4.32,4.69)),
group=gl(2,10,20, labels=c("Ctl","Trt")))
lm.D9 <- lm(weight ~ group, d)
标准访问者返回的值:
(AIC1 <- AIC(lm.D9))
> 46.17468
(LL1 <- logLik(lm.D9))
> -20.08824 (df=3)
从第一原则重建:
n <- nrow(d)
ss0 <- summary(lm.D9)$sigma
ss <- ss0*(n-1)/n
(LL2 <- sum(dnorm(d$weight,fitted(lm.D9),
sd=ss,log=TRUE)))
> -20.08828
这是 tiny 位,没有发现故障。
参数数量:
npar <- length(coef(lm.D9))+1
(AIC2 <- -2*LL2+2*npar)
> 46.1756
仍然不仅仅是数字模糊,而是只有一百万分之一。
现在让我们看看stepAIC
正在做什么:
MASS::stepAIC(lm.D9) ## start: AIC = -12.58
extractAIC(lm.D9) ## same value (see MASS::stepAIC for details)
stats:::extractAIC.lm ## examine the code
RSS1 <- deviance(lm.D9) ## UNSCALED sum of squares
RSS2 <- sum((d$weight-fitted(lm.D9))^2) ## ditto, from first principles
AIC3 <- n*log(RSS1/n)+2*2 ## formula used within extractAIC
你可以从sigma-hat = RSS / n中找出上面使用的公式 - 或者看看Venables和Ripley MASS的推导。
添加缺失的术语:不计数的方差参数,加上归一化常数
(AIC3 + 2 - 2*(-n/2*(log(2*pi)+1)))
这与上面的AIC1
完全相同(对于1e-14)
答案 2 :(得分:0)
谢谢@benbolker的详细解答。你提到过:
这是微位,没有发现故障。
我调查了一下,发现如果你修改这一行:
ss <- ss0*(n-1)/n
到此:
ss <- sqrt( (ss0)^2 * (n - length(coef(lm.D9))) / n )
然后结果将完全相同。