【问题标题】:mvrnorm (from MASS) vs rmvnorm (from mvtnorm)mvrnorm(来自 MASS)与 rmvnorm(来自 mvtnorm)
【发布时间】:2019-10-12 13:38:18
【问题描述】:

我正在从多元正态分布生成大量数据以进行模拟。我想知道是否有人知道哪个命令对此最有效。如果是 mvnorm(来自“MASS”包)或 rmvnorm(来自“mvtnorm”包)。

【问题讨论】:

    标签: r random gaussian normal-distribution


    【解决方案1】:

    这些问题可以通过定时不同的方法来轻松回答。让

    library(microbenchmark)
    library(MASS)
    library(mvtnorm)
    
    n <- 10000
    k <- 50
    mu <- rep(0, k)
    rho <- 0.2
    Sigma <- diag(k) * (1 - rho) + rho 
    

    通过这种方式,我们有 50 个变量,单位方差和相关性为 0.2。生成 10000 个观察结果

    microbenchmark(mvrnorm(n, mu = mu, Sigma = Sigma),
                   rmvnorm(n, mean = mu, sigma = Sigma, method = "eigen"),
                   rmvnorm(n, mean = mu, sigma = Sigma, method = "svd"),
                   rmvnorm(n, mean = mu, sigma = Sigma, method = "chol"),
                   times = 100)
    # Unit: milliseconds
    #                                                    expr      min       lq     mean   median        uq      max neval cld
    #                      mvrnorm(n, mu = mu, Sigma = Sigma) 65.04667 73.02912 85.30384 81.70611  92.69137 148.6959   100  a 
    #  rmvnorm(n, mean = mu, sigma = Sigma, method = "eigen") 71.14170 81.08311 95.12891 88.84669 100.62174 237.0012   100   b
    #    rmvnorm(n, mean = mu, sigma = Sigma, method = "svd") 71.32999 81.30640 93.40939 88.54804 104.00281 208.3690   100   b
    #   rmvnorm(n, mean = mu, sigma = Sigma, method = "chol") 71.22712 78.59898 94.13958 89.04653 108.27363 158.7890   100   b
    

    因此,mvrnorm 的性能可能稍好一些。由于您有一个特定的应用程序,您应该将nkSigma 设置为更适合此应用程序的值。

    由于您似乎不受这两种方法的限制,您可以查看Rcpp 替代方案;参见,例如,123

    【讨论】:

    • 要考虑的其他(基于 Rcpp)选项:rgenRcppDist
    • 感谢您的解释。我正在考虑尝试 Rcpp,但我会等到真的有必要时,无论是时间还是记忆。无论如何,感谢您的链接,它们会被很好地使用。
    猜你喜欢
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-07
    • 2019-05-01
    相关资源
    最近更新 更多