AICc为何小于AIC?AICcmodavg包计算异常问询
AICc计算结果小于AIC的问题排查
问题描述
AICc是针对小样本对AIC的修正,修正项始终为正,因此理论上AICc应大于等于AIC。但使用AICcmodavg包的AICc函数计算nlsLM拟合的零模型时,出现了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(mNull) # [1] 175.6431 AICc(mNull) # [1] 169.6431
手动按照帮助文档公式−2∗log−likelihood+2∗K∗(n/(n−K−1))计算的结果为176.8431,与AICc函数输出不符,但手动计算AIC的结果与R基础包一致。
问题原因
AICcmodavg包的AICc函数对非线性模型(如nlsLM对象)的参数数目K计数规则与R基础包AIC函数不一致:
- R基础包的
AIC函数处理非线性模型时,会将残差标准差计入参数数目(你的零模型中K=2:截距c+ 残差σ); AICc函数默认仅统计模型的固定参数(你的零模型中K=1:仅截距c),错误的K值导致修正项计算异常,最终得到偏小的AICc结果。
验证与解决方法
方法1:手动指定正确的K值
调用AICc时,指定与AIC函数一致的K值(此处为2),即可得到符合理论预期的结果:
AICc(mNull, K=2) # 结果约为176.8431,大于AIC值
方法2:改用线性模型拟合零模型
你的零模型本质是均值模型,属于线性模型范畴,使用lm拟合时,AICc函数会自动正确计算K值:
mNull_lm <- lm(y ~ 1) AIC(mNull_lm) # 与nls模型的AIC结果接近 AICc(mNull_lm) # 结果大于AIC,符合理论预期
补充说明
AICc的修正项2K(K+1)/(n-K-1)始终为正(K为正整数,且n>K+1),因此AICc必然大于等于AIC。本次异常完全是AICc函数对非线性模型的参数计数错误导致的。
内容的提问来源于stack exchange,提问作者Taggerung
相关产品推荐
相关产品推荐

