R语言 一种基于概率值矩阵随机抽样的快速真假矩阵生成方法

tyg4sfes  于 2023-09-27  发布在  其他
关注(0)|答案(1)|浏览(128)

我有一个n × n矩阵,其中的值在[0,1]之间,每一列都有相同的值。
这些值表示矩阵的每个元素取TRUE或FALSE值的概率。
我正在寻找一种快速的方法来转换矩阵的概率与一个矩阵的TRUE/TRUE值的基础上,为每个元素的独立随机样本。
目前,这段代码生成了我想要的(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循环,我需要对一个大矩阵反复执行。
有没有一种方法可以使它更有效(即尽可能快)?

bis0qfac

bis0qfac1#

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

相关问题