我正在完成一项任务,需要从一个双变量正态分布中生成样本X =(X1,X2),其中每个边际均为N(0,1),X1和X2的相关系数为0.5。
我认为可以使用mvrnorm函数来解决这个问题,但是在此之后该怎么做我不太确定。有什么建议吗?谢谢您的帮助!
我正在完成一项任务,需要从一个双变量正态分布中生成样本X =(X1,X2),其中每个边际均为N(0,1),X1和X2的相关系数为0.5。
我认为可以使用mvrnorm函数来解决这个问题,但是在此之后该怎么做我不太确定。有什么建议吗?谢谢您的帮助!
确实,MASS包中的mvrnorm
函数可能是你最好的选择。该函数可以从多元正态分布生成伪随机数据。
查看此函数的帮助页面(??mvrnorm
)可知,有三个关键参数,您需要根据给定的参数模拟数据:
n
- 所需样本数(整数);mu
- 给出变量的均值的向量 - 在这里,您的分布是标准正态分布,因此它将是一个零向量;以及Sigma
- 指定变量的协方差矩阵的正定对称矩阵 - 即,在您的情况下,对角线上的方差为1,对角线外的协方差为0.5的矩阵。查看此帮助页面中的示例,这应该可以帮助您将这些想法组合在一起!
以下是一些选项:
mvtnorm::rmvnorm
和 MASS::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)
simstandard::sim_standardized
只会生成标准化的数据,但它可以用更少的打字完成:simstandard::sim_standardized("X ~~ 0.5 * Y", n = 100)
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
byrow = TRUE
。在这里显然没问题! - asachet