我有一个大的概率矩阵(称之为A),N乘806,其中N通常是数千的数字。
使用这个概率矩阵,我想创建另一个矩阵(称之为B),N乘806,只包含二进制值。 B [i,j]中的值是通过使用二项式在A [i,j]中的对应概率来确定的。我正在使用的代码如下:
diCases <- matrix(0, nrow = numcases, ncol = numdis)
diConts <- matrix(0, nrow = numconts, ncol = numdis)
for(row in 1:nrow(diCases)) {
print(paste('Generating disease profile for case', row, '...'))
for(col in 1:ncol(diCases)) {
pDis <- Pcases[row, col]
diCases[row, col] <- rbinom(1, 1, pDis)
}
}
for(row in 1:nrow(diConts)) {
print(paste('Generating disease profile for control', row, '...'))
for(col in 1:ncol(diConts)) {
pDis <- Pconts[row, col]
diConts[row, col] <- rbinom(1, 1, pDis)
}
}
基本上,我已经使用了嵌套的for循环,循环遍历每一行中的每一列并继续前进到下一行,根据结果分配1或0:
rbinom(1, 1, pDis)
其中pDis是开头提到的A [i,j]。可以想象,这很慢,是我代码中的主要瓶颈。这段代码是在我计划一次又一次地运行的模拟中,理想情况是在很短的时间内。
有没有更快的方法来实现这一目标?我查看了&#34; apply&#34;功能,但无法真正弄清楚如何使它适用于这个特定的任务。
提前谢谢大家。
答案 0 :(得分:4)
尝试
f <- function(prob.mat)
matrix(rbinom(prob.mat, 1, prob.mat), ncol = ncol(prob.mat))
diCases <- f(Pcases)
diConts <- f(Pconts)