簡體   English   中英

如何在stepAIC中計算AIC

[英]How is AIC calculated in stepAIC

這是一個非常簡單的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值不同。 謝謝!

AIC僅定義為任意常量。 只要在比較不同模型的AIC時使用相同的常數值,就無所謂了。 如果你看一下?extractAIC?AIC ,你會發現兩種方法都使用的公式。

基本上,要么使用extractAIC ,要么使用AIC ,但不能同時使用兩者。

這讓我感到煩惱,所以我決定從第一原則開始。

重新適合模型:

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

這有點 ,沒有發現故障。

參數數量:

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)

謝謝@benbolker的詳細解答。 你提到過:

這有點 ,沒有發現故障。

我調查了一下,發現如果你修改這一行:

ss <- ss0*(n-1)/n

對此:

ss <- sqrt( (ss0)^2 * (n - length(coef(lm.D9))) / n )

然后結果將完全相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM