R生成聚类伪随机数

R generate clustered pseudo-random numbers

在 R 中:我试图找出一种方法来生成值为 0 或 1 的向量。与其从均匀分布中独立绘制每个 0 和 1,我希望 1 聚集在一起,例如(1,0,0,0,0,0,1,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,...)。最简单的形式类似于:"if the previous number was 1 then increase the likelihood of drawing 1"。或者使绘​​制 1 的机会取决于最后绘制的 5 个数字的总和。有没有一种有效的方法可以做到这一点,甚至可能是一个包。会让人想起带有变量 prob.

rbinom(n,1,prob)

您可以使用循环尝试以下方法。首先,您可以使用示例创建一个名为 "x" 的变量,该变量将分配初始值 0 或 1。

在循环中您可以再次使用示例函数,但这次您要为 prob 选项赋值。为此,我将概率设置为 70/30 拆分(即,如果您之前的数字为 0,则下一个数字有 70% 的机会为 0,如果您之前的值为 1,则反之亦然。)

x = sample(c(0,1),1)
for(i in 2:100){
  if(x[i-1] == 0){
    x[i] = sample(c(0,1),1,prob=c(0.7,0.3))
  } else {
    x[i] = sample(c(0,1),1,prob=c(0.3,0.7))
  }
}

x[1:20]
[1] 1 1 1 0 0 0 0 0 1 1 1 0 1 0 0 0 1 1 0 0

所以我从 Colin Charles 那里得到了很好的启发,并增加了一点可调整性。显然有很多方法可以计算受先前抽签影响的概率。我最终使用最后 w 抽奖总和的截止点 m 来确定是对每个 0/1 使用低概率 p0 还是高概率 p1长度向量 l.

f <- function (l, w, m, p0, p1){

  v = rbinom(w,1,p0) #Initilize with p0

    for (i in w:(l-1)){
      v[i+1] <- ifelse(sum(v[(i-w+1):i]) > m, 
                       rbinom(1,1,p1),  
                       rbinom(1,1,p0))
    }

    return(v)
  }

#Test:
set.seed(8)
plot(f(100, 5, 1, 0.1, 0.6)) #Clustered
plot(f(100, 5, 2, 0.1, 0.4)) #Less clustered

给出:

和(较少聚集):