2011-12-04 27 views
7

計算下面是一個非常簡單的LM模型?流明如何AIC在stepAIC

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) 

如果我使用AIC直接lm.D9,它提供了不同的值46.17648

AIC(lm.D9) 

我的問題是,爲什麼2個AIC值是不同的。謝謝!

回答

4

AIC只能定義爲任意常數。只要在比較不同模型的AIC時使用相同的常數值,這並不重要。如果你看?extractAIC?AIC,你會發現這兩種方法使用的公式。

基本上,或者使用extractAICAIC,但不能同時使用兩者。

+0

它非常有意義。我注意到恆定的因素。謝謝!存在任意常量的任何特定原因? – FMZ

4

這讓我很煩,所以我決定從最初的原則出發。

請重新安裝模式:從第一原理

(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 

這是一個微小咬下

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) 

值由標準訪問器返回,沒有發現故障。

數量的參數:

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 

你可以計算出從Σ-帽= RSS/N上面所用的公式 - 或見維納布爾斯和裏普利(質量)的推導。

添加缺少的方面:無數的變化參數,再加上歸一化常數

(AIC3 + 2 - 2*(-n/2*(log(2*pi)+1))) 

這是完全一樣的上述

0

(到1E-14)作爲AIC1謝謝@benbolker了詳細的解答。你提到:

這是一個微小位關閉,還沒有發現故障。

我看着它,並發現,如果修改這一行:

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

這樣:

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

那麼結果將是完全一樣的。