如何在R中生成多元正态分布数据?

22

我正在完成一项任务,需要从一个双变量正态分布中生成样本X =(X1,X2),其中每个边际均为N(0,1),X1和X2的相关系数为0.5。

我认为可以使用mvrnorm函数来解决这个问题,但是在此之后该怎么做我不太确定。有什么建议吗?谢谢您的帮助!

3个回答

14

确实,MASS包中的mvrnorm函数可能是你最好的选择。该函数可以从多元正态分布生成伪随机数据。

查看此函数的帮助页面(??mvrnorm)可知,有三个关键参数,您需要根据给定的参数模拟数据:

  • n - 所需样本数(整数);
  • mu - 给出变量的均值的向量 - 在这里,您的分布是标准正态分布,因此它将是一个零向量;以及
  • Sigma - 指定变量的协方差矩阵的正定对称矩阵 - 即,在您的情况下,对角线上的方差为1,对角线外的协方差为0.5的矩阵。

查看此帮助页面中的示例,这应该可以帮助您将这些想法组合在一起!


10

以下是一些选项:

  1. mvtnorm::rmvnormMASS::mvrnorm 的工作方式相同,尽管 mvtnorm :: rmvnorm 函数不要求您指定均值(即默认值为0)。给向量mu命名将指定模拟变量的名称。
n <- 100
R <- matrix(c(1, 0.5,
              0.5, 1), 
            nrow = 2, ncol = 2, byrow = TRUE)
            
mu <- c(X = 0, Y = 0)
mvtnorm::rmvnorm(n, mean = mu, sigma = R)
MASS::mvrnorm(n, mu = mu, Sigma = R)
  1. simstandard::sim_standardized 只会生成标准化的数据,但它可以用更少的打字完成:
simstandard::sim_standardized("X ~~ 0.5 * Y", n = 100)

对我来说,mvtnorm返回“Error in loadNamespace(name) : there is no package called ‘mvrnorm’”,尽管mvrnorm可以工作。 - zaira
你的 R 矩阵中的缩进可能会误导你:矩阵是按列填充而不是按行填充的。如果你的协方差矩阵不对称并且想让你的代码反映该矩阵,请确保使用 byrow = TRUE。在这里显然没问题! - asachet

3
使用基础R(无需任何包)和一些统计学:
Sigma = matrix(c(1,0.5,0.5,1), ncol=2)
R = chol(Sigma) # Sigma == t(R)%*%  R
n = 1000
X = t(R) %*% matrix(rnorm(n*2), 2)

X %*% t(X)/n # test


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接