¿Cómo se puede demostrar empíricamente en R a qué métodos de validación cruzada son equivalentes AIC y BIC?

26

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.

russellpierce
fuente
+1 El código sería simple de escribir, aún así estoy muy interesado en ver un conjunto de datos claro e ilustrativo.
No estoy seguro de qué necesitaría todo en un conjunto de datos claro e ilustrativo, pero he intentado incluir un conjunto de datos de muestra.
russellpierce
Entonces, mire: lo que proporcionó es un ejemplo de un conjunto inútil, porque el BIC y el AIC dan los mismos resultados: 340 v. 342 para AIC y 349 v. 353 para BIC - tan bueno. El modelo gana en ambos casos. La idea general con esa convergencia es que cierta validación cruzada seleccionará el mismo modelo que su IC correspondiente.
He hecho un escaneo simple y, por ejemplo, para la semilla 76, los circuitos integrados no están de acuerdo.
1
Wow, esto es algo que será aún más difícil de conseguir, me temo; Mi punto general en toda la discusión es que la convergencia de esos teoremas es demasiado débil, por lo que la diferencia puede surgir de fluctuaciones aleatorias. (Y que no está trabajando para el aprendizaje de máquina, pero espero que esto es obvio.)

Respuestas:

5

En un intento de responder parcialmente a mi propia pregunta, leí la descripción de Wikipedia de la validación cruzada de dejar uno afuera

implica el uso de una sola observación de la muestra original como datos de validación y las observaciones restantes como datos de entrenamiento. Esto se repite de tal manera que cada observación en la muestra se usa una vez como datos de validación.

En el código R, sospecho que eso significaría algo como esto ...

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
    }

... se supone que produce valores en residuos que están relacionados con el AIC. En la práctica, la suma de los residuos cuadrados de cada iteración del bucle LOO detallado anteriormente es un buen predictor de la AIC para las semillas notables, r ^ 2 = .9776. Pero, en otra parte , un colaborador sugirió que LOO debería ser asintóticamente equivalente al AIC (al menos para los modelos lineales), por lo que estoy un poco decepcionado de que r ^ 2 no esté más cerca de 1. Obviamente, esto no es realmente una respuesta: más bien como código adicional para tratar de alentar a alguien a que intente proporcionar una mejor respuesta.

Anexo: Dado que AIC y BIC para modelos de tamaño de muestra fijo solo varían de forma constante, la correlación de BIC con los residuos cuadrados es la misma que la correlación de AIC con los residuos cuadrados, por lo que el enfoque que tomé anteriormente parece ser inútil.

russellpierce
fuente
tenga en cuenta que esta será su respuesta aceptada para la recompensa (en caso de que no elija una respuesta, la recompensa seleccionará automáticamente la respuesta con más puntos)
robin girard
1
bueno, otorgarme la recompensa me parece una tontería, pero nadie más ha enviado una respuesta.
russellpierce