Я генерирую большой объем данных из многомерного нормального распределения для моделирования. Интересно, знает ли кто-нибудь, какая команда наиболее эффективна для этого. Если это mvrnorm (из пакета "MASS") или rmvnorm (из пакета "mvtnorm").
На такие вопросы можно легко ответить, рассчитывая различные подходы. Позволять
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
работает немного лучше. Поскольку вы имеете в виду конкретное приложение, вы должны установить n
, k
и Sigma
значения, более подходящие для этого приложения.
Поскольку вы, похоже, не ограничены этими двумя подходами, вы можете рассмотреть Rcpp
альтернативы; см., например, 1, 2, 3.
Спасибо за объяснение. Думаю попробовать Rcpp, но подожду пока действительно понадобится то ли по времени то ли по памяти. В любом случае, спасибо за ссылки, они будут хорошо использованы.
Дополнительные (на основе Rcpp) параметры для рассмотрения: rgen и RcppDist.