我想应用排斥采样方法来模拟来自单位圆盘Y=(Y_1, Y_2)
的均匀分布的随机矢量D = { (X_1 , X_2) \in R^2: \sqrt{x^2_1 + x^2_2} ≤ 1}
,以使X = (X_1 , X_ 2)
是正方形S = [−1, 1]^2
中的均匀分布的随机矢量。关节密度f(y_1,y_2) = \frac{1}{\pi} 1_{D(y_1,y_2)}.
[拒绝法中,如果f(x) \leq C * g(x)
,我们通常接受样本。我正在使用以下代码:
x=runif(100,-1,1)
y=runif(100,-1,1)
d=data.frame(x=x,y=y)
disc_sample=d[(d$x^2+d$y^2)<1,]
plot(disc_sample)
我有两个问题:
{使用上面的代码,从逻辑上讲,d
的大小应大于disc_sample
的大小,但是当我同时调用这两个代码时,我看到它们每个都有100个元素。这怎么可能。为什么尺寸相同。} 已解决此零件,感谢以下评论。
现在的问题
而且,如何重新编写代码以使我获得符合条件的100个样本所需的样本总数。即给我拒绝的样品数量,直到我得到100个所需的样品?
由于r2evans的答案,但我希望编写一些更简单的while循环,以将所有可能的样本存储在矩阵或数据帧(而不是列表)中,然后从该数据帧中调用,只要样本遵循条件。我从答案中修改了代码,没有使用列表,也没有sapply函数,但是没有给出所需的结果,它仅产生一行。
i=0
samps <- data.frame()
goods <- data.frame()
nr <- 0L
sampsize <- 100L
needs <- 100L
while (i < needs) {
samps <- data.frame(x = runif(1, -1, 1), y = runif(1, -1, 1))
goods <- samps[(samps$x^2+samps$y^2)<1, ]
i = i+1
}
而且我也想到了:
i=0
j=0
samps <- matrix()
goods <- matrix()
needs <- 100
while (j < needs) {
samps[i,1] <- runif(1, -1, 1)
samps[i,2] <- runif(1, -1, 1)
if (( (samps[i,1])**2+(samps[i,2])**2)<1){
goods[j,1] <- samps[i,1]
goods[j,2] <- samps[i,2]
}
else{
i = i+1
}
}
但是它不起作用。
我非常感谢您提供修改代码的帮助。
关于第二个问题...您无法重新编写代码以准确知道要(至少)获得100个结果组合需要多少个代码。您可以使用while
循环并连接结果,直到您至少有100个这样的行,然后截断超过100个的行。由于分段使用熵(按比例)是“昂贵的”,因此您可能希望始终高估行您需要立即抓住所有东西。
set.seed(42)
samps <- list()
goods <- list()
nr <- 0L
iter <- 0L
sampsize <- 100L
needs <- 100L
while (nr < needs && iter < 50) {
iter <- iter + 1L
samps[[iter]] <- data.frame(x = runif(sampsize, -1, 1), y = runif(sampsize, -1, 1))
rows <- with(samps[[iter]], (x^2 + y^2) > 1)
goods[[iter]] <- samps[[iter]][rows, ]
nr <- nr + sum(rows)
}
iter # number of times we looped
# [1] 5
sapply(samps, NROW) # number of rows per frame, should be 100 each
# [1] 100 100 100 100 100
sapply(goods, NROW) # number of rows accepted per frame, should sum to over 100
# [1] 21 25 22 14 25
out <- head(do.call(rbind, goods), n = 100)
NROW(out)
# [1] 100
head(out) ; tail(out)
# x y
# 2 0.8741508 -0.5656846
# 10 0.4101296 -0.9954541
# 13 0.8693445 0.5030451
# 17 0.9564529 -0.9972383
# 28 0.8114763 0.9251406
# 35 -0.9921033 0.7009655
# x y
# 40 -0.9928172 0.5841414
# 431 -0.8539232 -0.8551962
# 472 -0.4473347 -0.9861579
# 501 -0.6569173 -0.8598347
# 582 0.8647665 0.6048247
# 631 -0.4034622 -0.9457644