4

次の累積確率で 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 年目にサンプリングされた ID は、必ずしも 2 年目に再びサンプリングされるとは限りません。したがって、は機能しlapply(cum.prob,function(x) sample(tab$id,x*1000))ません。これをベクトル化することは可能ですか?

//M

4

2 に答える 2

7

1 つの方法を次に示します。まず、特定の個人が特定の年に死亡する確率をprobYrDeath、つまりprobYrDeath[i] = Prob( individual dies in year i )として取得しi=1,2,...,7ます。

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

ここで、 の確率に従って、1:8 のシーケンスから 1000 の「死亡年」のランダム サンプルを置換して生成しますprobYrDeath

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

"'DeathYr = 8'" を "7 年以内に死亡しない" と解釈し、tabwhereのサブセットを抽出し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 
于 2011-05-24T20:21:17.737 に答える
0

これはあなたのために働きますか?

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

結果を表示するフォームに応じて、最後のステップを変更できます。

于 2011-05-24T19:27:14.357 に答える