r - 如何对组内的特定尺寸进行抽样?
问题描述
我有一个特定的使用问题。我想从组内抽取确切的尺寸。我应该使用什么方法来构建基于组数的精确子集?
我的用例是我正在经历一个两阶段的样本设计。首先,对于我的人群中的每一组,我想确保 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
我认为是对我的真实代码的整体重大改进。
解决方案
您尚未定义分组变量。
尝试以下操作:
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
推荐阅读
- python - 结合序列化器和模型函数
- c# - 在 ASP.Net Core 2.2 中运行存储过程
- r - 如何在将平滑数据值分配到新数据框中的同时平滑数据?
- angular6 - 为什么Angular ReactiveForms FormArray会抛出错误“TypeError:无法读取null的属性'updateOn'”
- python - 试图制作/转换一个简单的温度平均功能
- salesforce - 在 SLDS 中,为什么闪电数据表的状态栏覆盖了日期编辑面板?
- linux - 在“menuconfig”中找不到“系统类型”
- fuzzing - BooFuzz UnicodeDecodeError
- python - 加速多线程下载
- python - Matplotlib 添加默认水印