如何用数组重写这个并应用函数?

时间:2013-07-27 14:08:40

标签: r plyr apply

感谢任何有助于提高此循环代码效率的帮助。遗憾!

我正在模拟“可变寿命调整显示”。有关此here的详细信息。

当应用于手术时,这是一个图表,作为预期死亡人数减去实际死亡人数(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附近振荡。如果死亡率高于预期(更多1),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制作可爱的情节。我想改变这两个for循环来应用函数,但无法弄清楚如何。要开始,可能更容易制作尺寸为n x m的结果矩阵:

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

如何将我的功能应用于此矩阵?谢谢!

1 个答案:

答案 0 :(得分:3)

以下解决方案逐行应用计算。您仍然需要一个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)
}