我被要求实施一种算法,使用指数分布模拟从泊松(λ)分布进行模拟。
我得到以下密度:
对于k = 1,2,...,P(X = k)= P(X1 +···+Xk≤1 我编写了代码来模拟指数分布,但不知道如何模拟泊松。有人可以帮我这个吗?万分感谢。 我的代码:n<-c(1:k)
u<-runif(k)
x<--log(1-u)/lambda
答案 0 :(得分:3)
我正在假设你(或你的导师)想要从最初的原则做到这一点,而不仅仅是调用内置泊松发生器。该算法非常简单。您可以计算使用指定的比率生成的指数,直到它们的总和超过1。
我的R生锈了,无论如何这听起来像是一个家庭作业,所以我会把它表达为伪代码:
count <- 0
sum <- 0
repeat {
generate x ~ exp(lambda)
sum <- sum + x
if sum > 1
break
else
count <- count + 1
}
来自循环count
之后的break
的值是此试验的泊松结果。如果将其作为函数包装,则从循环返回count
而不是break
。
您可以通过几种方式在计算上进行改进。第一个是注意到用于生成指数的1-U
项具有均匀分布,并且可以仅由U
替换。通过将评估写为最大i
s.t,可以获得更显着的改进。 SUM(-log(Ui) / rate) <= 1
,SUM(log(Ui)) >= -rate
。
现在取消双方的指数并简化以获得
PRODUCT(Ui) >= Exp(-rate).
这方面的右侧是不变的,可以预先计算,从k+1
对数评估和添加到一个取幂和k+1
乘法减少工作量:
count <- 0
product <- 1
threshold = Exp(-lambda)
repeat {
generate u ~ Uniform(0,1)
product <- product * u
if product < threshold
break
else
count <- count + 1
}
假设你对两个实现进行U
1-U
替换,它们在代数上是相等的,并且对于给定的U
集合,将在浮点算术的精度范围内产生相同的答案的。
答案 1 :(得分:2)
根据上述建议,您可以使用rpois
生成泊松变量。但是,我对这个问题的理解是你希望从最初的原则而不是使用内置函数这样做。为此,您需要使用Poisson到达的属性,表明到达间隔时间是指数分布的。因此,我们按如下方式进行:
步骤1:从指数分布生成(大)样本并创建累积和的向量。该向量的第k个条目是到第k个泊松到达的等待时间
第2步:衡量我们在单位时间间隔内看到的到达次数
Step3:多次重复步骤1和2并将结果收集到矢量中
这将是来自Poisson分布的样本,其中包含正确的速率参数。
代码:
lambda=20 # for example
out=sapply(1:100000, function(i){
u<-runif(100)
x<--log(1-u)/lambda
y=cumsum(x)
length(which(y<=1))
})
然后你可以通过Kolmogorov-Smirnov测试测试有效性和内置函数:
ks.test(out, rpois(100000, lambda))