Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中使用分层抽样时,是否有办法确定总体样本量?_R_Downsampling - Fatal编程技术网

在R中使用分层抽样时,是否有办法确定总体样本量?

在R中使用分层抽样时,是否有办法确定总体样本量?,r,downsampling,R,Downsampling,我有一个代表50000个模拟的数据集。每个模拟都有多个场景id,与每个场景id关联的是称为目标的第二个标识符。前四个模拟可能如下所示: +----------------------------------------------+ | SIMULATION |SCENARIO ID |TARGET ID | | | | | +----------------------------------

我有一个代表50000个模拟的数据集。每个模拟都有多个场景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            |
+---------------+--------------+---------------+

我想将这50000个模拟集采样为10000个模拟集,同时在每个场景/目标组合的频率方面保留50000个模拟集的最佳表示

我尝试过使用splitstackshape包中的分层函数进行分层抽样,并将场景id和目标id设置为一个组。但是,我只能指定每组的样本量


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

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

首先加载库并生成数据集(当然,在您的情况下不需要生成数据集):

,定义递减比率。在这个例子中,我使用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

在“每个场景/目标组合的频率”下,您的意思是什么?这是否意味着,例如,场景ID=12和目标ID=11(第一行)可能会在模拟=5中重复,从而使该组合的频率超过1?是的,正是这样。
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