这个问题涉及从具有不同样本大小和概率的多项分布中进行有效抽样。下面我描述了我使用的方法,但想知道是否可以通过一些智能矢量化来改进它。
我正在模拟生物体在多个种群中的扩散。人口中的个体以概率j
分散到人口中。给定种群 1 的初始丰度为 10,以及分别扩散到种群 1、2 和 3 的概率,我们可以用 模拟扩散过程:i
p[i, j]
c(0.1, 0.3, 0.6)
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
其中第 th 行第 th 列元素的值是从一个人口移动到另一个人口j
的个体数量。这个矩阵的 给出了新的人口规模。j
i
rowSums
我想重复多次,使用恒定的概率矩阵,但具有不同的(预定义的)初始丰度。下面的小例子实现了这一点,但对于较大的问题效率低下。得到的矩阵给出了 5 个模拟中每个种群中三个种群中每个种群的扩散后丰度,其中种群具有不同的初始丰度。
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
有没有办法更好地矢量化这个问题?