一度に各問題に取り組む:
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
}
これにはまだ問題があります。の場合、長さ 0 のベクトルj=1
にアクセスしようとするp_cum[0]
と、計算では長さ 1 のベクトルが想定されます。そのため、エラーメッセージが表示されます
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
}
このループ構造は潜在的に危険です。少なくとも長さが 2 である限り機能しprob_today
ますが、長さが 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
}
ここで、実際の問題に直面します。あなたのアルゴリズムは間違っています。1 日に少なくとも 1 勝するj
確率は、 1 日に少なくとも 1 勝する確率に、その時点まで勝利がなかったことを前提として、そのj-1
日に 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 勝する確率は、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)