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.
quelle
Antworten:
In dem Versuch, meine eigene Frage teilweise zu beantworten, las ich die Beschreibung der einmaligen Kreuzvalidierung in Wikipedia
Im R-Code vermute ich, dass das so etwas bedeuten würde ...
... soll Werte in Rückständen ergeben, die mit dem AIC zusammenhängen. In der Praxis ist die Summe der quadrierten Residuen aus jeder Iteration der LOO-Schleife, die oben beschrieben wurde, ein guter Prädiktor für den AIC für die notable.seeds, r ^ 2 = .9776. Aber an anderer Stelle schlug ein Mitwirkender vor, dass LOO asymptotisch der AIC entsprechen sollte (zumindest für lineare Modelle), daher bin ich ein wenig enttäuscht, dass r ^ 2 nicht näher bei 1 liegt. Offensichtlich ist dies keine wirkliche Antwort. eher wie zusätzlicher Code, um jemanden zu ermutigen, eine bessere Antwort zu geben.
Nachtrag: Da AIC und BIC für Modelle mit fester Stichprobengröße nur um eine Konstante variieren, ist die Korrelation von BIC zu quadratischen Residuen dieselbe wie die Korrelation von AIC zu quadratischen Residuen, so dass der Ansatz, den ich oben gewählt habe, erfolglos erscheint.
quelle