0

我尝试使用下面的编码对流行病学 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 并提取但仍然无法做到。

提前感谢您的帮助。

4

2 回答 2

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
于 2013-05-02T10:04:35.827 回答
0

自己进行了试验后,一个问题似乎是许多时间戳与整数结果相距甚远。

要查看这些剩余部分,请检查:out[[1]][,1] %% 1

好消息是您可以使用此输出和调整参数来选择您想要的。为此,您需要找到与 1 之间的距离,然后控制可接受的差距。

执行以下操作并保存结果(以及一堆TRUE结果FALSE

selection <- abs((out[[1]][,1] %% 1) - 1) < 0.1

out然后,您可以使用selection我们刚刚保存的索引对矩阵进行子集化:

out[[1]][selection,]
于 2013-05-02T10:27:55.237 回答