从具有均值和标准差的相关矩阵生成模拟数据集

机器算法验证 r
2022-04-11 04:04:28

我有一个来自学术论文的标准相关矩阵,其中包含平均值和标准偏差:

     mean sd   var1 var2 var3
var1 4.23 1.23 1.00 
var2 3.01 0.92 0.78 1.00
var3 2.91 1.32 0.23 0.27 1.00

如何使用特定N(例如 212)生成模拟数据集R

2个回答

您可以使用包中的函数mvrnormMASS多元正态分布中采样值。

您的数据:

mu <- c(4.23, 3.01, 2.91)
stddev <- c(1.23, 0.92, 1.32)

corMat <- matrix(c(1, 0.78, 0.23,
                   0.78, 1, 0.27,
                   0.23, 0.27, 1),
                 ncol = 3)
corMat
#      [,1] [,2] [,3]
# [1,] 1.00 0.78 0.23
# [2,] 0.78 1.00 0.27
# [3,] 0.23 0.27 1.00

创建协方差矩阵:

covMat <- stddev %*% t(stddev) * corMat
covMat
#          [,1]     [,2]     [,3]
# [1,] 1.512900 0.882648 0.373428
# [2,] 0.882648 0.846400 0.327888
# [3,] 0.373428 0.327888 1.742400

样本值。如果您使用empirical = FALSE,则均值和协方差值表示总体值。因此,采样数据集很可能与这些值不完全匹配。

set.seed(1)
library(MASS)
dat1 <- mvrnorm(n = 212, mu = mu, Sigma = covMat, empirical = FALSE)
colMeans(dat1)
# [1] 4.163594 2.995814 2.835397
cor(dat1)
#           [,1]      [,2]      [,3]
# [1,] 1.0000000 0.7348533 0.1514836
# [2,] 0.7348533 1.0000000 0.2654715
# [3,] 0.1514836 0.2654715 1.0000000

如果您使用 采样empirical = TRUE,则采样数据集的属性完全匹配均值和协方差。

dat2 <- mvrnorm(n = 212, mu = mu, Sigma = covMat, empirical = TRUE)
colMeans(dat2)
# [1] 4.23 3.01 2.91
cor(dat2)
#      [,1] [,2] [,3]
# [1,] 1.00 0.78 0.23
# [2,] 0.78 1.00 0.27
# [3,] 0.23 0.27 1.00

假设正态性,您可以从多元正态分布中抽取样本。你需要的是一个均值向量和一个协方差矩阵如果您还记得协方差矩阵在对角线上具有方差,并且在其余单元格中具有协方差值,则可以从数据中重新创建 if。μ=(μ1,...,μk) Σ

相关性

corr(X,Y)=cov(X,Y)σXσY

并且您已经拥有各个变量的相关系数和标准差,因此您可以使用它们来创建协方差矩阵。现在,您只需将这些值用作从 MVN 分布采样的统计包中的某些函数的参数,例如R 中的mvtnorm包。