在 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,]))
基准测试,与原始方法相比,它似乎(大约)快了三分之一。我相信有更好的方法。
使用示例数据框 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,]))
基准测试,与原始方法相比,它似乎(大约)快了三分之一。我相信有更好的方法。