2016-11-04 110 views
1

我正在嘗試使用K = 5來製作K倍CV迴歸模型。我嘗試使用「boot」包cv.glm函數,但是由於引導包總是在它旁邊計算一個LOOCV MSE,所以我的內存耗盡了內存。所以我決定手動做,但我遇到了以下問題。我嘗試將我的數據框分成5個長度相等的矢量,其中包含我的df的1/5的rownumbers樣本,但是我從第3個摺疊中得到無法解釋的長度。手動創建摺疊以進行K倍交叉驗證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 ... 

向量長度似乎從K = 3增加。任何人都可以向我解釋我做錯了什麼?!我的代碼(和推理)似乎是合乎邏輯的,但結果表示否則..我很多先謝謝了!

+0

這是因爲K1row和K2row有一些共同的元素。您正在進行有效的取樣。 – ddunn801

回答

1

這是因爲K1row和K2row有一些共同的元素。您正在進行有效的取樣。下面的方法使用模數來均勻分割行。

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

感謝您的快速評論ddunn801!它完美的工作!你能否更詳細地解釋模分裂?我對此並不熟悉。那麼如何創建更換部件? –

+1

Modulo在分割後返回餘數。例如:17模5意味着將17除以5(即3,餘數2)並返回2.這是一種將任意數量分成大致相等桶的方法,因爲您使用的模(比如5)是剩餘多少有(0,1,2,3,4,重複)。您的原始方法不知道先前選擇了哪些行,因此恰好多次選擇相同的行號。您請求的非替換工作來自該樣本,但不是每個樣本。如果您對答案感到滿意,請點擊選中標記,以便將此問題標記爲已完成。 – ddunn801