为什么我的随机游走模拟不能正常工作?

Why isn't my random walk simulation working correctly?

我编写了以下代码来模拟 Z^2 上的无偏随机游走。 "destination" 应该以 1/4 的概率向上、向左、向右或向下移动一个单位。所以我制作了 "destination" 一个包含两列的矩阵,一列用于 x 坐标,一列用于 y 坐标,increment/decrement 根据 runif(1) 的值设置适当的坐标。

N_trials <- 10
N_steps <- 10
destination <- matrix(0,N_trials,2)
for(n in 1:N_steps) {

    p <- runif(1)
    if(p < 1/4) {
      destination[n,1] <- destination[n,1] - 1
    }
    else if(p < 1/2) {
      destination[n,1] <- destination[n,1] + 1
    }
    else if(p < 3/4) {
      destination[n,2] <- destination[n,2] + 1
    }
    else if(p < 1) {
      destination[n,2] <- destination[n,2] - 1
    }
  }

但是,进程似乎永远不会移出集合 {(0,0),(1,0),(-1,0),(0,1),(0,-1)} .为什么是这样?是不是我的代码逻辑有问题?

这就是我所拥有的 --- 这就是您想要的吗?

set.seed(1)

N_trials <- 10
N_steps <- 10
destination <- matrix(0, N_trials, 2)

for(n in 1:(N_steps-1)) {
  p <- runif(1)
  if(p < 1/4) {
    destination[n+1,1] <- destination[n,1] - 1
    destination[n+1,2] <- destination[n,2]
  }
  else if(p < 1/2) {
    destination[n+1,1] <- destination[n,1] + 1
    destination[n+1,2] <- destination[n,2]
  }
  else if(p < 3/4) {
    destination[n+1,1] <- destination[n,1]
    destination[n+1,2] <- destination[n,2] + 1
  }
  else if(p < 1) {
    destination[n+1,1] <- destination[n,1]
    destination[n+1,2] <- destination[n,2] - 1
  }
}

destination

      [,1] [,2]
 [1,]    0    0
 [2,]    1    0
 [3,]    2    0
 [4,]    2    1
 [5,]    2    0
 [6,]    1    0
 [7,]    1   -1
 [8,]    1   -2
 [9,]    1   -1
[10,]    1    0

您可以矢量化随机游走,而不是使用循环。

想法是首先创建一个可能步骤矩阵:

steps <- matrix(c(0,0,-1,1,-1,1,0,0),nrow = 4)

即:

     [,1] [,2]
[1,]    0   -1
[2,]    0    1
[3,]   -1    0
[4,]    1    0

然后你可以将随机下标输入其中:

steps[sample(1:4,10,replace = TRUE),]

例如将创建一个包含 9 行的矩阵,其中每一行都是从 steps 矩阵中随机选择的。

如果你rbind这个以c(0,0)为起始位置,然后取每一列的累加和(cumsum),你就走完了。您可以将其全部包装在一个函数中:

rand.walk <- function(n){
  steps <- matrix(c(0,0,-1,1,-1,1,0,0),nrow = 4)
  walk <- steps[sample(1:4,n,replace = TRUE),]
  walk <-rbind(c(0,0),walk)
  apply(walk,2,cumsum)
}

例如,plot(rand.walk(1000),type = 'l') 生成的图形类似于: