生成具有特定标准差的相关随机变量

Generate correlated random variables with specific standard deviations

我想生成 N 个随机变量,每个随机变量彼此之间具有固定的相关性 p

变量应该有 mean = 1std = 5

N=10 #number of variables
mu <- rep(1,N) #means
p=0.7 #correlation
Sigma <- matrix(p,ncol=N,nrow=N) #variance covariance matrix
diag(Sigma) <- 5 #standard deviations


library(MASS)
set.seed(12)
data <- mvrnorm(10000,mu,Sigma)

然而,得到的标准偏差不是 5。

apply(data,2,sd)

 [1] 2.264853 2.219811 2.224703 2.245595 2.216712 2.236484 2.240794 2.220532 2.227445 
[10] 2.247943

有没有系统的方法可以在保持其他参数不变的情况下改变标准偏差?

您创建了一个矩阵 Sigma,其中对角线元素为 5,但 mvnorm 需要一个协方差矩阵(不是标准差矩阵)作为 Sigma。所以你需要让对角线元素等于 25。它也没有正确使用 p=0.7 的值,那些是相关性,而不是协方差。您需要将相关性转化为协方差。

参见:

http://blogs.sas.com/content/iml/2010/12/10/converting-between-correlation-and-covariance-matrices.html

https://math.stackexchange.com/questions/446093/generate-correlated-normal-random-variables

您的方差-协方差 (VCV) 矩阵不正确。对角线应该是方差,而不是标准差。如果你这样做

apply(data,2,var)

然后您会看到 方差 约为 5。如果您希望标准偏差为 5,则需要非对角线为 25。

此外,您正在将相关性输入到 VCV 矩阵的非对角线上,这些应该是协方差。要从 correlations to covariances 得到,您需要将相关性乘以相关的两个变量的标准差。在您的情况下,假设两个变量的标准差均为 5,则 VCV 中的协方差应为 p = 0.7 * 5 * 5。所以你最终的 VCV 应该是

p <- 0.7 * 5 * 5
Sigma <- matrix(p,ncol=N,nrow=N) 
diag(Sigma) <- 25 

生成的 N 个随机变量的均值为 1,协方差 p,相关性 p/25.