在R中使用具有条件参数的复制函数

时间:2017-11-22 23:17:36

标签: r

最近在这里与R初学者。我正在尝试使用源自U(0,1)的两个随机数创建多个随机变量Z,并且当Z具有条件参数时,我在使用复制函数时遇到问题。

以下是我的工作内容:

生成两个随机数U 1 和U 2 设置以下内容:

V 1 = 2U 1 - 1

V 2 = 2U 2 -1

S =(V 1 2 )+(V 2 2

这一部分很简单,但让我感到震惊的是这部分:

如果S> 1,则重新开始,否则

Z 1 = sqrt(( - 2 * ln(S))/(S))* V 1

Z 2 = sqrt(( - 2 * ln [S])/(S))* V 2

我要复制那些500x。我在过去,我没有像上面的S> 1这样的条件,只会使用replicate(n, function(Z)),但现在我不确定如何包含S< 1的条件。

请不要犹豫要求澄清,因为我可能过于复杂了!谢谢!

1 个答案:

答案 0 :(得分:0)

你可以写一个这样的函数:

f <- function(N, mult=2) {

    S <- NULL
    while (length(S) < N) { 
        mult <- mult * 2
        nm <- N * mult
        V1= 2 * runif(nm) - 1
        V2= 2 * runif(nm) -1
        S = V1^2 + V2^2
        i <- S > 1
        S <- S[i]
    }
    cat("mult is", mult, "\n")
    V1 <- V1[i][1:N]
    V2 <- V2[i][1:N]
    S <- S[1:N] 

    # note that I added the abs to avoid taking the sqrt of a negative number
    # you probably have a better way to avoid that
    Z1= sqrt(abs((-2*log(S))/(S))) *V1
    Z2= sqrt(abs((-2*log(S))/(S))) *V2
    cbind(Z1, Z2)
}

 set.seed(0)
 result <- f(500)
# mult is 4 
head(result)
#              Z1         Z2
#[1,]  0.84399240 -0.2401726
#[2,] -0.38290136  0.6071211
#[3,] -0.09405977  0.3436486
#[4,]  0.20980731  1.0566666
#[5,]  0.86480486 -0.1319527
#[6,] -0.54518219 -0.5629898