2015-04-02 168 views
0

假设我想生成X的先前对象的X和Y条件以及概率(F)。我的算法:在特定的一天中,一个人的状态为1/0。如果状态为0,则第二天的状态将为rbinom(1,1,0.5);如果状态1,则第二天的状态将为rbinom(1,1,F[this day])。在这里,我想为N个人和d天生成这些数据。使用R代码生成基于条件的数据

我的代码:

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 

我没有找到取出哪部分代码是错误的。任何人都可以帮忙吗?

+0

如果您使用'rbinom',那么输出将在一定程度上....“随机”。所以问题就变成了:从某种意义上说,你得到的输出不是“喜欢”你期望的输出?你还没有解释这个过程应该做什么,并且只会产生你认为是错误的代码,所以为了生成高效的R代码而试图融合“Fortran-mind”似乎没什么意义。 – 2015-04-02 06:35:01

+0

谢谢。我修改了上面的问题。 – Rudro88 2015-04-02 15:31:07

+0

首先要认识到的是,外层循环正在做这个过程10次,但只留下最后一个被检查。你可以删除外部循环,任何东西都不应该改变。我将对代码进行一些更改,您可以看看您是否可能真的已经在做你想要的东西了。 – 2015-04-02 16:33:48

回答

0

可以删除外部循环,然后可以使用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 }) 
+0

但这不是我需要的。例如,在第9至12列中观察x:1,1,1,0和y:0,1,2,3。但是我想要x:1,1,1,0和y:1,2, 3,0。 – Rudro88 2015-04-02 16:44:50