首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中使用分层抽样时,有没有一种方法来确定总体样本量?

在R中使用分层抽样时,有没有一种方法来确定总体样本量?
EN

Stack Overflow用户
提问于 2020-02-19 22:56:21
回答 1查看 89关注 0票数 0

我有一个代表50,000个模拟的数据集。每个模拟具有多个场景id,并且与每个场景id相关联的是称为目标的第二标识符。前四个模拟可能如下所示:

代码语言:javascript
复制
+----------------------------------------------+
| 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个集的最佳表示。

我尝试过使用分层采样,使用拆分堆栈形状包中的分层函数,并将场景id和目标id设置为一个组。但是,我只能指定每组的样本大小。

我可以使用从每个组中采样的比例,直到它接近10,000个模拟,但这并不理想,因为我需要尽可能地自动化。

EN

回答 1

Stack Overflow用户

发布于 2020-03-13 18:51:07

如果还不算太晚,我可能会提出以下解决方案。

First,加载库并生成dataset (当然在您的案例中不需要生成dataset ):

代码语言:javascript
复制
    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或任何其他符合目标的数字。

代码语言:javascript
复制
n = 3

对于第三个,定义要从方案和目标的每个组合中获取的行数。I舍入数字;它们必须是整数。如果四舍五入的数字为零,则取1作为样本,以保持场景和目标的每个组合的表示。

代码语言:javascript
复制
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

Fourth,标记要纳入样本的记录(感谢this answer)。我使用set.seed使示例可重现。选择是随机的。

代码语言:javascript
复制
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

with ,将场景和目标组合的原始比例与采样比例进行比较。比例四舍五入为逗号后的两位数。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60303117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档