为什么 R 中的 AIC 公式似乎比预期使用了一个额外的参数?

机器算法验证 r 时间序列 造型 aic
2022-03-22 09:31:07

我将使用一个示例,以便您可以重现结果

# mortality 
mort = ts(scan("http://www.stat.pitt.edu/stoffer/tsa2/data/cmort.dat"),start=1970, frequency=52)

# temperature
temp = ts(scan("http://www.stat.pitt.edu/stoffer/tsa2/data/temp.dat"), start=1970, frequency=52)

#pollutant particulates
part = ts(scan("http://www.stat.pitt.edu/stoffer/tsa2/data/part.dat"), start=1970, frequency=52)

temp = temp-mean(temp)
temp2 = temp^2
trend = time(mort)

现在,为死亡率数据拟合模型

fit = lm(mort ~ trend + temp + temp2 + part, na.action=NULL)

我现在想要的是重现 AIC 命令的结果

AIC(fit)
[1] 3332.282

根据 R 的 AIC 帮助文件,AIC = -2 * log.likelihood + 2 * npar。如果我是正确的,我认为 log.likelihood 是使用以下公式给出的:

n = length(mort)
RSS = anova(fit)[length(anova(fit)[,2]),2] # there must be better ways to get this, anyway
(log.likelihood <- -n/2*(log(2*pi)+log(RSS/n)+1))

 [1] -1660.135

这大约等于

logLik(fit)
'log Lik.' -1660.141 (df=6)

据我所知,模型中的参数数量为 5(我怎样才能以编程方式获得这个数字??)。所以 AIC 应该由下式给出:

-2 * log.likelihood + 2 * 5
[1] 3330.271

哎呀,看来我应该使用 6 而不是 5 作为参数的数量。这些计算有什么问题?

1个回答
> -2*logLik(fit)+2*(length(fit$coef)+1)
[1] 3332.282

(你忘了;你有 6 个参数,因为σϵ也得估计!