2014-01-27 14 views
9

Ich versuche eine 10-fache Kreuzvalidierung für einige Glm-Modelle, die ich früher in R gebaut habe. Ich bin ein wenig verwirrt über die cv.glm() Funktion im boot Paket, obwohl Ich habe viele Hilfedateien gelesen. Wenn ich die folgende Formel liefern:Kreuzvalidierung für glm() Modelle

library(boot) 
cv.glm(data, glmfit, K=10) 

Ist das „Daten“ Argument verweist hier auf den gesamten Datensatz oder nur auf das Test-Set?

Die Beispiele, die ich bisher gesehen habe, liefern das "Daten" -Argument wie das Test-Set, aber das hat keinen Sinn ergeben, wie zum Beispiel warum 10-fach auf demselben Test-Set? Sie werden alle genau dasselbe Ergebnis liefern (ich nehme an!).

Leider ?cv.glm erklärt es in einem nebligen Weise:

Daten: eine Matrix oder ein Datenrahmen, der die Daten enthält. Die Zeilen sollten Fälle sein, und die Spalten entsprechen den Variablen, von denen die Antwort

Meine andere Frage über das $delta[1] Ergebnis sein würde. Ist dies der durchschnittliche Vorhersagefehler über die 10 Studien hinweg? Was, wenn ich den Fehler für jede Falte bekommen möchte?

Hier ist, was mein Skript wie folgt aussieht:

##data partitioning 
sub <- sample(nrow(data), floor(nrow(x) * 0.9)) 
training <- data[sub, ] 
testing <- data[-sub, ] 

##model building 
model <- glm(formula = groupcol ~ var1 + var2 + var3, 
     family = "binomial", data = training) 

##cross-validation 
cv.glm(testing, model, K=10) 
+0

Blick auf das Beispiel Abschnitt 'boot ::: cv. glm'. Sie sollten die gesamten Daten, das Modell und den Lebenslauf eingeben. –

+0

Vielen Dank für Ihre Antwort @ RomanLuštrik. Klingt gut. Ich wundere mich immer noch über ein paar Dinge. Verwendet diese Funktion alle gelieferten Daten in der Kreuzvalidierung? Angenommen, ich habe einen Datenrahmen von 1000 Zeilen für die 'cv.glm (Daten, Glm, K = 10) geliefert' 'macht es 10 Partionen der Daten, jede von einer 100 und machen die Kreuzvalidierung? Tut mir leid, dass ich durch den? Lebenslauf gegangen bin.Glm, aber ich habe das nicht gefunden. – Error404

+1

Wenn Sie einen 2-fachen CV erstellen würden, würde die Funktion 50% der Daten benötigen und zum Modell passen. Es würde die anderen 50% der Daten verwenden, um zu sehen, wie gut das Modell die Daten beschreibt. Oder, in Leave-One-out CV, würde es das Modell zu allen außer einem Datenpunkt passen und sehen, wie gut der ausgewählte "Punkt" getan hat. Wiederhole N mal und du bekommst dein Ergebnis. –

Antwort

11

Ich bin immer ein wenig vorsichtig über verschiedene Pakete 10-fache Kreuzvalidierung Verfahren. Ich mein eigenes einfaches Skript habe die Test- und Training Partitionen manuell für jedes Maschine Lernpaket zu erstellen:

#Randomly shuffle the data 
yourData<-yourData[sample(nrow(yourData)),] 

#Create 10 equally size folds 
folds <- cut(seq(1,nrow(yourData)),breaks=10,labels=FALSE) 

#Perform 10 fold cross validation 
for(i in 1:10){ 
    #Segement your data by fold using the which() function 
    testIndexes <- which(folds==i,arr.ind=TRUE) 
    testData <- yourData[testIndexes, ] 
    trainData <- yourData[-testIndexes, ] 
    #Use test and train data partitions however you desire... 
} 
+1

Danke Jake Drew. Zu Testzwecken habe ich Ihren obigen Code mit den Ergebnissen von cv.glm verglichen und die Ergebnisse sind identisch. Danke an deinen Beitrag, ich kann jetzt cv.glm vertrauen ;-) – citraL

+0

Ich bin froh zu helfen! –

5

@Roman lieferte einige Antworten in seinen Kommentaren, jedoch ist die Antwort auf Ihre Fragen zur Verfügung gestellt von dem Code Inspektion mit cv.glm:

ich glaube, dieses Stück Code, die Daten teilt zufällig in die K-Falten aufgebaut, die Anordnung als notwendig, wenn K n nicht teilt Runden:

if ((K > n) || (K <= 1)) 
    stop("'K' outside allowable range") 
K.o <- K 
K <- round(K) 
kvals <- unique(round(n/(1L:floor(n/2)))) 
temp <- abs(kvals - K) 
if (!any(temp == 0)) 
    K <- kvals[temp == min(temp)][1L] 
if (K != K.o) 
    warning(gettextf("'K' has been set to %f", K), domain = NA) 
f <- ceiling(n/K) 
s <- sample0(rep(1L:K, f), n) 

Dieses Bit zeigt hier, dass der Delta-Wert ist nicht die Wurzel mittlerer quadratischer Fehler. Es ist, wie die Hilfedatei sagt The default is the average squared error function. Was bedeutet das? Wir können sehen, durch die Funktionsdeklaration Inspektion:

function (data, glmfit, cost = function(y, yhat) mean((y - yhat)^2), 
    K = n) 

, die in jeder Falte zeigt, dass wir berechnen den Mittelwert des quadratischen Fehlers, wo Fehler im üblichen Sinne ist zwischen den vorhergesagten Antwort vs tatsächliche Antwort.

delta[1] ist einfach die weighted average der Summe aller dieser Bedingungen für jede Falte, siehe meine Inline-Kommentare im Code von cv.glm:

for (i in seq_len(ms)) { 
    j.out <- seq_len(n)[(s == i)] 
    j.in <- seq_len(n)[(s != i)] 
    Call$data <- data[j.in, , drop = FALSE] 
    d.glm <- eval.parent(Call) 
    p.alpha <- n.s[i]/n #create weighted average for later 
    cost.i <- cost(glm.y[j.out], predict(d.glm, data[j.out, 
     , drop = FALSE], type = "response")) 
    CV <- CV + p.alpha * cost.i # add weighted average error to running total 
    cost.0 <- cost.0 - p.alpha * cost(glm.y, predict(d.glm, 
     data, type = "response")) 
} 
Verwandte Themen