R如何从中断的倒置钟形曲线中采样

R How to sample from an interrupted upside down bell curve

我问过相关的,之前成功得到了答复。现在我想从倒置的钟形曲线中采样值,但排除落在它中间的一系列值,如下图所示:

我目前可以使用此代码:

min <- 1
max <- 20
q <- min + (max-min)*rbeta(10000, 0.5, 0.5)

我如何调整它才能获得所需的输出?

假设您想要从您的分布中获取 10,000 个样本,但不希望样本中有 5 到 15 之间的任何数字。为什么不这样做:

q <- min + (max-min)*rbeta(50000, 0.5, 0.5); 
q <- q[!(q > 5 & q < 15)][1:10000]

这给了你这个:

hist(q)

但尺寸仍然正确:

length(q)
#> [1] 10000

与正态分布相比的“颠倒钟形曲线”,排除了一定的间隔,可以使用以下算法进行采样。我用伪代码写的,因为我不熟悉 R。我从另一个 .

改编的

请注意,此采样器在截断间隔内采样(此处为间隔 [x0x1],不包括 [x2x3] ) 因为不可能将延伸到无穷大的倒钟形曲线积分为 1(这是对概率密度的要求之一)。

在伪代码中,RNDU01()是一个uniform(0, 1)随机数。

x0pdf = 1-exp(-(x0*x0))
x1pdf = 1-exp(-(x1*x1))
ymax = max(x0pdf, x1pdf)
while true
  # Choose a random x-coordinate
  x=RNDU01()*(x1-x0)+x0
  # Choose a random y-coordinate
  y=RNDU01()*ymax
  # Return x if y falls within PDF
  if (x<x2 or x>x3) and y < 1-exp(-(x*x)): return x
end