You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 08:25:32