使用R代码根据条件生成数据



假设我想生成X和概率(F)的前一个对象的X和Y条件。我的算法:在特定的一天,一个人的状态为1/0。如果状态为0,则第二天的状态将为rbinom(1,1,0.5);如果状态1,则第二天的staus将是CCD_ 2。在这里,我想生成N个人和d天的数据。

我的代码:

N <- 10 # number of individual
d <- 10 # days
F <- c(0.9,0.8, 0.7, 0.6, 0.5, 0.4) # Probabilities
    for(j in 1:N){
        x <- NULL
        x[1] <- rbinom(1,1,0.5)
        y <- NULL
        y[1] <- ifelse(x[1]==1, 1, 0)
        for(i in 2:d){ 
            if(x[i-1]==0)
            {
            y[i] <- x[i-1]
            x[i] <- rbinom(1,1,0.05)
            }
            if(x[i-1]==1) 
            {
            y[i] <- y[i-1]+x[i-1]
            x[i] <- rbinom(1,1,F[y[i]]) 
            }
        }
    }

此代码生成类似的数据

   > x
     [1] 1 1 0 0 0 0 0 0 0 1
    > y
     [1] 1 2 3 0 0 0 0 0 0 0

但我想生成这样的X和Y:

 > x
 [1] 1 1 0 0 0 0 0 0 0 1
> y
 [1] 1 2 0 0 0 0 0 0 0 1

我不知道代码的哪一部分是错的。有人能帮忙吗?

可以移除外循环,然后可以使用replicate函数在每次迭代时存储输出。我还将这个过程扩展到20个步骤,看看您是否可以看到获得两个"事件"的实例。

N <- 10 
d <- 20
F <- c(0.9,0.8, 0.7, 0.6, 0.5, 0.4) 
   replicate(10,{     x <- NULL
        x[1] <- rbinom(1,1,0.5)
        y <- NULL
        y[1] <- ifelse(x[1]==1, 1, 0)
        for(i in 2:d){ 
            if(x[i-1]==0)
            {
            y[i] <- x[i-1]
            x[i] <- rbinom(1,1,0.05)
            }
            if(x[i-1]==1) 
            {
            y[i] <- y[i-1]+x[i-1]
            x[i] <- rbinom(1,1,F[y[i]]) 
            }
        }
      return(rbind(x,y)) } )

经过几次运行,我确实看到了一次,你得到了你想要的(我认为),即x和y中的两个正值序列。这恰好是10运行中的第七个例子:

, , 7
  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20]
x    0    0    0    0    0    0    0    0    1     1     1     0     0     0     1     1     1     1     0     0
y    0    0    0    0    0    0    0    0    0     1     2     3     0     0     0     1     2     3     4     0

您从未用自然语言描述过当前输出中有什么不令人满意的地方,所以我想这仍然只是猜测。我还认为,您应该将模拟结果分配给一个对象,这样您就可以稍后通过编程检查N何时变得足够高,以至于无法通过肉眼查看。

res <- replicate( 1000, { code block here } )

最新更新