我想创建一个矩阵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循环?
答案 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
按位置匹配dists
和params
,因此请确保两个列表都匹配。 / p>
在此示例中,您从每个分布中获得10个随机数,并按列进行汇总(命名dists
列表会有所帮助,因为结果的列将具有相同的名称)。如果您想要从100个不同的分布中采样的10x10矩阵之类的东西,我建议您找到一种方法来生成dists
和parameters
并设置n_ <- 1
。这将为您提供一个包含100个项目的数字矢量,然后您可以使用matrix()
或通过设置dims()
轻松地将其成形为矩阵。
如果您希望始终使用相同的分布但要更改参数,则上述方法会变得更加简单:
mapply(mean = 101:200, sd = 1:101, FUN = rnorm, MoreArgs = list(n = 1))
(我仍然看不到从随机分布中仅抽取一个样本的意义……但我想那是题外话)