生成一个相关的数据矩阵,其中观察和变量都是相关的

机器算法验证 r 相关性 矩阵
2022-04-04 21:06:47

我正在尝试生成一个与观察和可变方向相关的模拟数据矩阵。到目前为止,我知道如何为变量 x 变量执行此操作。

在此处输入图像描述

 # correlated matrix between variables 
    n = 200
    p = 100 
    CRMt <- matrix(NA, nrow = p, ncol = p)
    diag(CRMt) <- 1
    CRMt[upper.tri (CRMt, diag = FALSE)] <- 0.5
    CRMt[lower.tri (CRMt, diag = FALSE)] <- 0.5

L = chol(CRMt)# Cholesky decomposition
p = dim(L)[1]

set.seed(999)
M = t(L) %*% matrix(rnorm(p*n), nrow=p, ncol=n)
M1 <- t(M)
rownames(M1) <- paste("S", 1:200, sep = "") 
colnames(M1) <- paste("M", 1:100, sep = "")
cor(M1)

现在说我想创建一个数据矩阵,它也遵循以下观察 x 观察相关矩阵。

在此处输入图像描述

OCRMt <- matrix(NA, nrow = n, ncol = n)
diag(OCRMt) <- 1
OCRMt[upper.tri (OCRMt, diag = FALSE)] <- 0.3
OCRMt[lower.tri (OCRMt, diag = FALSE)] <- 0.3

我怎样才能做到这一点 ?

1个回答

您可以对矩阵的列执行相同的操作以使它们相互关联,只需对行执行此操作即可。这将调整列内观察值的相关性,而不会太大影响列之间的相关性:

L = chol(OCRMt)# Cholesky decomposition
p = dim(L)[1]

M2 <- t(L) %*% M1

hist( cor(M2)[ lower.tri(cor(M2), diag=FALSE)])
hist( cor(t(M2))[ lower.tri(cor(t(M2)), diag=FALSE)])

您还可以从具有 n 次 p 列的分布中创建一个观察值,然后将其包装到矩阵中。相关矩阵是您的其他相关矩阵的克罗内克积。对于您的示例,我的计算机内存不足,但适用于较小的矩阵:

library(MASS)
vcmat <- matrix( 0.5, 10,10 )
diag(vcmat) <- 1

ocmat <- matrix( 0.3, 20,20 )
diag(ocmat) <- 1

cmat <- kronecker( ocmat, vcmat )

obs <- matrix( mvrnorm(1, mu=rep(0,10*20), Sigma=cmat), 20, 10 )

hist(cor(obs))
hist(cor(t(obs)))