2017-11-18 166 views
0

我創建了以下用戶定義的函數,它使用Acceptance-Rejection方法生成隨機變量。然而,每當它被調用時,我的程序就會繼續,最終崩潰或者我不得不強制退出。我經歷了幾次。任何想法可能會導致這種情況?爲什麼這會導致我的程序崩潰?

我知道,這可能不是寫這個的最好方法(昨天是我第一次使用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])(數學),這意味着它總是範圍log(0)log(1)之間,相當於分別爲-Inf0。 (底線,它總是小於或等於零)。

現在讓我們看看您的條件:.5*(Y[1]-1)**2。如果知道域的Yc(-Inf,0),那麼該式的範圍

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

(這始終是大於或 - 等於-0.5。)

由於Y總是<= 0和公式總是>= 0.5,你的條件將在數學上永遠是真實的。無限循環。

相關問題