模拟R

时间:2016-06-10 19:33:09

标签: r random-walk

我一直在尝试在R中的n循环算法上实现随机游走。

n循环是指整数Zn或模n的集合。基本上,它是来自Levin,Peres和Wilmer的书“马尔可夫链和混合时间”的例子5.3.1。目的如下:考虑两个链模拟Zn上的两个粒子X和Y的运动,起点X1和Y1。通过翻转一个公平的硬币,我们决定哪个粒子会移动(粒子不能同时移动,除非它们已经耦合);方向是由另一个公平的硬币翻转决定的。 一旦两个粒子碰撞,它们就会在此后一起移动。它是实施CFTP算法的研究项目的一部分,因此链的长度应该具有预定义的值,比如T.

代码未运行,并显示错误消息。错误是“找不到对象'res'”。但是,我之前已将“res”定义为存储函数输出的列表。为什么会发生这种情况?如何解决?

我有两个脚本:在第一个脚本中,代码被拆分为较小的辅助函数;第二个可能比较麻烦,因为我试图将所有辅助函数放在一个函数中。 任何帮助都感激不尽。

这是剧本2.

# X1 - initial state of chain X
# Y1 - initial state of chain Y
# T - "length" of a chain, number of steps the chains will run for. 
# n - length of the n-cycle, i.e., Zn. 

Main_Function <- function (X1 = 8, Y1 = 4 , T = 20, n = 6){ 
  X <- rep( X1, T) %% n         # X, Y and res will store the results
  Y <- rep( Y1, T) %% n         
  res <- list(X,Y)              # Here I defined the object res. Later on R encounters an error "object 'res' not found".  
  ps <- TakeOneStep()           # TakeOneStep is a function defined below
  return(ps)
}

TakeOneStep <- function(){
  incr_same <- sample(c(-1, 0, 1), size = 1, prob = c(1/4, 1/2, 1/4))           #direction of the particles after they have coupled
  incr_dif <- sample(c(-1,1), size = 1, prob = c(1/2, 1/2))             # direction of the particles before coupling occurred.  
  choice <- runif(T)                                                    # determines which chain moves, before coupling occurred. 
  for(t in 2:T){
    if(res[[1]][t-1]%%n == res[[2]][t-1]%%n){
      res[[1]][t] <- (res[[1]][t-1] + incr_same) %% n
      res[[2]][t] <- (res[[2]][t-1] + incr_same) %% n
    }else{ if(choice[t] < 0.5) {
            res[[1]][t] <- (res[[1]][t-1] + incr_dif) %% n
            }else{res[[2]][t] <- (res[[2]][t-1] + incr_dif)%%n}
      }
  }
  return(res)
}

0 个答案:

没有答案