一次解决每个问题:
你有一个i
不做任何事情的循环;它只是多次执行相同的计算,并且每次都会覆盖结果(具有相同的结果)。放下那个。
prob_cum <- function(prob_today) {
p_cum <- rep(0, 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
}
这还是有问题的。对于j=1
,您尝试访问p_cum[0]
哪个是零长度向量,并且您的计算假定一个长度向量。这就是您收到错误消息的原因
Error in p_cum[j] <- p_cum[j - 1] - ((1 - p_cum[j - 1]) * prob_today[j]) :
replacement has length zero
初始化p_cum[1]
然后循环其余部分。
prob_cum <- function(prob_today) {
p_cum <- rep(0, length(prob_today))
p_cum[1] <- prob_today[1]
for (j in 2:length(prob_today)) {
p_cum[j] <- p_cum[j-1] - ((1 - p_cum[j-1]) * prob_today[j])
}
p_cum
}
这种循环结构具有潜在危险。只要prob_today
长度至少为 2,它就可以工作,但如果长度为 1,它的行为会出乎意料。更好的是
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
}
现在我们遇到了一个真正的问题:你的算法是错误的。每天至少获得一场胜利j
的概率是每天至少获得一场胜利的概率加上在当时还没有j-1
获胜的情况下当天获得胜利的概率。j
你有一个减号。
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_cum(prob_daily)
[1] 0.500 0.750 0.875
> prob_cum(c(0.5, 0.01, 0.99))
[1] 0.50000 0.50500 0.99505
完全矢量化的解决方案来自不同地表达概率。至少获得一场胜利的概率是 1 减去到那天为止所有失败的概率。这些是独立的概率,所以只是每天亏损的产物。
prob_cum <- function(prob_today) {
1 - cumprod(1-prob_today)
}
给出相同的结果
> prob_cum(prob_daily)
[1] 0.500 0.750 0.875
> prob_cum(c(0.5, 0.01, 0.99))
[1] 0.50000 0.50500 0.99505
并适用于单个值和空向量,无需任何额外调整
> prob_cum(c(0.75))
[1] 0.75
> prob_cum(c())
numeric(0)