【问题标题】:How do I sample specific sizes within groups?如何对组内的特定尺寸进行抽样?
【发布时间】:2020-06-26 22:56:19
【问题描述】:

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

我的用例是我正在经历一个两阶段的样本设计。首先,对于我的人群中的每一组,我想确保 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,我认为这是对我的真实代码的整体重大改进。

【问题讨论】:

  • 我已经开始使用这些功能,但请注意这两个功能已被弃用,而是使用 slice_sample
  • 按“年龄”分组,然后按slice_sample?
  • 它不会降低样本,所以我从提供余数的计数中抽取了太多样本。 :( 这违反了“必须至少剩下这个数字”的要求。

标签: r dplyr sampling


【解决方案1】:

您尚未定义分组变量。

尝试以下方法:

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

或者,试试我的“splitstackshape”包中的stratified

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

【讨论】:

  • 我的真实数据出了点问题,因为这不是我得到的。例如,其中一个计数应该给我 6 个年龄,而它给了我 8 个。我将不得不把这个扔给我的主管。但是,您的建议适用于简单的情况,因此投票将其作为答案。谢谢!
  • @Michelle,好的。请注意,stratified 可以采用所需样本大小的命名向量。因此,例如,如果您想要分别来自 18、19、20 和 21 岁年龄组的 1、2、3 和 4 个样本,您可以将大小指定为 c("18" = 1, "19" = 3, "20" = 2, "21" = 4)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
  • 2013-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-06
  • 1970-01-01
相关资源
最近更新 更多