In einer Frage an anderer Stelle auf dieser Website wurde in mehreren Antworten darauf hingewiesen, dass die AIC der LOO-Kreuzvalidierung und die BIC der K-fachen Kreuzvalidierung entspricht. Gibt es eine Möglichkeit, dies in R empirisch zu demonstrieren, sodass die mit LOO und K-fach verbundenen Techniken klargestellt werden und den AIC- und BIC-Werten entsprechen? Gut kommentierter Code wäre in dieser Hinsicht hilfreich. Verwenden Sie zur Demonstration des BIC außerdem das Paket lme4. Unten finden Sie einen Beispieldatensatz ...
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))
In früheren Kommentaren habe ich unten eine Liste von Samen von 1 bis 10000 angegeben, in denen AIC und BIC nicht übereinstimmen. Dies geschah durch eine einfache Suche in den verfügbaren Samen, aber wenn jemand eine Möglichkeit zur Generierung von Daten bieten könnte, die dazu neigen, unterschiedliche Antworten auf diese beiden Informationskriterien zu liefern, könnte dies besonders informativ sein.
notable.seeds <- read.csv("http://student.ucr.edu/~rpier001/res.csv")$seed
Nebenbei habe ich darüber nachgedacht, diese Samen nach dem Ausmaß zu ordnen, in dem AIC und BIC nicht übereinstimmen. Ich habe versucht, sie als Summe der absoluten Unterschiede zwischen AIC und BIC zu quantifizieren. Beispielsweise,
AICDiff <- AIC(bad.model) - AIC(good.model)
BICDiff <- BIC(logLik(bad.model)) - BIC(logLik(good.model))
disagreement <- sum(abs(c(AICDiff,BICDiff)))
wo meine Meinungsverschiedenheit nur dann angemessen ist, wenn die Beobachtungen bemerkenswert sind. Beispielsweise,
are.diff <- sum(sign(c(AICDiff,BICDiff)))
notable <- ifelse(are.diff == 0 & AICDiff != 0,TRUE,FALSE)
In Fällen, in denen AIC und BIC nicht übereinstimmten, war der berechnete Nichtübereinstimmungswert immer der gleiche (und ist eine Funktion der Stichprobengröße). Wenn ich zurückblicke, wie AIC und BIC berechnet werden, kann ich sehen, warum dies rechnerisch der Fall sein könnte, aber ich bin nicht sicher, warum dies konzeptionell der Fall wäre. Wenn jemand auch dieses Problem klären könnte, würde ich es begrüßen.