创建3个具有预先指定相关性的相关变量

机器算法验证 r 相关性 模拟
2022-04-02 13:53:23

我从一个从正态分布中采样的随机数向量开始:

R<-rnorm(100, mean=0, sd=30)

我现在想创建 3 个变量,这些变量通过预先指定的相关性相互关联。此外,我想让这三个变量与R预先指定的相关性相关。

例如AB,C彼此之间的相关性为 0.7,并且,A的相关性为 0.6 BCR

即我正在寻找以下协方差矩阵:

    R   A   B   C
R   1  .6  .6  .6
A  .6   1  .7  .7
B  .6  .7   1  .7
C  .6  .7  .7   1

如何在 R 中做到这一点?

2个回答

你可以这样做:

library(mvtnorm)

x = 3.3
sig = matrix(c(30,x,x,x,x,1,.7,.7,x,.7,1,.7,x,.7,.7,1),nrow=4)

X = rmvnorm(100,mean=rep(0,4),sigma=sig,method="svd")
round(cor(X),2)

Y = rmvnorm(10000,mean=rep(0,4),sigma=sig,method="svd")
round(cor(Y),2)

不是协方差矩阵的结构:

> sig
     [,1] [,2] [,3] [,4]
[1,] 30.0  3.3  3.3  3.3
[2,]  3.3  1.0  0.7  0.7
[3,]  3.3  0.7  1.0  0.7
[4,]  3.3  0.7  0.7  1.0

现在,如您所见,只有 100 个样本,计算出的相关性为:

> X = rmvnorm(100,mean=rep(0,4),sigma=sig,method="svd")
> round(cor(X),2)
     [,1] [,2] [,3] [,4]
[1,] 1.00 0.70 0.59 0.67
[2,] 0.70 1.00 0.72 0.73
[3,] 0.59 0.72 1.00 0.74
[4,] 0.67 0.73 0.74 1.00

对于 100,000 个样本,计算出的相关性为:

> Y = rmvnorm(100000,mean=rep(0,4),sigma=sig,method="svd")
> round(cor(Y),2)
     [,1] [,2] [,3] [,4]
[1,]  1.0  0.6  0.6  0.6
[2,]  0.6  1.0  0.7  0.7
[3,]  0.6  0.7  1.0  0.7
[4,]  0.6  0.7  0.7  1.0

我不知道 R,所以这里是口头指示。

步骤 1. 让U是相关矩阵的上 Cholesky 因子。
对于您给出的相关矩阵,U

1  .6  .6       .6
0  .8  .425     .425
0   0  .677772  .235145
0   0   0       .635674

步骤 2. 让Xn×4矩阵,其中第一列是您给定的向量R
其他三列填充随机独立的标准法线。

步骤 3. 从每一列中减去它的平均值X,然后得到结果的 QR 分解。
如果R1,1是负数,则更改第 1 行中所有四个值的符号U.

步骤 4. 让Y=QUn1. 如果你想要的只是标准分数,那么你就完成了。否则,您可以替换第一列Y通过您给定的向量R,然后对于其他三列中的每一列,乘以所需的标准偏差并添加所需的平均值。