7 votos

Generando una matriz de datos correlacionados donde tanto las observaciones como las variables están correlacionadas

Estoy tratando de generar una simulación de la matriz de datos que se correlaciona tanto de la observación y de dirección variable. Hasta ahora sé cómo hacerlo para la variable x variable.

enter image description here

 # 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)

Ahora supongamos que queremos crear una matriz de datos que también sigue la siguiente observación x observación de la matriz de correlación.

enter image description here

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

¿Cómo puedo hacer esto ?

7voto

Eero Puntos 1612

Usted puede hacer lo mismo que hizo a las columnas de la matriz a hacer ellos correlacionados, sólo lo hacen a las filas lugar. Esto ajustará la correlación de las observaciones dentro de una columna sin que afecte a las correlaciones entre las columnas de mucho:

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)])

También puede crear una observación de una distribución con n veces p columnas, luego envolver en su matriz. La matriz de correlación es el producto de Kronecker de sus otras matrices de correlación. Mi equipo corrió fuera de la memoria por su ejemplo, sino que trabaja para una pequeña matriz:

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))) 

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X