在本网站其他地方的一个问题中,有几个答案提到 AIC 相当于留一法 (LOO) 交叉验证,而 BIC 相当于 K-fold 交叉验证。有没有办法在 R 中凭经验证明这一点,从而使 LOO 和 K-fold 中涉及的技术清楚并证明与 AIC 和 BIC 值等效?注释良好的代码在这方面会有所帮助。此外,在演示 BIC 时,请使用 lme4 包。请参阅下面的示例数据集...
library(lme4) #for the BIC function
generate.data <- function(seed)
{
set.seed(seed) #Set a seed so the results are consistent (I hope)
a <- rnorm(60) #predictor
b <- rnorm(60) #predictor
c <- rnorm(60) #predictor
y <- rnorm(60)*3.5+a+b #the outcome is really a function of predictor a and b but not predictor c
data <- data.frame(y,a,b,c)
return(data)
}
data <- generate.data(76)
good.model <- lm(y ~ a+b,data=data)
bad.model <- lm(y ~ a+b+c,data=data)
AIC(good.model)
BIC(logLik(good.model))
AIC(bad.model)
BIC(logLik(bad.model))
根据之前的评论,我在下面提供了 AIC 和 BIC 不同意的从 1 到 10000 的种子列表。这是通过对可用种子的简单搜索来完成的,但是如果有人可以提供一种生成数据的方法,该数据往往会从这两个信息标准中产生不同的答案,那么它可能会提供特别丰富的信息。
notable.seeds <- read.csv("http://student.ucr.edu/~rpier001/res.csv")$seed
顺便说一句,我考虑过按照 AIC 和 BIC 的分歧程度对这些种子进行排序,我尝试将其量化为 AIC 和 BIC 的绝对差异之和。例如,
AICDiff <- AIC(bad.model) - AIC(good.model)
BICDiff <- BIC(logLik(bad.model)) - BIC(logLik(good.model))
disagreement <- sum(abs(c(AICDiff,BICDiff)))
我的分歧度量仅在观察结果显着时才合理适用。例如,
are.diff <- sum(sign(c(AICDiff,BICDiff)))
notable <- ifelse(are.diff == 0 & AICDiff != 0,TRUE,FALSE)
但是,在 AIC 和 BIC 不一致的情况下,计算出的不一致值始终相同(并且是样本量的函数)。回顾 AIC 和 BIC 的计算方式,我可以看到为什么在计算上会出现这种情况,但我不确定为什么在概念上会出现这种情况。如果有人也能阐明这个问题,我将不胜感激。