以下问题告诉我们根据ρ(到达时间)和τ(到达时间)逐步生成泊松过程。
讲座中提出的理论结果之一表明 以下直接方法模拟Poisson过程:
•令τ 0 =0。
•生成i.i.d.指数随机变量ρ1,ρ2,。 。 ..
•令τ n =ρ 1 +。 。 。 +ρ n ,其中n = 1、2,...。 。 。 。
•对于每个k = 0、1,。 。 。,让 N t = k表示τ k ≤t <τ k + 1 。
- 使用此方法,生成间隔为[0,20]且λ= 0.5的泊松过程(N t ) t 的实现。
- 生成10000个泊松过程(N t ) t 的λ= 0.5的实现,并使用您的结果来估计E(N t )和Var(N t )。比较估计 具有理论值。
我尝试的解决方案:
首先,我使用R中的rexp()
函数生成了ρ的值。
rhos <-function(lambda, max1)
{
vec <- vector()
for (i in 1:max1)
{
vec[i] <- rexp(0.5)
}
return (vec)
}
然后,我通过逐步累加ρ s来创建τ s。
taos <- function(lambda, max)
{
rho_vec <- rhos(lambda, max)
#print(rho_vec)
vec <- vector()
vec[1] <- 0
sum <- 0
for(i in 2:max)
{
sum <- sum + rho_vec[i]
vec[i] <- sum
}
return (vec)
}
以下函数用于在给出 k 的值时查找 N t = k 的值。假设是 7 等。
Ntk <- function(lambda, max, k)
{
tao_vec <- taos(lambda, max)
val <- max(tao_vec[tao_vec < k])
}
y <- taos(0.5, 20)
x <- seq(0, 20-1, by=1)
plot(x,y, type="s")
输出:
如您所见,泊松过程的图是空白而不是阶梯。
如果将rexp
更改为exp
,则会得到以下输出:
..这是一个阶梯函数,但是所有步骤都相等。
为什么我的源代码无法产生预期的输出?
答案 0 :(得分:1)
您似乎正在使用max1来指示对rhos
函数中的指数分布进行采样的次数。我会推荐这样的东西:
rhosGen <- function(lambda, maxTime){
rhos <- NULL
i <- 1
while(sum(rhos) < maxTime){
samp <- rexp(n = 1, rate = lambda)
rhos[i] <- samp
i <- i+1
}
return(head(rhos, -1))
}
这将从指数继续进行采样,直到这些保持时间的总和大于给定间隔的长度。 head
会删除最后一个样本,因此我们跟踪的所有事件肯定会在我们感兴趣的时间间隔内发生。
在这里,您必须通过汇总先前的保持时间(rhos)来生成道:
taosGen <- function(lambda, maxTime){
rhos <- rhosGen(lambda, maxTime)
taos <- NULL
cumSum <- 0
for(i in 1:length(rhos)){
taos[i] <- sum(rhos[1:i])
}
return(taos)
}
现在,您知道了我们知道的时间间隔(0,maxTime)中的每个事件在什么时间发生。这导致我们通过在时间间隔内找到每个t的Nt值来生成相关的泊松过程:
ppGen <- function(lambda, maxTime){
taos <- taosGen(lambda, maxTime)
pp <- NULL
for(i in 1:maxTime){
pp[i] <- sum(taos <= i)
}
return(pp)
}
这将在间隔中的每个整数时间生成泊松过程的值。我怀疑您的问题的一部分是试图将tao值放在y轴上,而不是已经发生的事件计数。以下代码对我有用,以产生一个外观随机的楼梯案例,类似于您的示例。
y <- ppGen(0.5, 20)
x <- seq(0, 20-1, by=1)
plot(x,y, type="s")
答案 1 :(得分:1)
这是另一个可能的实现。这个想法是生成一个等待时间(tau)的向量,并将其与我们正在等待的事件列表(max1)相对应
poi.process <- function(lambda,n){
# initialize vector of total wait time for the arrival of each event:
s<-numeric(n+1)
# set S_0 = 0
s[1] <-0
# generate vector of iid Exp random variables:
x <-replicate(n,rexp(1,lambda))
# assign wait time to vector s in for loop:
for (k in 1:n){
s[k+1] <-sum(x[1:k])
}
# return vector of wait time
return(s)
}
使用stepfun
进行绘制将为我们提供以下信息:
n<-20
lambda <-3
# simulate list of wait time:
s_list <-poi.process(lambda,n)
# plot function:
plot(stepfun(0:(n-1), s_list),
do.points = TRUE,
pch = 16,
col.points = "red",
verticals = FALSE,
main = 'Realization of a Poisson process with lambda = 3',
xlab = 'Time of arrival',
ylab = 'Number of arrivals')