1

この愚かなコードの効率を改善するための助けに感謝します。ごめん!

「可変寿命調整表示」をシミュレートしています。詳細については、こちらをご覧ください。

手術に適用すると、これは予想される死亡数から実際の死亡数を差し引いた累計として機能するグラフです (e)。外科手術で、p=0.1 の母集団全体で予想される死亡確率があるとします。手術ユニットのパフォーマンスは、0 と 1 のベクトル (r_(1:n)) と見なすことができます。ここで、0 は成功、1 は死亡です。開始時 (r_0)、e_0 = 0。患者が生存した場合、p が実行中のスコアに追加されます。患者が死亡した場合、実行中のスコアから 1-p が差し引かれます (たとえば、r_1=0 の場合、e_1 = e_0 + p; r_1=1 の場合、e_1 = e_0 - (1-p) の場合)。

(おそらく!) わかるように、特定の一連の結果の全体的な死亡確率が母集団の死亡確率と等しい場合、ランニング スコア (e) は 0 付近で振動するはずです。死亡率が予想よりも高い場合 (より多くの1s)、e の傾向は負です。結果が予想よりも優れている (0 が多い) 場合、傾向は正です。

# Simulate VLAD
# m=number of simulations, n=number of procedures, p1=expected mortality
#    p2=actual mortality

vlad_sim <- function(m,n,p1,p2){
  e<-matrix(nrow=n, ncol=m)
  e[1,]<-0
  r<-vector()
  for (j in 1:m){
    r<-rbinom(n,1, p2)
    for (i in 2:n){
      e[i, j] <- ifelse(r[i]==0, e[i-1,j] + p1, e[i-1,j] - (1-p1))
    }
  }
return(e)
}

# Test example using m=100, n=100, p1=0.1, p2=0.2
e <- vlad_sim(100, 100, 0.1, 0.2)

このコードは機能し、私が望むことを行います。ggplot2 で素敵なプロットを作成できます。これらの 2 つの for ループを変更して関数を適用したいのですが、どうすればよいかわかりません。まず、次元 nxm の結果の行列を作成する方が簡単かもしれません:

r<-matrix(rep(rbinom(n,1, p2),m), nrow=n, ncol=m)

次に、関数をこのマトリックスに適用するにはどうすればよいですか? ありがとうございました!

4

1 に答える 1

3

次のソリューションは、計算を行ごとに適用します。1 つのステージでの計算は前のステージの結果に基づいているため、1 つの for ループが必要になります。さらに、コードはより効率的になりました。

vlad_sim <- function(m, n, p1, p2){
  e <- matrix(0, nrow = n, ncol = m)
  r <- matrix(sample(c(FALSE, TRUE), size = (n - 1) * m, 
                     replace = TRUE, prob = c(1 - p2, p2)), ncol = m)
  for (i in seq(2L, n)) {
    e[i, ] <- e[i - 1, ] + p1 - r[i - 1, ]
  }   
  return(e)
}
于 2013-07-27T15:59:46.170 に答える