r - 在 R 中使用分层抽样时,有没有办法以总体样本量为目标?
问题描述
我有一个代表 50,000 个模拟的数据集。每个模拟都有多个场景 ID,并且与每个场景 ID 相关联的是称为目标的第二个标识符。前四个模拟可能如下所示:
+----------------------------------------------+
| SIMULATION |SCENARIO ID |TARGET ID |
| | | |
+----------------------------------------------+
| | | |
| 1 | 12 | 11 |
| 1 | 10 | 2 |
| 1 | 1 | 18 |
| 2 | 3 | 9 |
| 2 | 7 | 10 |
| 2 | 21 | 2 |
| 3 | 17 | 15 |
| 3 | 12 | 9 |
| 4 | 7 | 16 |
+---------------+--------------+---------------+
我想将这 50,000 个模拟集抽样成 10,000 个模拟集,同时在每个场景/目标组合的频率方面保留 50,000 个集的最佳表示。
我尝试使用 splitstackshape 包中的分层函数使用分层抽样,并将场景 ID 和目标 ID 设置为一个组。但是我只能指定每组的样本量。
我可以使用从每个组中采样的比例,直到它接近 10,000 次模拟,但这并不理想,因为我需要尽可能自动化。
解决方案
如果还不算太晚,我可能会提出以下解决方案。
首先,加载库并生成数据集(当然在你的情况下不需要生成数据集):
library(data.table)
# Generate dataset ...
df = data.table(Simulation = sample(1:4, 60, replace = TRUE),
Scenario.ID = sample(1:5, 60, replace = TRUE),
Target.ID = sample(1:2, 60, replace = TRUE))
# ... and sort it
df = df[order(Simulation, Scenario.ID, Target.ID)]
其次,定义递减比例。在此示例中,我使用 n = 3,在您的情况下,它将是 n = 5 或任何其他适合目标的数字。
n = 3
第三,定义从场景和目标的每个组合中提取的行数。我四舍五入;它们必须是整数。如果四舍五入的数字为零,则取 1 作为样本,以保持场景和目标的每个组合的表示。
group.sample = df[, .N, by = .(Scenario.ID, Target.ID)][, pmax(round(N/n), 1)]
group.sample
[1] 1 2 2 2 2 2 3 2 3 1
第四,标记要纳入样本的记录(感谢这个答案)。我使用 set.seed 使示例可重现。选择是随机的。
set.seed(1)
df[, Sample := 1:.N %in% sample(.N, min(.N, group.sample[.GRP])), by = .(Scenario.ID, Target.ID)]
head(df[order(Simulation, Scenario.ID, Target.ID)])
Simulation Scenario.ID Target.ID Sample
1: 1 1 1 FALSE
2: 1 1 1 TRUE
3: 1 1 2 FALSE
4: 1 2 1 FALSE
5: 1 2 2 FALSE
6: 1 3 1 FALSE
第五,将场景和目标组合的原始比例与抽样比例进行比较。逗号后的比例四舍五入为两位数。
df[, .(Original = round(.N/ nrow(df), 2),
Sampled = round(length(Sample[Sample == TRUE])/df[Sample == TRUE, .N], 2)),
by = .(Scenario.ID, Target.ID)]
Scenario.ID Target.ID Original Sampled
1: 1 1 0.07 0.05
2: 1 2 0.10 0.10
3: 2 1 0.10 0.10
4: 2 2 0.08 0.10
5: 3 1 0.12 0.10
6: 4 1 0.08 0.10
7: 4 2 0.15 0.15
8: 5 1 0.08 0.10
9: 3 2 0.17 0.15
10: 5 2 0.05 0.05
推荐阅读
- python - 当我的循环范围相同时,为什么我的子 for 循环与主循环的值不同?
- python - 输入行号和列号,输出一串行和列
- ontology - Protege - OWL/XML 语法 - 为什么“内置数据类型”范围为红色(不可选择)?
- php - WebSocket 错误:net::ERR_SSL_PROTOCOL_ERROR
- javascript - 使用 node.js 和 express 到 API 的正确 URL 路径是什么?
- c# - 如何从 Bot Framework Emulator 中的用户回复的句子中获取特定单词或字符串?
- html - IE 11 相关问题 - 背景图像不显示
- ajax - Ajax 在 wordpress 的响应数据中返回 '0,die() 不起作用
- javascript - 如何将 HTTP 发布响应发送到重定向的网页
- angular - angular-7-interceptor-retry-requests-after-token-refresh