使用R从模拟数据中的特定时间限制中提取值

时间:2013-05-02 09:44:27

标签: 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,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,但仍然无法做到。

提前感谢任何帮助。

2 个答案:

答案 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

好消息是你可以使用这个带有调整参数的输出来选择你想要的。为此,您需要找到一个距离,然后控制可接受的间隙。

执行以下操作并保存结果(以及一堆TRUEFALSE结果)

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

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

out[[1]][selection,]