R中元素分布不同的矩阵

时间:2018-12-04 23:01:29

标签: r matrix random distribution

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

1 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,则需要一个矩阵M,其中如果从(i,j)提取的随机值r,每个元素uniform([0,1])将为0,高于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,因此请确保两个列表都匹配。 / p>

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

如果您希望始终使用相同的分布但要更改参数,则上述方法会变得更加简单:

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

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