感谢任何有助于提高此循环代码效率的帮助。遗憾!
我正在模拟“可变寿命调整显示”。有关此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)
如何将我的功能应用于此矩阵?谢谢!
答案 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)
}