在 R 中引导 - 每个样本包含多行

Bootstrapping in R - each sample comprising of multiple rows

使用示例数据框 pay,我 bootstrapping 使用基本 R。与经典 bootstrapping 的主要区别在于样本可以有多个行,这些行必须全部是包括。

pay 中有 7 个 ID,因此我的目标是创建一个长度为 7 的样本并进行替换,并创建一个包含样本 ID 的新数据集 resample

我的代码目前可以工作,但由于我的数据中有 100 万行并且 bootstrap 需要多次重复,因此效率低下。

正在创建 pay

ID    <- c(1,1,1,2,3,3,4,4,4,4)
level <-  c(1:10)
pay <- data.frame(ID = ID,level =  level)

我创建单个重采样数据集的(低效)代码:

IDs <- levels(as.factor(ID))
samp <- sample(IDs, length(IDs) , replace = TRUE)
resample <- numeric(0)

for (i in 1:length(IDs))        
    {
temp <-  pay[pay$ID == samp[i], ]
resample <- rbind(resample, temp) 
    }

结果:

 samp
[1] "1" "2" "3" "1"


 resample
  ID level
1  1   0.5
2  1  -2.0
3  1   3.0
4  2   4.0
5  3   5.0
6  3   6.0
7  1   0.5
8  1  -2.0
9  1   3.0

我认为最慢的部分是每次迭代都扩展 resample。但是,我不知道最后会有多少行。非常感谢你的帮助。

您可以通过执行以下操作对行进行采样

pay[sample(seq_len(nrow(pay)), replace=TRUE),]

看起来还算高效

> system.time({
+   for (i in 1:10000)
+     pay[sample(seq_len(nrow(pay)), replace=TRUE),]
+ })
   user  system elapsed
  0.469   0.002   0.473

编辑:

根据下面 Dudelstein 的评论,以上内容不正确。这是解决我认为您所要求的方法。

samp <- sample(unique(ID), replace=TRUE)
do.call(rbind, lapply(samp, function(x) pay[pay$ID == x,]))

基准测试,与原始方法相比,它似乎(大约)快了三分之一。我相信有更好的方法。