仿真后两个向量的比较

Comparison of two vectors resulted after simulation

我想应用拒绝采样方法从单位圆盘 D = { (X_1 , X_2) \in R^2: \sqrt{x^2_1 + x^2_2} ≤ 1} 中模拟一个均匀分布的随机向量 Y=(Y_1, Y_2),这样 X = (X_1 , X_ 2) 是一个均匀分布的随机向量正方形分布 S = [−1, 1]^2 和联合密度 f(y_1,y_2) = \frac{1}{\pi} 1_{D(y_1,y_2)}.

在rejection方法中,我们一般接受一个sample if 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 行的行。因为分段(按比例)使用熵是 "expensive",您可能更愿意总是结束- 估计您需要的行并一次抓取所有行。

(根据作业限制进行了编辑以减少 "complexity"。)

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