如何在 R 中凭经验证明 AIC 和 BIC 等价于哪些交叉验证方法?

机器算法验证 r aic 交叉验证 比克
2022-01-19 10:43:13

在本网站其他地方的一个问题中,有几个答案提到 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 的计算方式,我可以看到为什么在计算上会出现这种情况,但我不确定为什么在概念上会出现这种情况。如果有人也能阐明这个问题,我将不胜感激。

1个回答

为了部分回答我自己的问题,我阅读了维基百科对留一法交叉验证的描述

涉及使用来自原始样本的单个观察作为验证数据,并将剩余的观察作为训练数据。重复此操作,以便将样本中的每个观察结果用作验证数据一次。

在 R 代码中,我怀疑这意味着这样的事情......

resid <- rep(NA, Nobs) 
for (lcv in 1:Nobs)
    {
        data.loo <- data[-lcv,] #drop the data point that will be used for validation
        loo.model <- lm(y ~ a+b,data=data.loo) #construct a model without that data point
            resid[lcv] <- data[lcv,"y"] - (coef(loo.model)[1] + coef(loo.model)[2]*data[lcv,"a"]+coef(loo.model)[3]*data[lcv,"b"]) #compare the observed value to the value predicted by the loo model for each possible observation, and store that value
    }

...应该产生与 AIC 相关的残留值。实际上,上面详述的 LOO 循环每次迭代的残差平方和是 notable.seeds 的 AIC 的良好预测指标,r^2 = .9776。但是,在其他地方,一位贡献者建议 LOO 应该渐近等效于 AIC(至少对于线性模型),所以我有点失望 r^2 并不接近 1。显然这不是一个真正的答案 -更像是尝试鼓励某人尝试提供更好答案的附加代码。

附录:由于固定样本量模型的 AIC 和 BIC 仅以常数变化,因此 BIC 与残差平方的相关性与 AIC 与残差平方的相关性相同,因此我上面采用的方法似乎没有结果。