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.
fuente