Случайная выборка с разными стратами - PullRequest
0 голосов
/ 14 января 2019

У меня есть набор данных, из которого я хочу выбрать случайную выборку строк, но следуя некоторым предопределенным правилам. Это может быть очень простой вопрос, но я новичок в этом и все еще пытаюсь понять основные понятия. Мой набор данных содержит около 330 строк данных (я включил здесь упрощенную версию) с несколькими столбцами. Я хочу сэмплировать 50 строк из 330 (для простоты я сохранил эти числа в фиктивном наборе данных, так как это является частью моей проблемы) с возможностью добавления предопределенных правил в процесс выборки. Вот фиктивная версия данных:

bank<-data.frame(matrix(0,nrow=330,ncol=5))
colnames(bank)<-c("id","var1","var2","year","lo")
bank$id<-c(1:330)
bank$var1<-sample(letters[1:5],330,replace=T)
bank$var2<-sample(c("s","r"),330,replace=T)
bank$var3<-sample(2010:2018,330,replace=T)
bank$lo<-sample(c("lo1","lo2","lo3","lo4","lo5","lo6"),330,replace=T)

Код, который я использовал для выборки правильного количества строк:

library(splitstackshape)
x<-splitstackshape::stratified(indt=bank,group=c("var1","var2","year","lo"),0.151)

Однако это не выбор 50 строк. Первоначально я пытался определить размер = 50, но я получил следующую ошибку:

Groups b s 2012 lo4,... [there is a very long list here],...contain fewer rows than requested. Returning all rows.

Затем я попытался определить размер в процентах: 0,151 (15,1%?), Который должен быть правильным 50 из 330, но это выборка 5 строк (я пробовал 0,5 и 44 строки, и если я пытаюсь 0,500000001, то выборка 287 строк? ??).

Что мне не хватает? На данный момент я застрял здесь.

Как только мне удастся выбрать правильное количество строк (50), я бы хотел определить некоторые правила, например: только до 50% выборки может иметь 2018 (банк $ год) И только до половины банка $ год == строки 2018 могут иметь банк $ var2 == "r". Очевидно, я не ожидаю, что кто-то сделает это для меня, но не могли бы вы дать несколько советов по

1- Почему я получаю неправильное количество строк (возможно, только синтаксис?) 2- какой пакет мне следует изучить, если splitstackshape :: straified () не является лучшим или хорошим выбором для достижения этой цели?

Большое спасибо! M

Ответы [ 2 ]

0 голосов
/ 14 января 2019

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

bank %>% 
  group_by(var1) %>% 
  nest() %>% 
  mutate(n = c(7,0,9,1,13),
         samp = map2(data, n, sample_n)) %>% 
  select(var1, samp) %>% 
  unnest()
0 голосов
/ 14 января 2019

Я думаю, что проблема связана с тем, что ваш набор данных (как вы поделились здесь) довольно мал, у вас есть большое количество страт (5 букв X 2 s или r X 9 лет X 6 lo категорий), и просто невозможно взять образцы нужного размера из каждой страты. Когда я увеличиваю размер выборки до 33000 и беру 15,1%, я получаю образец размером 4,994. Если задать размер = 50, то будет запрашиваться выборка размером 50 из каждого слоя, что невозможно удаленно с данными, которыми вы поделились.

> bank<-data.frame(matrix(0,nrow=33000,ncol=5))
> colnames(bank)<-c("id","var1","var2","year","lo")
> bank$id<-c(1:33000)
> bank$var1<-sample(letters[1:5],33000,replace=T)
> bank$var2<-sample(c("s","r"),33000,replace=T)
> bank$var3<-sample(2010:2018,33000,replace=T)
> bank$lo<-sample(c("lo1","lo2","lo3","lo4","lo5","lo6"),330,replace=T)
> 
> k <- stratified(bank, group = c('var1', 'var2', 'var3', 'lo'), size = .151)
> dim(k)
[1] 4994    6
...