R 矢量化模拟
我试图将我的思想包裹在矢量化上,试图使一些模拟更快,我发现了这个非常基本的流行病模拟。代码来自于书中R 矢量化模拟,r,vectorization,R,Vectorization,我试图将我的思想包裹在矢量化上,试图使一些模拟更快,我发现了这个非常基本的流行病模拟。代码来自于书中 #节目刺激/resources/scripts/SIRsim.r SIRsim很难“矢量化”迭代计算,但这是一个模拟,模拟可能会运行多次。因此,写这篇文章可以同时进行所有的模拟,方法是添加一个参数M(要执行的模拟数量),分配一个mx(T+1)矩阵,然后填充每个模拟的连续列(时间)。这些变化似乎非常直接(因此我可能犯了一个错误;我特别关注在rbinom的第二个和第三个参数中使用向量,尽管这与文档一
#节目刺激/resources/scripts/SIRsim.r
SIRsim很难“矢量化”迭代计算,但这是一个模拟,模拟可能会运行多次。因此,写这篇文章可以同时进行所有的模拟,方法是添加一个参数M
(要执行的模拟数量),分配一个mx(T+1)矩阵,然后填充每个模拟的连续列(时间)。这些变化似乎非常直接(因此我可能犯了一个错误;我特别关注在rbinom
的第二个和第三个参数中使用向量,尽管这与文档一致)
SIRsimapply
函数主要是循环的语法糖分,这样可能不会获得太多速度。您可以尝试使用编译器
包或Rcpp
。
#program spuRs/resources/scripts/SIRsim.r
SIRsim <- function(a, b, N, T) {
# Simulate an SIR epidemic
# a is infection rate, b is removal rate
# N initial susceptibles, 1 initial infected, simulation length T
# returns a matrix size (T+1)*3 with columns S, I, R respectively
S <- rep(0, T+1)
I <- rep(0, T+1)
R <- rep(0, T+1)
S[1] <- N
I[1] <- 1
R[1] <- 0
for (i in 1:T) {
S[i+1] <- rbinom(1, S[i], (1 - a)^I[i])
R[i+1] <- R[i] + rbinom(1, I[i], b)
I[i+1] <- N + 1 - R[i+1] - S[i+1]
}
return(matrix(c(S, I, R), ncol = 3))
}
SIRsim <- function(a, b, N, T, M) {
## Simulate an SIR epidemic
## a is infection rate, b is removal rate
## N initial susceptibles, 1 initial infected, simulation length T
## M is the number of simulations to run
## returns a list of S, I, R matricies, each M simulation
## across T + 1 time points
S <- I <- R <- matrix(0, M, T + 1)
S[,1] <- N
I[,1] <- 1
for (i in seq_along(T)) {
S[,i+1] <- rbinom(M, S[,i], (1 - a)^I[,i])
R[,i+1] <- R[,i] + rbinom(M, I[,i], b)
I[,i+1] <- N + 1 - R[,i+1] - S[,i+1]
}
list(S=S, I=I, R=R)
}