【问题标题】:Matrix with different element distribution in RR中具有不同元素分布的矩阵
【发布时间】:2026-01-06 05:15:02
【问题描述】:

我想创建一个矩阵M:

n <- 10
prob0 <- 0.75
M <- matrix(sample(c(0,1), size=n*n, replace=TRUE, prob=c(prob0, 1 - prob0)), n, n)

其中,对于每个 (i, j) 元素,prob0 是从 uniform([0,1]) 中提取的,而不会重复到 for 循环(如果可能的话)。我的问题是一个专门化的一般问题是:有没有办法在 R 中创建一个矩阵,比如NxN,其中每个元素来自不同的分布而不重复到 for 循环?

【问题讨论】:

    标签: r matrix random distribution


    【解决方案1】:

    如果我正确理解您的问题,您需要一个矩阵 M,如果从 uniform([0,1]) 抽取的随机值 r 高于 p 和 1,则其中每个元素 (i,j) 将为 0否则。这可以通过以下方式轻松实现:

    n <- 10
    prob0 <- 0.75
    matrix(runif(n * n) > prob0, n, n)
    

    如果您想为每个项目使用不同的prob0,只需将其替换为runif(n * n)

    matrix(runif(n * n) > runif(n * n), n, n)
    

    但此时,您只是在比较随机数对,所以

    matrix(runif(n * n) > 0.5, n, n)
    

    产生相同的结果。

    如果您希望矩阵上每个项目的分布完全不同,您可以创建两个列表,一个带有函数名称,另一个带有参数,然后使用mapply + do.call

    n_ <- 10
    dists <- list(
      NORM_11 = "rnorm",
      UNIF = "runif",
      NORM_23 = "rnorm")
    params <- list(
      NORM_11 = list(n = n_, mean = 1, sd = 1),
      UNIF = list(n = n_),
      NORM_23 = list(n = n_, mean = 2, sd = 3))
    mapply(dists, params, FUN = do.call)
    

    请注意,名称(NORM_11 等)只是为了方便起见,mapply 按位置匹配 distsparams,因此请确保两个列表匹配。

    在此示例中,您从每个分布中获得 10 个随机数,按列聚合(命名dists 列表会有所帮助,因为结果的列将具有相同的名称)。如果您想要从 100 个不同分布中采样的 10x10 矩阵,我建议您找到一些方法来生成 distsparameters 并设置 n_ &lt;- 1。这将为您提供一个包含 100 个项目的数字向量,然后您可以使用 matrix() 或通过设置 dims() 轻松地将其塑造成矩阵。

    如果你想始终使用相同的分布但改变参数,上面的方法会变得简单得多:

    mapply(mean = 101:200, sd = 1:101, FUN = rnorm, MoreArgs = list(n = 1))
    

    (我仍然看不出从随机分布中只抽取一个样本的意义……但我想那是题外话)

    【讨论】:

    • 好的,如果我想创建一个矩阵,每个条目都有不同的规律,例如(1,1) Normal{mean 0, sd 1}, (1,2) uniform{[0,1]}, (1,3) Normal{mean 2, sd 3} 没有循环?