基于改进的伯努利分布的r-生成整数序列



我想使用R随机生成一个整数序列,每个整数都是从整数池(0,1,2,3….,k(中挑选出来的,并进行替换。k是预先确定的。(0,1,2,3….,k(中每个整数k的选择概率是pk(1-p(,其中p是预先确定的。也就是说,与k相比,1被选中的概率要高得多,我的最终整数序列可能比k有更多的1。我不知道如何在R中实现这个数字选择过程。

解决这类问题的通用方法是:

  1. 计算每个整数的p^k * (1-p)
  2. 在表t中创建这些值的累积和
  3. range(t)从均匀分布中画一个数
  4. 测量该数字落入t的距离,并检查对应的整数
  5. 整数的概率越大,它所覆盖的范围就越大

下面是快速而肮脏的示例代码:

draw <- function(n=1, k, p) {
v <- seq( 0, k )
pr <- (p ** v) * (1-p)
t <- cumsum(pr)
r <- range(t)
x <- runif( n, min=min(r), max=max(r) )
f <- findInterval( x, vec=t )
v[ f+1 ] ## first interval is 0, and it will likely never pass highest interval
}

请注意,所提出的解决方案并不关心密度函数加起来是否为1。根据你的描述,在现实生活中很可能会这样。但这对解决方案来说并不重要。

小天狼星的回答很好。但正如我所知,你所描述的是一个截断的几何分布。

我应该注意的是,几何分布在不同的作品中有不同的定义(例如,参见MathWorld(,所以我们使用如下定义的分布:

  • P(X=X(~p^x * (1 - p),其中X是[0,k]中的一个整数

我对R不是很熟悉,但解决方案涉及调用rgeom(1, 1 - p),直到结果为k或更低。

或者,您可以使用通用拒绝采样器,因为概率是已知的(这里更好地称为权重,因为它们不需要求和为1(。拒绝采样描述如下:

假设每个权重为0或更大。将权重存储在列表中。计算最高权重,称之为max。然后,使用拒绝采样在区间[0,k]中选择一个整数:

  1. 在区间[0,k]中选择一个均匀随机整数i
  2. 对于概率weights[i]/max(在您的情况下为weights[i] = p^i * (1-p)(,返回i。否则,请转至步骤1

给定每个项目的权重,除了拒绝抽样或Sirius答案中的解决方案之外,还有许多其他方法可以做出加权选择;请参阅我关于加权选择算法的注释。

最新更新