【问题标题】:How to create random vectors of another vector?如何创建另一个向量的随机向量?
【发布时间】:2019-05-24 23:41:42
【问题描述】:

我正在使用常量和向量(近似长度 = 100)执行计算,我需要为此模拟正态分布 N(使用 rnorm)。对于常数(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)

【问题讨论】:

  • 你可以使用mapply mapply(rnorm, n = 3, mean = V, sd = VU)

标签: r


【解决方案1】:

我们可以使用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

也可以

mapply(rnorm, n = 3, mean = V, sd = VU)

【讨论】:

  • 两个答案都简单而优雅。我做了一些基准测试,mapply() 比复制快 25%。由于我需要进行多次迭代,因此我将使用 mapply()。
【解决方案2】:

除了@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

或者也可以使用带有mvrnormMASS 包从多元正态分布中抽样:

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

在哪里

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

如果您希望方差-协方差矩阵不是对角线,则后一种选择是可行的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多