模拟后两个向量的比较

问题描述 投票:4回答:1

我想应用排斥采样方法来模拟来自单位圆盘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
}
}

但是它不起作用。

我非常感谢您提供修改代码的帮助。

r simulation probability sampling
1个回答
0
投票

关于第二个问题...您无法重新编写代码以准确知道要(至少)获得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
© www.soinside.com 2019 - 2024. All rights reserved.