R中的泊松过程算法(更新过程透视图)

时间:2019-04-19 22:23:31

标签: r loops simulation stochastic

我有以下MATLAB代码,正在努力将其翻译为R:

nproc=40
T=3
lambda=4
tarr = zeros(1, nproc);
i = 1;
while (min(tarr(i,:))<= T)
tarr = [tarr; tarr(i, :)-log(rand(1, nproc))/lambda];
i = i+1;
end
tarr2=tarr';
X=min(tarr2);
stairs(X, 0:size(tarr, 1)-1);

从更新过程的角度来看,这是泊松过程。我在R中已经尽力了,但是我的代码出了点问题:

nproc<-40
T<-3
lambda<-4
i<-1
tarr=array(0,nproc)
lst<-vector('list', 1)
while(min(tarr[i]<=T)){
tarr<-tarr[i]-log((runif(nproc))/lambda)
i=i+1
print(tarr)
}
tarr2=tarr^-1
X=min(tarr2)
plot(X, type="s")

该循环将打印出一系列的数组,并且最后一个数组由其后的tarr保存。

结果必须看起来像...

enter image description here

先谢谢您。所有有趣和支持性的评论都会得到奖励。

3 个答案:

答案 0 :(得分:2)

在前面的注释上,matlab脚本中发生了一些R中没有的事情:

    根据我的理解,
  • [tarr; tarr(i, :)-log(rand(1, nproc))/lambda];是在矩阵中添加另一行,并用tarr(i, :)-log(rand(1, nproc))/lambda]填充它。 您将需要使用其他方法,因为Matlab和R对这种类型的事物的处理方式不同。
  • 对我而言,一件明显的事情是,您似乎在R: tarr[i]M: tarr(i, :)相等的情况下使用它们,因为我认为您要实现的全部是给定行i中的列,因此在R中看起来像tarr[i, ]
  • 现在min的使用也有所不同,因为R: min()将返回矩阵的最小值(仅一个数字),而M: min()将返回每一列的最小值。因此,在R中,您可以使用Rfast软件包Rfast::colMins
  • stairs部分是我不太熟悉的部分,但类似ggplot2::qplot(..., geom = "step")的部分可能有用。

现在我已经尝试创建在R中可用的东西,但不确定是否真正需要输出。但是,尽管如此,希望一些基础知识可以帮助您将它做好。下面是快速尝试实现目标的方法!

nproc <- 40
T0 <- 3
lambda <- 4
i <- 1

tarr <- matrix(rep(0, nproc), nrow = 1, ncol = nproc)

while(min(tarr[i, ]) <= T0){
# Major alteration, create a temporary row from previous row in tarr
  temp <- matrix(tarr[i, ] - log((runif(nproc))/lambda), nrow = 1)
# Join temp row to tarr matrix
  tarr <- rbind(tarr, temp)
  i = i + 1
}
# I am not sure what was meant by tarr' in the matlab script I took it as inverse of tarr
# which in matlab is tarr.^(-1)??
tarr2 = tarr^(-1)

library(ggplot2)
library(Rfast)
min_for_each_col <- colMins(tarr2, value = TRUE)
qplot(seq_along(min_for_each_col), sort(min_for_each_col), geom="step")

如您所见,我对min_for_each_col进行了排序,因此该图实际上是一个阶梯图,而不是一些随机的逐步图。我认为这是一个问题,因为从Matlab代码0:size(tarr2, 1)-1得到的行数少了1,但我想不出为什么如果要获取colMins(并且有40列),我们将创建约20个步骤。但是我可能完全是误会!另外,我将T更改为T0,因为在R T中以TRUE的形式存在并且不好覆盖!

希望这会有所帮助!

答案 1 :(得分:1)

我对续订流程或Matlab不太熟悉,所以如果我误解了您的代码意图,请多多包涵。也就是说,让我们逐步分解R代码,看看发生了什么。

  • 前4行将数字分配给变量。
  • 第五行创建一个包含40个(nproc)零的数组。
  • 第六行(以后似乎不再使用)创建一个模式为“ list”的空向量。
  • 第七行开始while循环。我怀疑这行应该说,而tarr的最小值小于或等于T ... 或者我在小于或等于T时说 实际上,它采用单个布尔值(tarr[i] <= T)的最小值。现在这可以工作,因为将TRUE和FALSE视为数字。即:
  

TRUE == 1#返回TRUE

     

FALSE == 0#返回TRUE

     

TRUE == 0#返回FALSE

     

FALSE == 1#返回FALSE

但是,由于tarr [i]的值取决于随机数(请参见第8行),因此这可能导致同一代码在每次执行时都以不同的方式运行。这可能可以解释为什么代码“打印出大量的数组”。

  • 第八行似乎用右边的计算覆盖了tarr的分配。因此,它采用tarr [i]的单个值,并从中减去runif(proc)的自然对数除以4(λ),得到40个不同的值。从上次循环开始以来的这40个不同值存储在tarr中。 如果您希望每次循环都存储所有40个值,则建议将其存储在矩阵或数据帧中。如果您要这样做,下面是将其存储在矩阵中的示例:
for(i in 1:nrow(yourMatrix)){
//computations
yourMatrix[i,] <- rowCreatedByComputations
}

有关更多信息,请参见this答案。另外,由于每次运行的值都是固定数量的,因此您可以将它们保存在向量中,然后像下面这样简单地将每个循环附加到向量上:

vector <- c(vector,newvector)
  • 第9行将i加1。
  • 第十行打印出tarr。
  • 第11行关闭循环语句。

  • 然后在循环tarr2之后分配1 / tarr。同样,这是从上次循环(第8行)开始的40个值

  • 然后为X分配tarr2的最小值。

  • 此单个值绘制在最后一行。

还要注意,runif是从均匀分布中取样的-如果您要寻找泊松分布,请参见:Poisson

希望这对您有所帮助!让我知道我还有什么可以做的。

答案 2 :(得分:1)

我今天下载了GNU Octave,以实际运行MatLab代码。看完运行的代码后,我花了几个星期的时间对@Croote的好答案

nproc <- 40
T0 <- 3
lambda <- 4
i <- 1

tarr <- matrix(rep(0, nproc), nrow = 1, ncol = nproc)

while(min(tarr[i, ]) <= T0){

  temp <- matrix(tarr[i, ] - log(runif(nproc))/lambda, nrow = 1) #fixed paren
  tarr <- rbind(tarr, temp)
  i = i + 1
}

tarr2 = t(tarr) #takes transpose

library(ggplot2)
library(Rfast)
min_for_each_col <- colMins(tarr2, value = TRUE)
qplot(seq_along(min_for_each_col), sort(min_for_each_col), geom="step")

编辑:一些额外的绘图周-似乎更接近原始

qplot(seq_along(min_for_each_col), c(1:length(min_for_each_col)), geom="step", ylab="", xlab="")
#or with ggplot2
df1 <- cbind(min_for_each_col, 1:length(min_for_each_col)) %>% as.data.frame
colnames(df1)[2] <- "index"
ggplot() +
  geom_step(data = df1, mapping = aes(x = min_for_each_col, y = index), color = "blue") +
    labs(x = "", y = "")