我如何在组内对特定尺寸进行抽样?
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 的总体样本量是正确的。
我如何强制将组内的样本量设置为我需要的大小?
数据框中还有其他变量,所以我需要从每个年龄组中随机抽样。
编辑:试图举个例子搞砸了。在我的真实数据中,我 am 在 dplyr
命令集中按年龄分组。但是 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
我有一个特定的使用问题。我想从组内抽样确切的尺寸。我应该使用什么方法根据组计数构建精确的子集?
我的用例是我正在进行两阶段样本设计。首先,对于我人口中的每个组,我想确保 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 的总体样本量是正确的。
我如何强制将组内的样本量设置为我需要的大小?
数据框中还有其他变量,所以我需要从每个年龄组中随机抽样。
编辑:试图举个例子搞砸了。在我的真实数据中,我 am 在 dplyr
命令集中按年龄分组。但是 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