En una pregunta en otra parte de este sitio, varias respuestas mencionaron que el AIC es equivalente a la validación cruzada de dejar uno fuera (LOO) y que el BIC es equivalente a la validación cruzada K-fold. ¿Hay alguna manera de demostrar esto empíricamente en R de modo que las técnicas involucradas en LOO y K-fold se aclaren y demuestren que son equivalentes a los valores AIC y BIC? Un código bien comentado sería útil a este respecto. Además, para demostrar el BIC, utilice el paquete lme4. Vea a continuación un conjunto de datos de muestra ...
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))
Según comentarios anteriores, a continuación proporcioné una lista de semillas del 1 al 10000 en la que AIC y BIC no están de acuerdo. Esto se realizó mediante una simple búsqueda a través de las semillas disponibles, pero si alguien pudiera proporcionar una forma de generar datos que tendieran a producir respuestas divergentes a partir de estos dos criterios de información, podría ser particularmente informativo.
notable.seeds <- read.csv("http://student.ucr.edu/~rpier001/res.csv")$seed
Por otro lado, pensé en ordenar estas semillas por el grado en que AIC y BIC no están de acuerdo, lo que he intentado cuantificar como la suma de las diferencias absolutas de AIC y BIC. Por ejemplo,
AICDiff <- AIC(bad.model) - AIC(good.model)
BICDiff <- BIC(logLik(bad.model)) - BIC(logLik(good.model))
disagreement <- sum(abs(c(AICDiff,BICDiff)))
donde mi métrica de desacuerdo solo se aplica razonablemente cuando las observaciones son notables. Por ejemplo,
are.diff <- sum(sign(c(AICDiff,BICDiff)))
notable <- ifelse(are.diff == 0 & AICDiff != 0,TRUE,FALSE)
Sin embargo, en los casos en que AIC y BIC no estaban de acuerdo, el valor de desacuerdo calculado siempre fue el mismo (y es una función del tamaño de la muestra). Mirando hacia atrás a cómo se calculan AIC y BIC, puedo ver por qué este podría ser el caso computacionalmente, pero no estoy seguro de por qué sería el caso conceptualmente. Si alguien pudiera aclarar ese problema también, lo agradecería.