【问题标题】:How to get the same values for AIC and BIC in R as in Stata?如何在 R 中获得与 Stata 中相同的 AIC 和 BIC 值?
【发布时间】:2020-06-11 17:18:36
【问题描述】:

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

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

返回以下结果

estat ic

如何让 R 返回与 Stata 的 AIC 和 BIC 完全相同的值?

【问题讨论】:

  • 看起来状态正在将参数的数量计算为两个,因此可能不包括错误参数。因此,在 r 中重现 stata 设置编号。参数为两个。
  • ... 对于 aic R 使用 ll = logLik(smoking.reg); -2*ll + 2*3 # 3 == attr(ll, "df")) 但状态使用 -2*ll + 2*2
  • @user20650,您想将此作为答案发布吗?更彻底的是,可以创建 AIC.lmBIC.lm,它们将基于 df+1 重新计算(loglik 对象还有一个“nobs”属性,可以计算 BIC ...

标签: r stata


【解决方案1】:

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 在 cmets 中提到的,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

【讨论】:

  • 这是正确的。 Stata这里没有计算方差参数。
猜你喜欢
  • 2015-10-01
  • 2017-04-16
  • 2017-06-22
  • 1970-01-01
  • 2018-02-21
  • 2018-02-09
  • 2021-08-28
  • 1970-01-01
  • 2019-11-19
相关资源
最近更新 更多