假设我想生成X的前一个对象的X和Y条件以及概率(F)。我的算法:在某一天,一个人的状态为1/0。如果状态为0,则第二天的状态为rbinom(1,1,0.5)
;如果状态1,那么第二天的状态将为rbinom(1,1,F[this day])
。在这里,我想为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
我不知道代码的哪一部分是错误的。有人可以帮忙吗?
答案 0 :(得分:0)
可以删除外部循环,然后使用replicate
函数在每次迭代时存储输出。我还将这个过程扩展到20个步骤,看看你是否可以看到你得到两个&#34;事件&#34;的实例。
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 } )