r - 矢量化模拟

标签 r vectorization

试图将我的注意力集中在矢量化上,试图更快地进行一些模拟,我发现了这个非常基本的流行病模拟。代码来自书http://www.amazon.com/Introduction-Scientific-Programming-Simulation-Using/dp/1420068725/ref=sr_1_1?ie=UTF8&qid=1338069156&sr=8-1

#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))
}

模拟的核心是for循环。我的问题是,因为代码从 S[i] 生成 S[i+1]R[i+1] 值和 R[i] 值,是否可以使用 apply 函数对其进行矢量化?

非常感谢

最佳答案

迭代计算很难“矢量化”,但这是一种模拟,并且模拟可能会运行多次。因此,通过添加参数 M(要执行的模拟次数)、分配 M x (T + 1) 矩阵,然后填充连续的列,编写此代码以同时执行所有模拟每次模拟的(次)。这些更改似乎非常简单(所以我可能犯了一个错误;我特别关心 rbinom 的第二个和第三个参数中向量的使用,尽管这与文档)。

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)
}

关于r - 矢量化模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10770107/

相关文章:

python - 根据条件舍入数组值的快速方法

python - 根据每一行的第一个元素返回 NumPy 数组的子集

c - 如何克服icc中的 "existence of vector dependence"

r - R中文件路径的原始文本字符串

r - deSolve 包参数可以包含矩阵吗?

Numpy 矩阵乘法与自定义点积

c++ - 如何在 C++ 中向量化 for 循环?

R:通过 Bloomberg API 请求价格信息

r - 使用 scale_color_gradientn 在 ggplot2 中生成的绘图列表着色错误

r - 从 R 中矩阵的每一列创建列表