通过计算R中每个试验概率的累积概率来学习使用循环

Gra*_*Guy 0 loops r probability

我一直在努力寻找答案.我保证我会尝试从解决方案中学习.为了学习,我想了解如何使用显式循环,但如果你想分享矢量化方法作为奖励,也非常感谢.

假设我每天都要玩一次游戏,我知道每天获胜的可能性.我想要一个函数,它接受概率向量并至少在一天内返回累积成功概率.因此,如果我连续玩了3天并且胜利的概率是每天0.5,那么我的函数应该返回"0.875,0.75,0.5"

这是我最近尝试编写此函数的失败:

prob_cum <- function(prob_today) {
  p_cum <- rep(0, length(prob_today))
  for (i in 1:length(prob_today)) {
    for (j in i:length(prob_today)) {
      p_cum[j] <- p_cum[j-1] - ((1 - p_cum[j-1]) * prob_today[j])
    }
  }
  p_cum
}

prob_daily <- c(.5,.5,.5)
prob_cum(prob_daily)
Run Code Online (Sandbox Code Playgroud)

42-*_*42- 5

>  1 - cumprod( 1- c(0.5,0.5,0.5) )
[1] 0.500 0.750 0.875
 # (1- prob_success) is the prob_non_success vector
Run Code Online (Sandbox Code Playgroud)

如果需要,可轻松包装成功能.你的初步测试不是很好,因为它没有透露我在cumprod参数中从1减去成功向量的原始错误.

 vec<-runif(100)
 prob_cum <- function(prob_today) {
   p_cum <- rep(0, length(prob_today))
   p_cum[1] <- prob_today[1]
   for (j in seq_along(prob_today)[-1]) {
     p_cum[j] <- p_cum[j-1] + ((1 - p_cum[j-1]) * prob_today[j])
   }
   p_cum
 }
 Prob_vec <- function(vec) 1 - cumprod( 1- vec) 
 require(rbenchmark)
 benchmark( prob_cum(vec) , Prob_vec(vec) ,replications=1000)
#           test replications elapsed relative user.self sys.self user.child sys.child
#1 prob_cum(vec)         1000   0.538   59.778     0.532    0.008          0         0
#2 Prob_vec(vec)         1000   0.009    1.000     0.008    0.002          0         0
Run Code Online (Sandbox Code Playgroud)