AIC ve BIC'in hangi çapraz-onaylama metotlarına eşdeğer olduğu R'de ampirik olarak nasıl gösterilebilir?


26

Bu sitenin başka bir yerindeki bir soruda , AIC'nin bir kez dışarıda bırakma (LOO) çapraz onaylamaya eşdeğer olduğunu ve BIC'nin K-kat çapraz onaylamaya eşdeğer olduğunu belirtti. Bunu R'de ampirik olarak göstermenin, LOO ve K-katlamada yer alan tekniklerin AIC ve BIC değerlerine eşdeğer olduğu açık bir şekilde gösterilebileceğini göstermenin bir yolu var mı? İyi yorumlanmış kod bu konuda yardımcı olacaktır. Ek olarak, BIC'in gösterilmesinde lme4 paketini kullanınız. Örnek veri seti için aşağıya bakın ...

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))

Önceki yorumlara göre, aşağıda AIC ve BIC’in aynı fikirde olmadığı, 1 ile 10000 arasında bir tohum listesi hazırladım. Bu, mevcut tohumlar üzerinden yapılan basit bir arama ile yapıldı, ancak eğer birisi bu iki bilgi kriterinden farklı cevaplar üretebilecek bir veri üretme yolu sağlayabilirse, özellikle bilgilendirici olabilir.

notable.seeds <- read.csv("http://student.ucr.edu/~rpier001/res.csv")$seed

Bunun yanında, AIC ve BIC’in AIC ve BIC’in mutlak farklılıklarının toplamı olarak ölçmeye çalıştığım AIC ve BIC’in kabul etmediği ölçüde bu tohumları sipariş etmeyi düşündüm. Örneğin,

AICDiff <- AIC(bad.model) - AIC(good.model) 
BICDiff <- BIC(logLik(bad.model)) - BIC(logLik(good.model))
disagreement <- sum(abs(c(AICDiff,BICDiff)))

Anlaşmazlık ölçümümün ancak gözlemler kayda değer olduğunda geçerli olduğu durumlarda. Örneğin,

are.diff <- sum(sign(c(AICDiff,BICDiff)))
notable <- ifelse(are.diff == 0 & AICDiff != 0,TRUE,FALSE)

Bununla birlikte, AIC ve BIC'in aynı fikirde olmadığı durumlarda, hesaplanan anlaşmazlık değeri her zaman aynıydı (ve örneklem büyüklüğünün bir işlevidir). AIC ve BIC'in nasıl hesaplandığına baktığımda, bunun neden hesaplamalı olabileceğini görebiliyorum, ancak bunun kavramsal olarak neden böyle olacağından emin değilim. Birisi bu konuyu da aydınlatabilirse, memnun olurum.


+1 Kodun yazılması kolay olurdu, yine de açıklayıcı, açıklayıcı bir veri seti görmekle çok ilgileniyorum.

Her şeyin net ve açıklayıcı bir veri kümesinde olması gerekenlerden emin değilim, ancak örnek bir veri kümesi eklemek için bir girişimde bulundum.
russellpierce

Bakın: sağladığınız şey işe yaramaz bir set örneği çünkü BIC ve AIC aynı sonuçları veriyor: AIC için 340 v. 342 ve BIC için 349 v. 353 - her iki durumda da kazanıyor. Bu yakınsama ile ilgili bütün fikir, belirli çapraz onaylamanın ilgili IC ile aynı modeli seçeceğidir.

Basit bir tarama yaptım ve örneğin tohum 76 için IC'ler aynı fikirde değil.

1
Vay, bu korkarım elde etmem daha zor olacak bir şey; Bütün tartışmamdaki genel noktam bu teoremlerin yakınsamasının çok zayıf olmasıdır, bu nedenle fark rastgele dalgalanmalardan ortaya çıkabilir. (Ve makine öğrenmesi için işe

Yanıtlar:


5

Kendi soruma kısmen cevap vermek için, Wikipedia’nın bir kez dışarıda bırakılma onayının açıklamasını okudum.

orijinal örnekden tek bir gözlemin doğrulama verisi olarak kullanılmasını ve geri kalan gözlemlerin eğitim verisi olarak kullanılmasını içerir. Bu, numunedeki her bir gözlemin doğrulama verisi olarak bir kez kullanıldığı şekilde tekrarlanır.

R kodunda bunun böyle bir şey ifade edeceğinden şüpheleniyorum ...

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
    }

... AIC ile ilgili olarak artıklarda değerler vermesi beklenir. Uygulamada, yukarıda açıklanan LOO döngüsünün her bir yinelemesinden alınan kare artıkların toplamı, notator tohumları için AIC'nin iyi bir tahmincisidir, r ^ 2 = .9776. Ancak, başka bir katılımcı, LOO’nun AIC’ye (en azından doğrusal modeller için) asimptotik olarak denk olması gerektiğini önerdi, bu yüzden r ^ 2’nin 1'e yakın olmamasından biraz hayal kırıklığına uğradım. Açıkçası bu gerçekten bir cevap değil. daha çok birisini daha iyi bir cevap vermeye çalışacak şekilde teşvik etmeye çalışmak için ek kod gibi.

Zeyilname: Sabit örneklem büyüklüğündeki modeller için AIC ve BIC sadece sabit bir değişkenlik gösterdiğinden, BIC'nin kare artıklarına korelasyonu, AIC'nin kare artıklarına doğru olmasıyla aynıdır;


bunun ödül için kabul edilen cevabınız olacağını unutmayın (bir cevap seçmemeniz durumunda, ödül otomatik olarak en çok puan alan cevabı seçin)
robin girard

1
iyi - ödülü kendime vermek saçma görünüyor - ama başka kimse cevap vermedi.
russellpierce
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.