我有一个矢量,我想要进行块重采样,比如1000个相同大小的矢量样本,然后将所有这些样本保存在列表中。
这是执行正常重新采样的代码,即每次随机绘制一个观察值,并将结果保存在列表中:
myvector <- c(1:200)
mylist <- list()
for(i in 1:1000){
mylist[[i]] <- sample(myvector, length(myvector), replace=TRUE)
}
我需要一个完全相同的代码,除了不是绘制单个观察,而是绘制观察块(让我们使用等于5的块)。
我知道有些软件包可以执行引导操作,但我不需要统计信息或置信区间或任何内容,只需要列表中的所有示例。重叠和非重叠块都可以,所以两个过程中只有一个的代码就足够了。当然,如果你非常友好地给我这些代码,我们对它表示赞赏。感谢任何可以帮助我的人。
答案 0 :(得分:2)
不确定您希望如何存储最终结构。
以下采用块尺寸,按块大小对矢量进行采样(例如,块大小为5的200个元素向量给出40个随机采样元素的观测值),并将这些块添加到最终列表的索引中。使用您的示例,最终结果是包含1000个条目的列表;每个条目包含40个随机抽样的观察。
myvector <- c(1:200)
rm(.Random.seed, envir=globalenv())
block_dimension <- 5
res = list()
for(i in 1:1000) {
name <- paste('sample_', i, sep='')
rep_num <- length(myvector) / block_dimension
all_blocks <- replicate(rep_num, sample(myvector, block_dimension))
tmp <- split(all_blocks, ceiling(seq_along(all_blocks)/block_dimension))
res[[name]] <- tmp
}
以下是第一个条目的前6个抽样观察结果:
答案 1 :(得分:2)
以下怎么样?请注意,您可以使用lapply
,这比在这种情况下填充for
循环中的列表要快一些。
作为参考,以下是对个别观察进行抽样的情况。
# Sample individual observations
set.seed(2017);
mylist <- lapply(1:1000, function(x) sample(myvector, length(myvector), replace = TRUE));
接下来,我们对5个观察结果进行抽样。
# Sample blocks of n observations
n <- 5;
set.seed(2017);
mylist <- lapply(1:1000, function(x) {
idx <- sample(1:(length(myvector) - n), length(myvector) / n, replace = TRUE);
idx <- c(t(sapply(0:(n - 1), function(i) idx + i)));
myvector[idx];
})
答案 2 :(得分:0)
假设块由myvector
的连续元素组成,一种解决方案是使用开始/结束列(例如blocks <- data.frame(start=seq(1,96,5),end=seq(5,100,5))
)预定义数据帧行中的块。从[1:块数]创建一组样本索引(带替换),并使用定义块中的开始/结束值连接从myvector
索引的值。如果需要,您也可以在块中添加随机化。这使您可以控制块内容,重叠,大小等。
答案 3 :(得分:0)
我找到了一种使用非重叠块执行任务的方法:
myvector <- c(1:200)
n <- 5
mymatrix <- matrix(myvector, nrow = length(myvector)/n, byrow = TRUE)
mylist <- list()
for(i in 1:1000){
mylist[[i]] <- as.vector(t(mymatrix[sample(nrow(mymatrix), size = length(myvector)/n, replace = TRUE),]))
}