一种快速生成基于随机抽样和概率矩阵的真假矩阵的方法。

3
我有一个 n × n 的矩阵,其中的值介于 [0,1] 之间,每一列的值都相同。
这些值表示矩阵中每个元素取值为 TRUE 或 FALSE 的概率。
我正在寻找一种快速的方法,将概率矩阵转换为基于每个元素独立随机样本的 TRUE/FALSE 值矩阵。
目前,这段代码生成了我想要的结果(tf_matrix):
n <- 10
p_true <- runif(n,0,1)

p_matrix <- matrix(p_true,n,n, byrow=T)
tf_matrix <- matrix(F, n,n)

for(i in 1:nrow(tf_matrix)) {
    
    for(j in 1:ncol(tf_matrix)) {
        
        tf_matrix[i,j] <- sample(c(T,F), size = 1, prob = c(p_matrix[i,j], 1-p_matrix[i,j]))
        
    }
}


然而,这种方法可能非常慢,因为它使用了两个for循环,并且我需要对一个大矩阵进行反复操作。
有没有办法使这个过程更加高效(即尽可能快速)?
1个回答

5

sample(c(T, F), size = 1, prob = x) 等同于 runif(1) < x。但是使用 runif<,我们可以轻松地进行扩展,因为 < 是向量化的:

set.seed(42) ## set seed for reproducibility
n <- 5       ## smaller example is easier to see
p_true <- runif(n,0,1)
p_matrix <- matrix(p_true,n,n, byrow=T)
p_matrix
#          [,1]      [,2]      [,3]      [,4]      [,5]
# [1,] 0.914806 0.9370754 0.2861395 0.8304476 0.6417455
# [2,] 0.914806 0.9370754 0.2861395 0.8304476 0.6417455
# [3,] 0.914806 0.9370754 0.2861395 0.8304476 0.6417455
# [4,] 0.914806 0.9370754 0.2861395 0.8304476 0.6417455
# [5,] 0.914806 0.9370754 0.2861395 0.8304476 0.6417455

tf_matrix = runif(n * n) < p_matrix
tf_matrix
#      [,1] [,2]  [,3]  [,4]  [,5]
# [1,] TRUE TRUE FALSE FALSE  TRUE
# [2,] TRUE TRUE FALSE  TRUE  TRUE
# [3,] TRUE TRUE  TRUE FALSE FALSE
# [4,] TRUE TRUE FALSE FALSE  TRUE
# [5,] TRUE TRUE FALSE  TRUE FALSE

太棒了,非常感谢你! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接