TL;DR:哪个对于逻辑回归、聚合二项式或伯努利中的 BIC 是正确的?
底部更新
假设我有一个要应用逻辑回归的数据集。为了举例,假设有团体与每个参与者,总计. 结果为 0 或 1。例如以下数据集(R 代码):
library(dplyr)
library(tidyr)
set.seed(45)
d <- tibble(y = rbinom(500, 1, .5),
x = factor(rep(LETTERS[1:5], each = 100)))
我可以通过两种方式表示这一点:如上所述,将每个观察值视为伯努利随机变量,或者将组内的观察值聚合并将每个观察值视为二项式。数据集中的行数在第一个实例中为 500,在第二个实例中为 5。
我可以构建聚合数据集:
d %>%
group_by(x, y) %>%
summarise(n = n()) %>%
spread(y, n) %>%
rename(f = `0`, s = `1`) %>%
mutate(n = s + f) -> d_agg
然后我可以使用 R 中的两个数据集拟合逻辑回归:
g_bern <- glm(y ~ x, data=d, family=binomial)
g_binom <- glm(cbind(s,f) ~ x, data=d_agg, family=binomial)
更新 2:我们现在适合仅拦截模型:
g_bern0 <- glm(y ~ 1, data=d, family=binomial)
g_binom0 <- glm(cbind(s,f) ~ 1, data=d_agg, family=binomial)
并计算 AIC:
> AIC(g_bern)
# [1] 694.6011
> AIC(g_binom)
# [1] 35.22172
这当然有一个常数
2*sum(lchoose(d_agg$n, d_agg$s)) # [1] 659.3794
正如预期的那样(请参阅:逻辑回归:伯努利与二项式响应变量)。
但是,BIC 的差异在于该常数和一个取决于“观察次数”的因素,并且每个观察次数都不同:
> BIC(g_bern)
# [1] 715.6742
> BIC(g_binom)
# [1] 33.26891
> nobs(g_bern)
# [1] 500
> nobs(g_binom)
# [1] 5
为了确认,我们可以重新计算两者的 BIC:
> -2*logLik(g_bern) + attr(logLik(g_bern),"df")*log(nobs(g_bern))
# 'log Lik.' 715.6742 (df=5)
> -2*logLik(g_binom) + attr(logLik(g_binom),"df")*log(nobs(g_binom))
# 'log Lik.' 33.26891 (df=5)
事实上,这两个数字唯一不同的地方是.
更新 2:当我们尝试评估 factorx
时,我们看到仅归因于观察数量的分歧:
> BIC(g_bern0) - BIC(g_bern)
# [1] -17.66498
> BIC(g_binom0) - BIC(g_binom)
# [1] 0.7556999
更新 2:正如预期的那样,AIC 是一致的:
> AIC(g_bern0) - AIC(g_bern)
# [1] -0.8065485
> AIC(g_binom0) - AIC(g_binom)
# [1] -0.8065485
这让我感到惊讶,因为我认为 R 会“知道”使用两者中的哪一个来防止歧义。在这两种情况下,它具有相同的信息。
哪一个是“对的”?还是BIC真的这么随意?
更新:我不想将伯努利与二项式模型进行比较。这只是一个玩具示例。我有一组比较重要的是我使用哪种设置,因为惩罚是不同的。我有两组模型比较,获胜的模型会根据惩罚,即使这些在我看来是同一组模型。
更新 2 和 3:添加了对仅拦截模型的比较,并更改了随机种子以获得 BIC 中的符号差异。