我目前正在尝试应用 Herrmann 等人中描述的重采样方法。 (2022) 具有外部和内部重采样循环: 我的数据集由 100 行 x 60 列组成。行对应于尝试 ID(每行一次尝试),列对应于物种(每列一个物种)。每个单元格代表每次尝试的每个物种 i 的个体数量 K = NiK
NiK 可能会因重采样而变化,但给定尝试中所有混杂物种的个体总数(称为 NK,对应于行总和)需要保持不变。
让我们生成一个类似的数据框:
df <- matrix(sample(0:15, 6000, replace = T), ncol = 60)
df
这是我用于外循环的代码:
#Outer loop
#Resampling among the 100 tries 1000 times
seed(1234)
outer = matrix(replicate(1000, sample(1:nrow(df), nrow(df), replace = T)), ncol = 100)
现在添加内部循环,我被困住了。 内部循环在每次尝试中对给定物种的个体数量进行重新采样,而外部循环则在内部循环生成的新数据集中对尝试进行重新采样:
i = 物种数
r = 外部重采样 ID
inner <- NULL
complete <- NULL
for (r in 1:1000) {
for (i in 1:ncol(df)) {
inner = cbind(inner,sample(df[,i], nrow(df), replace = T))
}
complete = rbind(complete, inner[outer[r,],])
inner <- NULL
}
complete
该循环可以很好地通过内部和外部循环生成 100 次尝试的 1000 次重采样,但我目前不知道如何限制每一行的总和为 NK,这可以针对给定的尝试进行计算K :
rowSums(df[K,])
有谁知道一个函数或方法可以允许在使用内部循环在每列中重新采样时保持 NK 恒定吗?
预先感谢您的帮助,希望我的英语和我的解释是可以理解的。
使用
rowSums(df)
和 rmultinom
,我们可以对一行重新采样并最终得到相同的总数。示范:
rs <- rowSums(df)
all(replicate(100, sum(rmultinom(1, rs[1], df[1,])) == rs[1]))
#> [1] TRUE
由于要对内部样本求和,因此对于每个外部样本,我们可以对多个行重采样进行行求和。
set.seed(1234)
K <- 100L # "tries"
N <- 60L # species
R <- 1e3L # resamples
df <- matrix(sample(0:15, N*K, replace = 1), K, N)
rs <- rowSums(df)
outer <- mapply( # outer sampling
\(x) rowSums(
# inner sampling
mapply(\(i) rmultinom(1, rs[i], df[i,]), sample(nrow(df), K, 1))
),
1:R
)
dim(outer)
#> [1] 60 1000
outer
的每一列现在对应于外部重采样。