这个问题涉及到在多项式分布中高效采样,其中样本大小和概率不同。以下是我所使用的方法,但我想知道是否可以通过一些智能矢量化来改进它。
我正在模拟生物在多个种群之间的扩散。来自种群j的个体以概率p[i,j]分散到种群i。假设在种群1中有10个个体,且分散概率为c(0.1,0.3,0.6)到分别到种群1、2、3,我们可以用rmultinom来模拟扩散过程:
我们可以将其扩展到考虑
上面,
有没有更好的向量化这个问题的方法?
我正在模拟生物在多个种群之间的扩散。来自种群j的个体以概率p[i,j]分散到种群i。假设在种群1中有10个个体,且分散概率为c(0.1,0.3,0.6)到分别到种群1、2、3,我们可以用rmultinom来模拟扩散过程:
set.seed(1)
rmultinom(1, 10, c(0.1, 0.3, 0.6))
# [,1]
# [1,] 0
# [2,] 3
# [3,] 7
我们可以将其扩展到考虑
n
个源种群:set.seed(1)
n <- 3
p <- replicate(n, diff(c(0, sort(runif(n-1)), 1)))
X <- sample(100, n)
上面,
p
是从一个种群(列)移动到另一个种群(行)的概率矩阵,X
是初始种群大小的向量。现在可以使用以下方式模拟每对种群之间(以及留在原地的个体)之间的迁移数量:sapply(seq_len(ncol(p)), function(i) {
rmultinom(1, X[i], p[, i])
})
# [,1] [,2] [,3]
# [1,] 19 42 11
# [2,] 8 18 43
# [3,] 68 6 8
在第i行和第j列的元素值是从种群j移动到种群i的个体数量。该矩阵的rowSums给出了新的种群大小。
我希望用不同(预定义的)初始丰度多次重复此过程,但概率矩阵保持不变。以下小例子可以实现此目标,但在处理更大问题时效率较低。所得到的矩阵给出了拥有不同初始丰度的五个种群中每个种群的扩散后丰度。
X <- matrix(sample(100, n*5, replace=TRUE), nrow=n)
apply(sapply(apply(X, 2, function(x) {
lapply(seq_len(ncol(p)), function(i) {
rmultinom(1, x[i], p[, i])
})
}), function(x) do.call(cbind, x), simplify='array'), 3, rowSums)
# [,1] [,2] [,3] [,4] [,5]
# [1,] 79 67 45 28 74
# [2,] 92 99 40 19 52
# [3,] 51 45 16 21 35
有没有更好的向量化这个问题的方法?
Rcpp
中的Environment stats("package:stats"); Function rmultinom = stats["rmultinom"];
比在这里(http://lists.r-forge.r-project.org/pipermail/rcpp-devel/2011-June/002393.html)所示的方式更快/更好? - jbaumsrmultinom
函数进行比较,后者快了一个数量级。除非Rcpp可以比您的嵌套应用程序更快地循环遍历不同的总体,否则加速可能并不那么明显。 - Gary Weissman