如何在 R 中获得与 Stata 中相同的 AIC 和 BIC 值?

How to get the same values for AIC and BIC in R as in Stata?

假设我有一个非常简单的模型

library(foreign)

smoke <- read.dta("http://fmwww.bc.edu/ec-p/data/wooldridge/smoke.dta")

smoking.reg <- lm(cigs ~ educ, data=smoke)

AIC(smoking.reg)
BIC(smoking.reg)

在 R 中我得到以下结果:

> AIC(smoking.reg)
[1] 6520.26
> BIC(smoking.reg)
[1] 6534.34

运行 然而在 Stata 中同样的回归

 use http://fmwww.bc.edu/ec-p/data/wooldridge/smoke.dta
 reg cigs educ

return结果如下

estat ic

如何让 R 达到 return 与 Stata 的 AIC 和 BIC 完全相同的值?

AIC 计算为 -2*log likelihood + 2* number of parameters
BIC 的计算公式为 -2*log likelihood + log(n)* number of parameters,其中 n 是样本大小。

您的线性回归具有三个参数 - 两个系数和方差 - 因此您可以将 AICBIC 计算为

ll = logLik(smoking.reg)
aic = -2*ll + 2* 3 # 6520.26
bic = -2*ll + log(nrow(smoke))* 3 # 6534.34

(正如 Ben Bolker 在评论中提到的,logLik 对象有几个属性,您可以使用这些属性来获取参数的数量("df")和观察的数量("nobs"). 参见 attr(ll, "df")attr(ll, "nobs") )

Stata不包含方差参数,只包含系数个数。这通常不会成为问题,因为信息标准通常用于比较模型 (AIC_of_model1 - AIC_of_model2),因此如果在两次计算中都省略此参数,则不会有任何区别。在 Stata 中计算是

aic = -2*ll + 2* 2 # 6518.26
bic = -2*ll + log(nrow(smoke))* 2 # 6527.647