当样本量大于总体大小时,如何在不放回的情况下重复抽样

How to repeatedly sample without replacement when sample size is greater than the population size

这看起来一定是重复的,但我找不到解决方案,可能是因为我不知道要搜索什么。

假设我有一个装有 8 个编号弹珠的桶,10 个人将从桶中每人抽取 1 个弹珠。

如何编写一个抽样程序,每个人从桶中取出一颗弹珠而不放回,直到桶变空,此时所有弹珠都放回桶中,并继续抽样而不放回?这种采样有名称吗?

例如,我们的 10 个人和一桶 8 颗弹珠的这次抽样的假设结果是:

   person marble
1       1      1
2       2      2
3       3      3
4       4      4
5       5      5
6       6      6
7       7      7
8       8      8
9       9      1
10     10      2

请注意,弹珠是随机抽取的,因此不一定按数字顺序排列。这只是一个示例输出,用于说明我的观点。

不确定是否有此名称,但一个简单的解决方案是多次使用 sample

# Create a bucket with 8 marbles:
bucket <- 1:8

# First draw 8 marbles without replacement, then refill the bucket at draw 2 more:
marbles <- c(sample(bucket, 8, replace = FALSE), sample(bucket, 2, replace = FALSE))
marbles

您可以在 for 循环中动态使用 sample 来生成列表。

弹珠1:8及n人以上

示例:

bucket <- 1:8

n <- 100

marbleList <- c()

for(i in 1:ceiling(n / length(bucket))){
    
    marbleList <- c(marbleList, sample(bucket))
    
}

marbleList <- marbleList[1:n]

基于 MånsT 的回答,这里有一个以编程方式执行此操作的函数。我添加了一些功能来顺利处理样本数量小于总体规模(并且 return 预期行为)的情况。

sample_more <- function(pop, n, seed = NULL) {
  set.seed(seed) # For reproducibility, if desired. Defaults to NULL, which is no seed
  m <- length(pop)
  if(n <= m) {  # handles case when n is smaller than the population size 
    sample(pop, n, replace = FALSE) 
  } else { # handle case when n is greater than population size
    c(sample(pop, m, replace = FALSE), sample(pop, n-m, replace = FALSE))
  }
}

marbles <- 1:8
sample_more(marbles, 10, seed = 1)
[1] 1 4 8 2 6 3 7 5 2 3
sample_more(marbles, 3, seed = 1)
[1] 1 4 8