この質問は、さまざまなサンプル サイズと確率を持つ多項分布からの効率的なサンプリングに関するものです。以下に、私が使用したアプローチについて説明しますが、インテリジェントなベクトル化で改善できるかどうか疑問に思っています。
複数の集団間での生物の分散をシミュレートしています。集団からの個体は、確率 で集団に分散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 列の要素の値は、人口から人口へj
移動する個体の数です。この行列の は、新しい人口サイズを示します。j
i
rowSums
これを何度も繰り返したいのですが、確率行列は一定ですが、(事前定義された) 初期存在量は変化します。次の小さな例はこれを実現しますが、より大きな問題では非効率的です。結果のマトリックスは、集団の初期存在量が異なる5つのシミュレーションのそれぞれについて、3つの集団のそれぞれにおける分散後の存在量を示します。
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
この問題をより適切にベクトル化する方法はありますか?