我想使用R随机生成一个整数序列,每个整数都是从整数池(0,1,2,3….,k(中挑选出来的,并进行替换。k是预先确定的。(0,1,2,3….,k(中每个整数k的选择概率是pk(1-p(,其中p是预先确定的。也就是说,与k相比,1被选中的概率要高得多,我的最终整数序列可能比k有更多的1。我不知道如何在R中实现这个数字选择过程。
解决这类问题的通用方法是:
- 计算每个整数的
p^k * (1-p)
- 在表
t
中创建这些值的累积和 - 用
range(t)
从均匀分布中画一个数 - 测量该数字落入
t
的距离,并检查对应的整数 - 整数的概率越大,它所覆盖的范围就越大
下面是快速而肮脏的示例代码:
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
]中选择一个整数:
- 在区间[0,
k
]中选择一个均匀随机整数i
- 对于概率
weights[i]/max
(在您的情况下为weights[i] = p^i * (1-p)
(,返回i
。否则,请转至步骤1
给定每个项目的权重,除了拒绝抽样或Sirius答案中的解决方案之外,还有许多其他方法可以做出加权选择;请参阅我关于加权选择算法的注释。