In una domanda altrove su questo sito, diverse risposte hanno indicato che l'AIC equivale alla validazione incrociata con esclusione (LOO) e che il BIC è equivalente alla convalida incrociata con K. C'è un modo per dimostrarlo empiricamente in R in modo tale che le tecniche coinvolte in LOO e K-fold siano rese chiare e dimostrate equivalenti ai valori AIC e BIC? Un codice ben commentato sarebbe utile al riguardo. Inoltre, nel dimostrare il codice BIC, utilizzare il pacchetto lme4. Vedi sotto per un set di dati di esempio ...
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))
Per i commenti precedenti, di seguito ho fornito un elenco di semi da 1 a 10000 in cui AIC e BIC non sono d'accordo. Ciò è stato fatto da una semplice ricerca tra i semi disponibili, ma se qualcuno potesse fornire un modo per generare dati che tenderebbero a produrre risposte divergenti da questi due criteri di informazione, potrebbe essere particolarmente informativo.
notable.seeds <- read.csv("http://student.ucr.edu/~rpier001/res.csv")$seed
A parte questo, ho pensato di ordinare questi semi in base alla misura in cui l'AIC e il BIC non sono d'accordo, che ho provato a quantificare come la somma delle differenze assolute tra AIC e BIC. Per esempio,
AICDiff <- AIC(bad.model) - AIC(good.model)
BICDiff <- BIC(logLik(bad.model)) - BIC(logLik(good.model))
disagreement <- sum(abs(c(AICDiff,BICDiff)))
dove la mia metrica di disaccordo si applica ragionevolmente solo quando le osservazioni sono notevoli. Per esempio,
are.diff <- sum(sign(c(AICDiff,BICDiff)))
notable <- ifelse(are.diff == 0 & AICDiff != 0,TRUE,FALSE)
Tuttavia, nei casi in cui AIC e BIC non fossero d'accordo, il valore di disaccordo calcolato era sempre lo stesso (ed è una funzione della dimensione del campione). Guardando indietro a come vengono calcolati AIC e BIC, posso capire perché questo potrebbe essere il caso dal punto di vista computazionale, ma non sono sicuro del motivo per cui sarebbe il caso concettualmente. Se qualcuno potesse chiarire anche questo problema, lo apprezzerei.