R - стратифицированная выборка с большим набором данных

У меня большой набор данных, и у меня есть несколько групп, которые я хочу выбрать. В каждой группе есть определенное количество положительных случаев со значением 1 и намного больше отрицательных случаев со значением нуля.

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

Мне также нужно что-то, что быстро работает с большим количеством данных.

Полу-обновление:

stratified_sample = data %>%
    group_by(group) %>%
    mutate(n_pos = sum(response == 1),
           n_neg = 4 * n_pos) %>%
  group_by(group,response) %>%
  mutate(rec_num = n(),
         random_val = runif(n()),
         random_order = rank(random_val)) %>%
    filter(response == 1 | random_order <= n_neg)

person Nate Thompson    schedule 09.11.2017    source источник
comment
Включение минимального воспроизводимого примера в ваш вопрос увеличит ваши шансы получения ответа.   -  person Samuel    schedule 09.11.2017


Ответы (1)


Это должно сработать, если вы укажете правильные имена. Если у вас есть проблемы, приведите воспроизводимый пример.

library(dplyr)

stratified_sample = your_large_dataset %>%
    group_by(whatever_your_grouping_variable_is) %>%
    mutate(n_pos = sum(column_name_of_your_label == 1),
           n_neg = sum(column_name_of_your_label == 0),
           cutoff = 4 * n_pos / n_neg) %>%
    filter(column_name_of_your_label == 1 | runif(n()) < cutoff)

Это дает каждому отрицательному случаю вероятность выбора 4 * количество положительных случаев / количество отрицательных случаев, поэтому доля выборки не будет точной, но она имеет ожидаемое значение, которое вы хотите.

person Gregor Thomas    schedule 09.11.2017
comment
Вы меня очень близко подобрали, но с характером того, как вы делаете отсечки, иногда это дает ровно в 4 раза больше положительных значений, но иногда дает больше, в зависимости от того, как вытряхиваются случайные значения. Я опубликовал Semi: update с кодом, который должен работать. Идите вперед и измените свой ответ на этот или измените свой, чтобы получить кредит за ответ. - person Nate Thompson; 10.11.2017