仿真后两个向量的比较

索菲·艾伦(Sophie Allan)

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

但它不起作用。

对于修改代码的任何帮助,我将不胜感激。

r2evans

关于第二个问题……您无法重新编写代码以准确知道要(至少)获得100个结果组合需要多少个代码。您可以使用while循环并连接结果,直到至少有100个这样的行,然后截断超过100个的行。由于分段(按比例)使用熵是“昂贵的”,因此您可能希望始终高估所需的行,并且一次抓住所有。

(根据家庭作业的限制进行编辑以减少“复杂性”。)

set.seed(42)
samps <- vector(mode = "list")
goods <- vector(mode = "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 <- (samps[[iter]]$x^2 + samps[[iter]]$y^2) < 1
  goods[[iter]] <- samps[[iter]][rows, ]
  nr <- nr + sum(rows)
}
iter                # number of times we looped
# [1] 2
out <- head(do.call(rbind, goods), n = 100)
NROW(out)
# [1] 100
head(out) ; tail(out)
#            x          y
# 1  0.8296121  0.2524907
# 3 -0.4277209 -0.5668654
# 4  0.6608953 -0.2221099
# 5  0.2834910  0.8849114
# 6  0.0381919  0.9252160
# 7  0.4731766  0.4797106
#               x          y
# 221 -0.65673577 -0.2124462
# 231  0.08606199 -0.7161822
# 251 -0.37263236  0.1296444
# 271 -0.38589120 -0.2831997
# 28  -0.62909284  0.6840144
# 301 -0.50865171  0.5014720

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章