2016-11-04 83 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