2016-11-04 1 views
1

Ich versuche ein K-fache CV-Regressionsmodell mit K = 5 zu erstellen. Ich habe versucht, die "cv.glm" -Funktion des "Boot" -Pakets zu verwenden, aber mein PC hatte nicht genug Arbeitsspeicher, weil das Boot-Paket immer einen LOOCV MSE daneben berechnet. Also entschied ich, es manuell zu machen, aber ich lief auf das folgende Problem ein. Ich versuche, meinen Datenrahmen in 5 Vektoren gleicher Länge zu teilen, die eine Probe von 1/5 der Anzahl meiner df enthalten, aber ich bekomme unerklärliche Längen von der 3. Falte.Falten manuell für K-fache Kreuzvalidierung erstellen R

a <- sample((d<-1:1000), size = 100, replace = FALSE) 
b <- sample((d<-1:1000), size = 100, replace = FALSE) 
c <- sample((d<-1:1000), size = 100, replace = FALSE) 
df <- data.frame(a,b,c) 
head(df) 

# create first fold (correct: n=20) 
set.seed(5) 
K1row <- sample(x = nrow(df), size = (nrow(df)/5), replace = FALSE, prob = NULL) 
str(K1row) # int [1:20] 21 68 90 28 11 67 50 76 88 96 ... 

# create second fold (still going strong: n=20) 
set.seed(5) 
K2row <- sample(x = nrow(df[-K1row,]), size = ((nrow(df[-K1row,]))/4), replace = FALSE, prob = NULL) 
str(K2row) # int [1:20] 17 55 72 22 8 53 40 59 69 76 ... 

# create third fold (this is where it goes wrong: n=21) 
set.seed(5) 
K3row <- sample(x = nrow(df[-c(K1row,K2row),]), size = ((nrow(df[-c(K1row,K2row),]))/3), replace = FALSE, prob = NULL) 
str(K3row) # int [1:21] 13 44 57 18 7 42 31 47 54 60 ... 

# create fourth fold (and it gets worse: n=26) 
set.seed(5) 
K4row <- sample(x = nrow(df[-c(K1row,K2row,K3row),]), size = ((nrow(df[-c(K1row,K2row,K3row),]))/2), replace = FALSE, prob = NULL) 
str(K4row) # int [1:26] 11 35 46 14 6 33 25 37 43 5 ... 

Die Vektorlänge scheint von K = 3 zuzunehmen. Kann mir jemand erklären, was ich falsch mache ?! Mein Code (und Argumentation) scheint logisch, aber das Ergebnis sagt anders .. Mein Vielen Dank im Voraus!

+0

Es ist, weil K1row und K2row einige Elemente gemeinsam haben. Sie sind effektiv Proben mit Ersatz. – ddunn801

Antwort

1

Es ist, weil K1row und K2row einige Elemente gemeinsam haben. Sie sind effektiv Proben mit Ersatz. Die folgende Methode verwendet Modulo zum gleichmäßigen Aufteilen von Zeilen.

set.seed(5) 
rand <- sample(nrow(df)) 

K1row <- rand[rand %% 5 + 1 == 1] 
K2row <- rand[rand %% 5 + 1 == 2] 
K3row <- rand[rand %% 5 + 1 == 3] 
K4row <- rand[rand %% 5 + 1 == 4] 
K5row <- rand[rand %% 5 + 1 == 5] 
+0

Danke für deinen schnellen Kommentar ddunn801! Es funktioniert perfekt! Kannst du etwas mehr über das Modulo Splitting erklären? Ich bin damit nicht vertraut. Und wie ist das Ersatzteil entstanden? –

+1

Modulo gibt den Rest nach dem Teilen zurück. Bsp .: 17 modulo 5 bedeutet, 17 durch 5 zu teilen (was 3 ist, Rest 2) und 2 zurückgibt. Dies ist ein Weg, jede Menge in ungefähr gleiche Eimer zu teilen, weil der Modulo, den Sie verwenden (zB 5), wie viele Reste ist es gibt (0, 1, 2, 3, 4, wiederholen). Die ursprüngliche Methode weiß nicht, welche Zeilen früher ausgewählt wurden, sodass sie die gleiche Zeilennummer mehrmals auswählen kann. Die von Ihnen angeforderte Nicht-Ersetzung funktioniert von dieser einen Probe, aber nicht für jede Probe. Wenn Sie mit der Antwort zufrieden sind, klicken Sie auf das Häkchen, damit diese Frage als abgeschlossen markiert wird. – ddunn801

Verwandte Themen