我尝试使用下面的编码对流行病学SEIR模型进行随机模拟。
library(GillespieSSA)
parms <- c(beta=0.591,sigma=1/8,gamma=1/7)
x0 <- c(S=50,E=0,I=1,R=0)
a <- c("beta*S*I","sigma*E","gamma*I")
nu <- matrix(c(-1,0,0,
1,-1,0,
0,1,-1,
0,0,1),nrow=4,byrow=TRUE)
set.seed(12345)
out <- lapply(X=1:10,FUN=function(x) ssa(x0,a,nu,parms,tf=50)$data)
out
我设法获得了我想要的10个模拟值。时间是连续的。现在,我必须从每个模拟中以离散形式提取时间,例如1,2,3 ...,50。我应该使用哪种类型的编码?
我尝试过data.frame和extract,但仍然无法做到。
提前感谢任何帮助。
答案 0 :(得分:0)
让我们说数据看起来像这样:
df <- data.frame(t=seq(0.4,4.5,0.03), x=1:137)
## t x
## 1 0.40 1
## 2 0.43 2
## 3 0.46 3
## 4 0.49 4
## 5 0.52 5
获取离散时间索引值:
idx <- diff(ceiling(df$t)) == 1
离散时间序列将是:
df[idx,]
## t x
## 21 1.00 21
## 54 1.99 54
## 87 2.98 87
## 121 4.00 121
答案 1 :(得分:0)
自己运行试验时,问题似乎是许多时间戳与整数结果相距很远。
要查看这些剩余部分,请检查:out[[1]][,1] %% 1
好消息是你可以使用这个带有调整参数的输出来选择你想要的。为此,您需要找到一个距离,然后控制可接受的间隙。
执行以下操作并保存结果(以及一堆TRUE
和FALSE
结果)
selection <- abs((out[[1]][,1] %% 1) - 1) < 0.1
然后,您可以使用我们刚保存的out
索引对矩阵selection
进行子集化:
out[[1]][selection,]