簡體   English   中英

為什么 AICc 會小於 AIC?

[英]Why would AICc be less than AIC?

我對 AICc 的一般理解是 AIC 針對小樣本進行了修改,因此我們對樣本很少的 model 不太“確定”,並且隨着樣本量變得非常大,修改接近 0,我們變得更加“確定”(借口如果我使用不正確的術語)。 但是,我在“AICcmodavg”package 中使用AICc function 計算 null model(y = mx + c;m = 0)的 AICc 時遇到了一個問題,我正在與其他人進行比較。 在這里您可以看到 AICc 應該小於 AIC:

library(minpack.lm)
library(AICcmodavg)

y = c(80,251,304,482,401,141,242,221,304,243,544,669,638)

mNull <- nlsLM(y ~ c, start=c(c=mean(y)))

當我運行 AIC 函數時:

> AIC(mNull)
[1] 175.6431
> AICc(mNull)
[1] 169.6431

幫助文件說 AICc 應該計算為:−2∗log−likelihood+2∗K∗(n/(n−K−1)),但是當我嘗試手動計算時:

> k=AICc(mNull, return.K = T)
> n=length(y)
> -2*as.numeric(logLik(mNull))+2*k*(n/(n-k-1))
[1] 176.8431

同時,手動計算 AIC 似乎可以正常工作:

> AIC(mNull)==-2*as.numeric(logLik(mNull))+2*k
[1] TRUE

那么從概念上講,為什么 AICc 會小於 AIC? 在這種情況下,n 和 k 都不會導致否定修飾符。 我錯過了什么嗎?

問題在於AICc.nls()計算觀察次數的方式。 如果未提供nobs ,它將使用擬合值的長度。 在您的情況下,這是 1 (不是y的長度)。 因此,如果您向AICc()提供nobs ,您將得到正確的答案。

library(minpack.lm)
library(AICcmodavg)
y = c(80,251,304,482,401,141,242,221,304,243,544,669,638)

mNull <- nlsLM(y ~ c, start=c(c=mean(y)))
#> Warning in .swts * attr(rhs, "gradient"): Recycling array of length 1 in vector-array arithmetic is deprecated.
#>   Use c() or as.vector() instead.

fitted(mNull)
#> [1] 347.6923
#> attr(,"label")
#> [1] "Fitted values"

AICc(mNull, nobs=length(y))
#> [1] 176.8431

k=AICc(mNull, return.K = T)
n=length(y)
-2*as.numeric(logLik(mNull))+2*k*(n/(n-k-1))
#> [1] 176.8431

reprex package (v2.0.1) 創建於 2023-01-24

來自AICcmodavg:::AICc.nls()的相關代碼段(其中nobs=NULL是默認值)是:

    if (identical(nobs, NULL)) {
        n <- length(fitted(mod))
    }
    else {
        n <- nobs
    }

暫無
暫無

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

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