非均匀泊松过程的慢代码

时间:2016-03-23 16:57:08

标签: r poisson

我试图从具有强度函数(lambda_time)的非均匀泊松过程中生成时间如下 -

     lambda_time<-function(k,p,a,t){
          k*(p-1)*(a^(p-1))*((t+a)^(-p))
          } 

。我在间隔(0,Tmax)之间产生“n”次的代码如下 -

   Inhomogeneous<- function(lambda_time,n,k,p,a,tmax,lambdamax=NA){
      if(is.na(lambdamax)){
        lambdamax<-  max(sapply(seq(0,tmax,length.out=2000),lambda_time,k=k,p=p,a=a))
      }
     t<-0
     count<-1
     times<-numeric()
     times[1]<-t
     while(times[length(times)]<tmax && count<=n){
         e<-rexp(1,lambdamax)
         t<-t+e
         v<-runif(1)
         if(t<tmax && v<=(lambda_time(k,p,a,t)/lambdamax)){
            times<-c(times,t)
            count<-count+1
        }
    }
   return(times[-1])

}

。但代码很慢。我不懂为什么?有人能告诉我吗? k,p,a的值将类似于1.8,1.9,0.6或类似的东西。

1 个答案:

答案 0 :(得分:0)

当变量被矢量化时,R运行得最好。您的编程风格让人联想到C和Fortran等低级和汇编语言,其中矢量化不会显着提高速度。

您可以采取一些措施来减少代码中的函数调用和声明量。

  1. 使用带循环语句的for循环和控制流。

    for(i in 1:n){

    ###在这里做数学

    if(times [length(times)]&lt; tmax)      破

    }

  2. 预先声明向量并让R按索引访问它们(即使您不使用您生成的每个随机数)

    v&lt; - runif(n = n)

    t&lt; - rep(NA,n)

    等...

    for(i in 1:n){

    ###在这里做数学

    ### v v v [i]

    if(times [length(times)]&lt; tmax)      破

    }