为什么我的随机游走模拟不能正常工作?
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')
生成的图形类似于:
我编写了以下代码来模拟 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')
生成的图形类似于: