2017-02-01 5 views
1

Я хотел бы взять произвольный образец строк из data.frame, применить функцию к подмножеству, затем взять образец из оставшихся строк, применить функцию к новому подмножеству (с разными параметры) и т. д.Возьмите образец из уменьшающейся популяции

Простой пример если бы 5% от населения умирает каждый месяц, в месяце 2 мне нужно население минус тех из них, которые умерли во время месяца 1.

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

library(data.table) 
dt <- data.table(Number=1:100, ID=paste0("A", 1:100)) 


first<-dt[sample(nrow(dt), nrow(dt)*.05)]$ID 
mean(dt[ID %in% first]$Number) 


second<-dt[!(ID %in% first)][sample(nrow(dt[!(ID %in% first)]), 
           nrow(dt[!(ID %in% first)])*.05)]$ID 
mean(dt[ID %in% c(first,second)]$Number) 

dt[!(ID %in% first)][!(ID %in% second)] #... 

Очевидно, что это не является устойчивым мимо пару периодов. Каков лучший способ сделать это? Я предполагаю, что это стандартный метод, но не мог думать, что искать конкретно. Спасибо за любой вклад.

+0

Это было бы хорошо, но как я могу сгенерировать группы, описанные выше? То есть, случайное подмножество из исходной совокупности, затем другое случайное подмножество от населения минус подмножество1 и т. Д. – moman822

+3

Подумайте, какова ваша фактическая проблема. Вы действительно хотите имитировать (а) ровно 5% умирающего населения или (б) 5% -ный шанс каждого умирающего населения? В качестве альтернативы, вы хотите рассматривать каждого члена как дробную жизнь и переносить вероятность того, что каждый человек все еще жив? –

+0

Ну, на самом деле это не то, на что я смотрю, просто простой способ его создания. И в любом случае, разве мне не нужно все время удалять «мертвые» наблюдения из моего населения? Можете ли вы указать мне на что-то важное? – moman822

ответ

1

Это показывает, как «вырастить» вектор элементов, которые были отобраны образцы на 5% за каждый интервал времени курс:

removed <- numeric(0) 
for (i in 1:10){ 
    removed <- c(removed, sample((1:100)[!(1:100) %in% removed], # items out so far 
            (100-length(removed))*.05)) # 5% of remainder 
    cat(c(removed, "\n")) # print to console with each iteration. 
    } 
54 1 76 96 93 
54 1 76 96 93 81 16 13 79 
54 1 76 96 93 81 16 13 79 80 74 30 29 
54 1 76 96 93 81 16 13 79 80 74 30 29 52 33 86 19 
54 1 76 96 93 81 16 13 79 80 74 30 29 52 33 86 19 34 32 41 62 
54 1 76 96 93 81 16 13 79 80 74 30 29 52 33 86 19 34 32 41 62 5 70 8 
54 1 76 96 93 81 16 13 79 80 74 30 29 52 33 86 19 34 32 41 62 5 70 8 66 82 50 
54 1 76 96 93 81 16 13 79 80 74 30 29 52 33 86 19 34 32 41 62 5 70 8 66 82 50 6 91 99 
54 1 76 96 93 81 16 13 79 80 74 30 29 52 33 86 19 34 32 41 62 5 70 8 66 82 50 6 91 99 46 27 51 
54 1 76 96 93 81 16 13 79 80 74 30 29 52 33 86 19 34 32 41 62 5 70 8 66 82 50 6 91 99 46 27 51 22 23 20 

Обратите внимание, что фактическое количество элементов добавляется в список «абсорбция» будет уменьшаться.

+0

Это было очень полезно, спасибо. – moman822