2017-11-18 5 views
0

受理拒否メソッドを使用してランダム変数を生成する次のユーザー定義関数を作成しました。しかし、呼び出されるたびに私のプログラムが実行され、最終的にクラッシュするか、強制終了する必要があります。私はそれを何度か経験しました。これを引き起こしている可能性のあるものは何ですか?なぜこのプログラムがクラッシュするのですか?

これは、これを書いた最良の方法ではないかもしれないことを知っています(昨日はRを初めて使用しました)ので、追加のヒントはボーナスです!

acceptReject <- function(){ 
    Z <- 0 
    Y <- c(0,0) 
    while(Y[2] < .5*(Y[1]-1)**2){ 
    U <- runif(2,0,1) 
    Y <- log(U) 
    } 
    Z <- Y[1] 
    U <- runif(1,0,1) 
    if(U <= .5){ 
    Z <- abs(Z) 
    } 
    else{ 
    Z <- -abs(Z) 
    } 
    Z 
} 

答えて

1

あなたには無限ループがあります。

あなたはY ~ log([0,1])(数学)と仮定した場合、それはそれは常に、それぞれ、-Inf0に等しくする、log(0)log(1)の間の範囲にあることを意味します。 (ボトムライン、それは常にゼロ以下です。)

ここであなたの条件を見てみましょう:.5*(Y[1]-1)**2。もしドメインを知っていればYは、この式の範囲(これは常により-大きいかまたは等しく、0.5である。)次に、c(-Inf,0)

.5*(c(-Inf,0)-1)**2 
# [1] Inf 0.5 

あるYので

常に<= 0であり、数式は常に>= 0.5です。条件は数学的に常に真です。無限ループ。

関連する問題