利用R
我尝试使用下面的编码对流行病学SEIR模型进行随机模拟利用R,r,R,我尝试使用下面的编码对流行病学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,
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
库(GillespieSSA)
parms假设数据如下所示:
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
我自己进行试验后,一个问题似乎是许多时间戳与整数结果相差甚远
要查看这些余数,请选中:out[[1]][,1]%1
好消息是,您可以使用此函数的输出以及一个调优参数来选择所需的内容。为此,您需要找到距离1的距离,然后控制可接受的间距
按如下操作并保存结果(以及一堆TRUE
和FALSE
结果)
时间值为0.02、0.003等的模拟数据应从数据中删除。只应提取接近0,1,2的时间值,如0.00,0.98.1.9。是否要向下采样?你能发布一个可复制的例子吗?显示如何从向量A转到向量B。@e4e5f4。你好谢谢你的回复。假设我将这些编码添加到上面的编码中:是的,这就是我想要的!非常感谢。但是,我可以知道这个编码是如何工作的吗?“idx从内到外读取很容易。天花
将创建一个类似1,1,…,2,2,…,3,3,…
的序列。取diff
将在值发生变化的地方给出1
s。检查==1
将在这些点产生逻辑向量TRUE
,而FALSE
则返回e、 我试着在我的编码中做到这一点。我确实得到了输出,但在它从16开始取值之后,…然后它直接给出23以后的值。我如何在我的编码中改变它以获得每个时间间隔?编码如下:库(Gillespiesa)parms在您的数据中缺少一些值(不是真正连续的!).try:idx是的,缺少一些。由于这是一个随机模拟,我不知道如何获得从0-1,1-2到50的每个间隔的输出。但是,无论如何,这确实有很大帮助。还有一个问题,既然间隔20-21及以上没有值,是否有任何编码可以让我在自己的内部添加值?因为,如果没有re对于该时间间隔,这意味着读数在下一个时间间隔之前是相同的。非常感谢您的及时回复。我非常感谢您。当我运行您所述的编码时,我确实得到了输出,但对于0.9时间值,我有四个读数。我只需要在该时间间隔内读取一个。就像在0.0的一个读数中,0.9的一个读数,0.9的一个读数1.9因为所有这些数字都接近于0、1、2等等。对不起,也许我没有说清楚。那么您需要的是最接近每个整数的单个值?
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
selection <- abs((out[[1]][,1] %% 1) - 1) < 0.1
out[[1]][selection,]