最近在这里与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的条件。
请不要犹豫要求澄清,因为我可能过于复杂了!谢谢!
答案 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