R中具有不同元素分布的矩阵

Matrix with different element distribution in R

我想创建一个矩阵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 循环?

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

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_ <- 1。这将为您提供一个包含 100 个项目的数字向量,然后您可以使用 matrix() 或通过设置 dims().

轻松地将其塑造成矩阵

如果你想一直使用相同的分布但改变参数,上面的方法就简单多了:

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

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