当样本量大于总体大小时,如何在不放回的情况下重复抽样
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
这看起来一定是重复的,但我找不到解决方案,可能是因为我不知道要搜索什么。
假设我有一个装有 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