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
按位置匹配 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))
(我仍然看不出只从随机分布中抽取一个样本有什么意义……但我想这是题外话)
我想创建一个矩阵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
按位置匹配 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))
(我仍然看不出只从随机分布中抽取一个样本有什么意义……但我想这是题外话)