Dans une question ailleurs sur ce site, plusieurs réponses ont mentionné que l'AIC est équivalent à la validation croisée avec absence de contact (LOO) et que le BIC est équivalent à la validation croisée K-fold. Existe-t-il un moyen de démontrer empiriquement cela dans R de telle sorte que les techniques impliquées dans LOO et K-fold soient clairement définies et démontrées comme équivalentes aux valeurs AIC et BIC? Un code bien commenté serait utile à cet égard. De plus, pour démontrer le BIC, veuillez utiliser le package lme4. Voir ci-dessous pour un exemple de jeu de données ...
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))
Selon les commentaires précédents, ci-dessous, j'ai fourni une liste de graines de 1 à 10000 dans lesquelles AIC et BIC ne sont pas d'accord. Cela a été fait par une simple recherche parmi les graines disponibles, mais si quelqu'un pouvait fournir un moyen de générer des données qui auraient tendance à produire des réponses divergentes à partir de ces deux critères d'information, cela pourrait être particulièrement instructif.
notable.seeds <- read.csv("http://student.ucr.edu/~rpier001/res.csv")$seed
En passant, j'ai pensé à commander ces graines par la mesure dans laquelle l'AIC et le BIC ne sont pas d'accord, que j'ai essayé de quantifier comme la somme des différences absolues de l'AIC et du BIC. Par exemple,
AICDiff <- AIC(bad.model) - AIC(good.model)
BICDiff <- BIC(logLik(bad.model)) - BIC(logLik(good.model))
disagreement <- sum(abs(c(AICDiff,BICDiff)))
où ma métrique de désaccord ne s'applique raisonnablement que lorsque les observations sont notables. Par exemple,
are.diff <- sum(sign(c(AICDiff,BICDiff)))
notable <- ifelse(are.diff == 0 & AICDiff != 0,TRUE,FALSE)
Cependant, dans les cas où AIC et BIC étaient en désaccord, la valeur de désaccord calculée était toujours la même (et est fonction de la taille de l'échantillon). En repensant à la façon dont AIC et BIC sont calculés, je peux voir pourquoi cela pourrait être le cas sur le plan informatique, mais je ne sais pas pourquoi ce serait conceptuellement le cas. Si quelqu'un pouvait également élucider ce problème, je l'apprécierais.