我正在使用常量和向量(近似长度= 100)执行计算,为此我需要模拟正态分布N(使用rmrm)。对于常数(K,标准差= KU),我以标准方式使用rnorm():
K <- 2
KU <- 0.2
set.seed(123)
KN <- rnorm(n = 3, mean = K, sd = KU)
提供长度为3(KN)的向量的
[1] 1.887905 1.953965 2.311742
现在,我需要对向量(V,标准偏差VU)执行相同的操作。我的第一个猜测是使用:
V <- c(1, 2, 3)
VU <- 0.1 * V
set.seed(123)
VN <- rnorm(3, V, VU)
但只生成一个包含3个元素的向量,每个向量元素一个:
[1] 0.9439524 1.9539645 3.4676125
这实际上是向量的第一个模拟,但是我需要这个向量的3倍。一种解决方案是创建9个数字,但VN是9个元素的向量:
[1] 0.9439524 1.9539645 3.4676125 1.0070508 2.0258575 3.5145195 1.0460916 1.7469878 2.7939441
不是3个元素的3个向量。我想要的是VN =
[1] 0.9439524 1.0070508 1.0460916
[2] 1.9539645 2.0258575 1.7469878
[3] 3.4676125 3.5145195 2.7939441
因此,VN是3个向量,我可以随后将其用于其他计算中,例如KN * VN。我找到的解决方案是:
set.seed(123)
VN <- as.data.frame(t(matrix(rnorm(3 * length(V), V, VU), nrow = length(V))))
但是我认为这是一个相当麻烦的表达(我需要在不同的地方用相当长的变量名重复几次)。在基数R中是否有更简单的方法来产生随机向量?我想看到类似的东西:
VN <- rnorm.vector(3, V, VU)
答案 0 :(得分:4)
除了@akrun的出色选择之外,您还可以使用比您的方法更简单的方法:
matrix(rnorm(n * length(V), V, VU), nrow = n, byrow = TRUE)
# [,1] [,2] [,3]
# [1,] 0.9439524 1.953965 3.467612
# [2,] 1.0070508 2.025858 3.514519
# [3,] 1.0460916 1.746988 2.793944
或带有MASS
的{{1}}软件包,允许从多元正态分布中进行采样:
mvrnorm
其中
library(MASS)
mvrnorm(n, VU, diag(VU))
# [,1] [,2] [,3]
# [1,] 0.6650715 0.37923044 0.05590089
# [2,] 0.2574341 0.24949882 0.97045721
# [3,] -0.5218990 -0.04857971 0.49707815
如果您希望方差-协方差矩阵不对角线,则采用后一种方法。
答案 1 :(得分:4)
我们可以使用diag(VU)
# [,1] [,2] [,3]
# [1,] 0.1 0.0 0.0
# [2,] 0.0 0.2 0.0
# [3,] 0.0 0.0 0.3
replicate
或者可能是
set.seed(123)
replicate(3, rnorm(3, V, VU))
# [,1] [,2] [,3]
#[1,] 0.9439524 1.007051 1.046092
#[2,] 1.9539645 2.025858 1.746988
#[3,] 3.4676125 3.514519 2.793944