我如何在组内对特定尺寸进行抽样?

How do I sample specific sizes within groups?

我有一个特定的使用问题。我想从组内抽样确切的尺寸。我应该使用什么方法根据组计数构建精确的子集?

我的用例是我正在进行两阶段样本设计。首先,对于我人口中的每个组,我想确保 60% 的受试者 不会 被选中。所以我试图构建一个抽样数据框,排除每组 60% 的可用主题。此外,这是一个函数,其中用户指定不得使用的受试者的最小比例,因此 1- 结构中用户指示每组中至少 60% 的受试者不能被选择用于抽样。

在这段代码之后,我将完全随机抽样,以获得我的最终样本。

代码示例:

testing <- data.frame(ID = c(seq_len(50)), Age = c(rep(18, 10), rep(19, 9), rep(20,15), rep(21,16)))

testing <- testing %>%
slice_sample(ID, prop=1-.6)

如你所见,分组的数字不是我想要的。我应该只有4个18岁的科目,3个19岁的科目,6个20岁的科目,6个21岁的科目。在没有固定种子的情况下,我最终得到的数字是 6 个 18 岁、1 个 19 岁、6 个 20 岁和 7 个 21 岁。

但是,20 的总体样本量是正确的。

我如何强制将组内的样本量设置为我需要的大小?

数据框中还有其他变量,所以我需要从每个年龄组中随机抽样。

编辑:试图举个例子搞砸了。在我的真实数据中,我 amdplyr 命令集中按年龄分组。但是 group-by([Age variable)slice_sample() 之前或在 slice_sample() 内进行分组都不起作用。在我的真实数据中,我既没有得到正确的年龄样本集,也没有得到正确的总体样本量。

我正在使用 semi_join 将年龄限制为在进行比例测试后剩余的总年龄。对于无法抽取样本的那些年龄段,semi_join 用于在进行比例抽样之前从人口中删除这些年龄段。不知道是不是semi_join的问题。

就是说,提供并接受的答案让我不再依赖 semi_join,我认为这是对我的实际代码的整体重大改进。

您还没有定义分组变量。

尝试以下操作:

set.seed(1)
x <- testing %>% group_by(Age) %>% slice_sample(prop = .4)
x %>% count()
# # A tibble: 4 x 2
# # Groups:   Age [4]
#     Age     n
#   <dbl> <int>
# 1    18     4
# 2    19     3
# 3    20     6
# 4    21     6

或者,尝试 stratified 来自我的“splitstackshape”包:

library(splitstackshape)
set.seed(1)
y <- stratified(testing, "Age", .4)
y[, .N, Age]
#    Age N
# 1:  18 4
# 2:  19 4
# 3:  20 6
# 4:  21 6