Есть ли способ указать общий размер выборки при использовании стратифицированной выборки в R? - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть набор данных, который представляет 50 000 симуляций. Каждое моделирование имеет несколько идентификаторов сценария, и с каждым идентификатором сценария связан второй идентификатор, называемый целью. Первые четыре симуляции могут выглядеть следующим образом:

+----------------------------------------------+
| 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 симуляций в набор из 10000 симуляций, сохраняя при этом наилучшее возможное представление набора 50000 в отношении частоты каждый сценарий / целевая комбинация.

Я пытался использовать стратифицированную выборку с использованием стратифицированной функции в пакете splitstackshape и установки идентификатора сценария и идентификатора цели в качестве группы. Однако я могу указать только размер выборки для каждой группы.

Я могу играть с долей, отобранной из каждой группы, пока она не приблизится к 10000 симуляций, но это не идеально, так как мне нужно, чтобы это было как можно более автоматизировано.

1 Ответ

0 голосов
/ 13 марта 2020

Если еще не слишком поздно, я могу предложить следующее решение.

Сначала , загрузите библиотеку и сгенерируйте набор данных (конечно, в вашем случае нет необходимости генерировать набор данных ):

    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, чтобы сохранить представление каждой комбинации сценария ios и целей.

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
...