我将使用一个示例,以便您可以重现结果
# 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 作为参数的数量。这些计算有什么问题?