Come si può dimostrare empiricamente in R a quali metodi di convalida incrociata sono equivalenti AIC e BIC?


26

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.


+1 Il codice sarebbe semplice da scrivere, tuttavia sono molto interessato a vedere un set di dati chiaro e illustrativo.

Non sono sicuro di cosa dovrebbe essere tutto in un set di dati chiaro e illustrativo, ma ho tentato di includere un set di dati di esempio.
Russellpierce,

Quindi guarda: quello che hai fornito è un esempio di un set inutile, perché BIC e AIC danno gli stessi risultati: 340 v. 342 per AIC e 349 v. 353 per BIC - quindi un buon modello vince in entrambi i casi. L'idea con quella convergenza è che una certa validazione incrociata selezionerà lo stesso modello del suo IC corrispondente.

Ho fatto una semplice scansione e per esempio per il seme 76 i CI non sono d'accordo.

1
Wow, questo è qualcosa che sarà ancora più difficile da ottenere, temo; il mio punto generale in tutta la discussione è che la convergenza di quei teoremi è troppo debole, quindi la differenza può emergere da fluttuazioni casuali. (E che non funziona per l'apprendimento automatico, ma spero sia ovvio.)

Risposte:


5

Nel tentativo di rispondere parzialmente alla mia domanda, ho letto la descrizione di Wikipedia della convalida incrociata con esclusione

implica l'utilizzo di una singola osservazione dal campione originale come dati di validazione e le osservazioni rimanenti come dati di addestramento. Questo si ripete in modo tale che ogni osservazione nel campione venga usata una volta come dati di validazione.

Nel codice R, sospetto che significherebbe qualcosa del genere ...

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
    }

... dovrebbe produrre valori in residuo correlati all'AIC. In pratica, la somma dei residui quadrati di ciascuna iterazione del loop LOO descritta sopra è un buon predittore dell'AIC per notable.seeds, r ^ 2 = .9776. Ma altrove un collaboratore ha suggerito che LOO dovrebbe essere asintoticamente equivalente all'AIC (almeno per i modelli lineari), quindi sono un po 'deluso dal fatto che r ^ 2 non sia più vicino a 1. Ovviamente questa non è davvero una risposta - più come il codice aggiuntivo per cercare di incoraggiare qualcuno a provare a fornire una risposta migliore.

Addendum: poiché AIC e BIC per i modelli con dimensione del campione fissa variano solo di una costante, la correlazione del BIC con i residui quadrati è la stessa della correazione dell'AIC con i residui quadrati, quindi l'approccio che ho adottato sopra sembra essere infruttuoso.


nota che questa sarà la tua risposta accettata per la generosità (nel caso in cui non scegli una risposta, la generosità seleziona automaticamente la risposta con il maggior numero di punti)
robin girard

1
bene - assegnare la grazia a me stesso sembra sciocco - ma nessun altro ha inviato una risposta.
Russellpierce,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.