在R

时间:2019-04-25 16:43:16

标签: r montecarlo poisson stochastic-process

以下问题告诉我们根据ρ(到达时间)和τ(到达时间)逐步生成泊松过程。

  

讲座中提出的理论结果之一表明   以下直接方法模拟Poisson过程:

     

•令τ 0 =0。
  •生成i.i.d.指数随机变量ρ1,ρ2,。 。 ..
  •令τ n 1 +。 。 。 +ρ n ,其中n = 1、2,...。 。 。 。
  •对于每个k = 0、1,。 。 。,让   N t = k表示τ k ≤t <τ k + 1

     
      
  1. 使用此方法,生成间隔为[0,20]且λ= 0.5的泊松过程(N t t 的实现。
  2.   
  3. 生成10000个泊松过程(N t t 的λ= 0.5的实现,并使用您的结果来估计E(N t )和Var(N t )。比较估计   具有理论值。
  4.   

我尝试的解决方案:

首先,我使用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")

输出:

enter image description here

如您所见,泊松过程的图是空白而不是阶梯。

如果将rexp更改为exp,则会得到以下输出:

enter image description here

..这是一个阶梯函数,但是所有步骤都相等。

为什么我的源代码无法产生预期的输出?

2 个答案:

答案 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')

Sample Poisson process