如果我正确理解您的问题,您需要一个矩阵 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 按位置匹配 dists 和 params,因此请确保两个列表匹配。
在此示例中,您从每个分布中获得 10 个随机数,按列聚合(命名dists 列表会有所帮助,因为结果的列将具有相同的名称)。如果您想要从 100 个不同分布中采样的 10x10 矩阵,我建议您找到一些方法来生成 dists 和 parameters 并设置 n_ <- 1。这将为您提供一个包含 100 个项目的数字向量,然后您可以使用 matrix() 或通过设置 dims() 轻松地将其塑造成矩阵。
如果你想始终使用相同的分布但改变参数,上面的方法会变得简单得多:
mapply(mean = 101:200, sd = 1:101, FUN = rnorm, MoreArgs = list(n = 1))
(我仍然看不出从随机分布中只抽取一个样本的意义……但我想那是题外话)