在该站点上其他地方的问题中,有几个答案提到AIC等同于留一法(LOO)交叉验证,而BIC等同于K倍交叉验证。有没有一种方法可以在R中以经验方式证明这一点,从而弄清楚LOO和K折中涉及的技术并证明它们与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的计算方式,我可以看到为什么在计算上会是这种情况,但是我不确定为什么在概念上会是这种情况。如果有人也能阐明这个问题,我将不胜感激。