首页 > 解决方案 > 如何对组内的特定尺寸进行抽样?

问题描述

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

我的用例是我正在经历一个两阶段的样本设计。首先,对于我的人群中的每一组,我想确保 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 是正确的。

我如何强制组内的样本量成为我需要的?

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

编辑:搞砸了试图举个例子。在我的真实数据中,我命令集中按年龄分组dplyr。但既没有group-by([Age variable)提前也没有slice_sample()做内部slice_sample()工作的分组。在我的真实数据中,我既没有得到按年龄划分的正确样本集,也没有得到正确的总体样本量。

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

也就是说,提供和接受的答案使我不再依赖于semi_join我认为是对我的真实代码的整体重大改进。

标签: rdplyrsampling

解决方案


您尚未定义分组变量。

尝试以下操作:

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

推荐阅读