рекурсивная выборка в r - PullRequest
4 голосов
/ 24 мая 2011

Я пытаюсь симулировать смерть в течение 7 лет с совокупной вероятностью следующим образом:

tab <- data.frame(id=1:1000,char=rnorm(1000,7,4))

cum.prob <- c(0.05,0.07,0.08,0.09,0.1,0.11,0.12)

Как я могу произвести выборку из tab$id без замены в векторизованном порядке в соответствии с кумулятивной вероятностью в cum.prob? Идентификаторы, выбранные из года 1, не обязательно могут быть снова выбраны через год. Следовательно, lapply(cum.prob,function(x) sample(tab$id,x*1000)) не будет работать. Можно ли векторизовать это?

// M

Ответы [ 2 ]

7 голосов
/ 25 мая 2011

Вот один из способов: сначала получить вероятность смерти данного человека в данный год как probYrDeath, т.е. probYrDeath[i] = Prob( individual dies in year i ), где i=1,2,...,7.

probYrDeath <- c(diff(c(0,cum.prob)).

Теперь сгенерируйте случайную выборку из 1000 "лет смерти" с заменой из последовательности 1: 8 в соответствии с вероятностями в probYrDeath, дополненными вероятностью не умереть к 7 году:

set.seed(1) ## for reproducibility
tab$DeathYr <- sample( 8, 1000, replace = TRUE, 
                       prob = c(probYrDeath, 1-sum(probYrDeath)))

Мы интерпретируем "DeathYr = 8" как "не умирающий в течение 7 лет" и извлекаем подмножество tab, где DeathYr != 8:

tab_sample <- subset(tab, DeathYr != 8 )

Вы можете проверить, что совокупные доли смертей в каждом году приближаются к значениям в cum.prob:

> cumsum(table(tab_sample$DeathYr)/1000)
    1     2     3     4     5     6     7 
0.045 0.071 0.080 0.094 0.105 0.115 0.124 
0 голосов
/ 24 мая 2011

Работает ли это для вас:

prob.death.per.year<-c(1-cum.prob[length(cum.prob)], cum.prob - c(0, cum.prob[-length(cum.prob)]))
dead.in.years<-as.vector(rmultinom(1, length(tab$id),prob.death.per.year))[-1]
totsamp<-sum(dead.in.years)
data.frame(id=sample(tab$id, totsamp), dead.after=rep(seq_along(dead.in.years), dead.in.years))

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

...