2017-07-03 12 views
1

私はこの再帰的プログラムをコード化するのに苦労しています。私はそれをRでのマニュアルの道を行ってきたが、関数に入れたい再帰的ループfor R

for k=1,2,... 

beta(k)=k-sum_(i=0)^(k-1)Kchoosei*beta(i)*exp(-i(k-i)) 

私はこの再帰方程式をコーディングします。

beta0<-0 

beta1<-1-choose(1,0)*beta0*exp(-0*lambdaL*(1-0)) 
beta2<-2-choose(2,0)*beta0*exp(-0*lambdaL*(2-0))-choose(2,1)*beta1*exp(-1*lambdaL*(2-1)) 
beta3<-3-choose(3,0)*beta0*exp(-0*lambdaL*(3-0))-choose(3,1)*beta1*exp(-1*lambdaL*(3-1))-choose(3,2)*beta2*exp(-2*lambdaL*(3-2)) 
beta4<-4-choose(4,0)*beta0*exp(-0*lambdaL*(4-0))-choose(4,1)*beta1*exp(-1*lambdaL*(4-1))-choose(4,2)*beta2*exp(-2*lambdaL*(4-2))-choose(4,3)*beta3*exp(-3*lambdaL*(4-3)) 
+0

lambdaLは、あなたの中で定義されていないされていません一般式 –

答えて

1

合計の2番目のループを定義することができます。ここでのインデックス付けは、0ではなく、1で始まり、「インデックスシフト」につながることに注意してください。

beta = numeric() 
beta[1] <- 0 

for (k in 1:10){ 
    beta[k+1] <- k 
    for (i in 0:(k-1)) 
    beta[k+1] <- beta[k+1] - choose(k, i)*beta[i+1]*exp(-i*(k-i)) 
} 

beta 
# [1] 0.000000 1.000000 1.264241 2.080705 3.247551 4.528104 5.748673 
# [8] 6.876234 7.941197 8.972749 9.987645 
0

私はあなたが入力として、ベータ版のすべての以前の値を必要とし、まだあなただけの1つの出力を必要とするので、あなたは、2つの機能が必要だと思います。ここでは(あなたのlambaLを調整するために、いくつかのあいまいさがあなたの記事でありますように、それはLambdaL == 1で動作します)私が提案しているものです:(コードのタイプミスのために編集)

beta_vec <- function(k){ 
    if(k == 0) 0 else { 
    beta_vec_old <- beta_vec(k-1) 
    c(beta_vec_old,sum(sapply(0:(k-1),function(i){1-choose(k,i)*beta_vec_old[i+1]*exp(-i*(k-i))}))) 
}} 

beta <- function(k){ 
    tail(beta_vec(k),1) 
} 

# > beta_vec(5) 
# [1] 0.000000 1.000000 1.264241 2.080705 3.247551 4.528104 
# > beta(5) 
# [1] 4.528104