R - 阻止重新采样并将样本保存在列表中

时间:2018-01-16 23:06:35

标签: r resampling

我有一个矢量,我想要进行块重采样,比如1000个相同大小的矢量样本,然后将所有这些样本保存在列表中。

这是执行正常重新采样的代码,即每次随机绘制一个观察值,并将结果保存在列表中:

myvector <- c(1:200)
mylist <- list()
for(i in 1:1000){
  mylist[[i]] <- sample(myvector, length(myvector), replace=TRUE)
}

我需要一个完全相同的代码,除了不是绘制单个观察,而是绘制观察块(让我们使用等于5的块)。

我知道有些软件包可以执行引导操作,但我不需要统计信息或置信区间或任何内容,只需要列表中的所有示例。重叠和非重叠块都可以,所以两个过程中只有一个的代码就足够了。当然,如果你非常友好地给我这些代码,我们对它表示赞赏。感谢任何可以帮助我的人。

4 个答案:

答案 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个抽样观察结果:

enter image description here

答案 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),]))
}