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


26

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


+1该代码很容易编写,但我仍然对看到清晰,说明性的数据集非常感兴趣。

我不确定在清晰而说明性的数据集中需要具备什么功能,但是我已经尝试将样本数据集包括在内。
russellpierce

因此,请看:您提供的是无用集合的示例,因为BIC和AIC给出的结果相同:AIC的340 v.342和BIC的349 v.353-很好,两种情况下模型都胜出。具有这种收敛性的整个想法是,某些交叉验证将选择相同的模型作为其对应的IC。

我进行了简单的扫描,例如对于种子76,IC表示不同意。

1
哇,恐怕很难做到这一点。我在整个讨论中的总体观点是,这些定理的收敛性太弱,因此差异可能来自随机波动。(而且它不适用于机器学习,但我希望这是显而易见的。)

Answers:


5

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

涉及将原始样本中的单个观测值用作验证数据,而将其余观测值用作训练数据。重复此步骤,以便将样本中的每个观察值一次用作验证数据。

在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循环的每次迭代的残差平方和是AIC对于值得注意的种子的良好预测,r ^ 2 = .9776。但是,在其他地方,有贡献者建议LOO应当渐近地等效于AIC(至少对于线性模型而言),因此,令我有些失望的是r ^ 2并不接近于1。显然,这并不是一个真正的答案-更像是其他代码,以鼓励他人尝试提供更好的答案。

附录:由于固定样本量模型的AIC和BIC仅相差一个常数,因此BIC与残差平方的相关性与AIC与残差平方的相关性相同,因此我采取的上述方法似乎没有效果。


请注意,这将是您接受的赏金答案(如果您不选择答案,赏金会自动选择得分最高的答案)
robin girard 2010年

1
很好-向我自己授予赏金很愚蠢-但没有其他人提交答案。
russellpierce 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.