¿Cómo generar una matriz de correlación aleatoria que tenga entradas fuera de diagonal distribuidas aproximadamente normalmente con una desviación estándar dada?


11

Me gustaría generar una matriz de correlación aleatoria de modo que la distribución de sus elementos fuera de la diagonal se vea aproximadamente como normal. ¿Cómo puedo hacerlo?

La motivación es esta. Para un conjunto de series de datos de tiempo, la distribución de correlación a menudo se ve bastante cercana a lo normal. Me gustaría generar muchas matrices de correlación "normales" para representar la situación general y usarlas para calcular el número de riesgo.n


Conozco un método, pero la desviación estándar resultante (de la distribución de los elementos fuera de la diagonal) es demasiado pequeña para mi propósito: generar filas aleatorias uniformes o normales de una matriz X , estandarizar las filas (restar la media, dividir por desviación estándar), luego la matriz de correlación de muestra 1nXnormalmente ha distribuido entradas fuera de la diagonal [actualizacióndespués de comentarios: desviación estándar será~n-1/2].1n1XXn1/2

¿Alguien puede sugerir un método mejor con el que pueda controlar la desviación estándar?


1
@ Richard, gracias por tu pregunta. Desafortunadamente, el método que describe arriba no producirá entradas que normalmente se distribuyen. Las diagonales son 1 con probabilidad uno y las diagonales están limitadas entre y + 1 . Ahora, las entradas reescaladas convergerán asintóticamente a una distribución normal centrada alrededor de cero. ¿Puede darnos más información sobre el problema que realmente está tratando de resolver? Y, ¿por qué quieres "distribuido normalmente" fuera de las diagonales? 1+1
cardenal

1
@ Richard, lo que quiero decir fue, supongamos que e Y = ( Y 1 , Y 2 , ... , Y n ) son dos vectores independientes de manera que las entradas de cada uno son iid estándar normal Compute ρ n = s x y / ( s x s y ) ; es decir, la correlación muestral entre X yX=(X1,X2,,Xn)Y=(Y1,Y2,,Yn)ρ^n=sxy/(sxsy)X . Entonces n 1 / 2 ρ n converge en distribución a una variable aleatoria normal estándar. Por "reescalado", me refiero a la multiplicación por n 1 / 2 que es lo que se requiere para obtener un degenerado limitar distribución no. Yn1/2ρ^nn1/2
cardenal

1
@ Richard, la esencia del "problema" es que al hacer dos restricciones (a) que las normas de cada fila son 1 y (b) que las entradas se generan a partir de una muestra aleatoria, necesariamente está forzando que las correlaciones sean bastante pequeña (del orden de . la razón es que no se puede tener arbitrariamente grandes correlaciones entre filas y aún así obtener las normas de cada fila para ser 1, en presencia de tanta independencia.n1/2
cardenal

1
... ahora, puede obtener correlaciones más grandes en magnitud al primero correlacionar las filas entre sí antes de renormalizar. Pero, esencialmente solo tiene un parámetro con el que jugar, por lo que tanto la media asintótica como la varianza estarán vinculadas a ese parámetro. Entonces, eso probablemente tampoco le dará la flexibilidad que parece desear.
cardenal

1
Xm×nXρρ^ijijXmnn1/2(ρ^ijρ)N(0,(1ρ2)2)

Respuestas:


5

Primero proporcioné lo que ahora creo que es una respuesta subóptima; Por lo tanto, edité mi respuesta para comenzar con una mejor sugerencia.


Usando el método de la vid

En este hilo: ¿Cómo generar eficientemente matrices aleatorias de correlación semidefinida positiva? - Describí y proporcioné el código para dos algoritmos eficientes de generación de matrices de correlación aleatorias. Ambos provienen de un artículo de Lewandowski, Kurowicka y Joe (2009).

Vea mi respuesta allí para ver muchas figuras y códigos de matlab. Aquí solo me gustaría decir que el método vine permite generar matrices de correlación aleatorias con cualquier distribución de correlaciones parciales (observe la palabra "parcial") y puede usarse para generar matrices de correlación con grandes valores fuera de la diagonal. Aquí está la figura relevante de ese hilo:

Método de la vid

±1

Elementos fuera de diagonal

Creo que estas distribuciones son razonablemente "normales", y uno puede ver cómo aumenta gradualmente la desviación estándar. Debo agregar que el algoritmo es muy rápido. Ver hilo vinculado para los detalles.


Mi respuesta original

Una modificación directa de su método podría hacer el truco (dependiendo de qué tan cerca desea que la distribución sea normal). Esta respuesta se inspiró en los comentarios de @ cardinal anteriores y en la respuesta de @ psarka a mi propia pregunta ¿Cómo generar una matriz de correlación aleatoria grande de rango completo con algunas correlaciones fuertes presentes?

XX1000×100[a/2,a/2]a=0,1,2,5a=0XX1/1000a>0aa=0,1,2,5

matrices de correlación aleatoria

Todas estas matrices son, por supuesto, definitivas positivas. Aquí está el código matlab:

offsets = [0 1 2 5];
n = 1000;
p = 100;

rng(42) %// random seed

figure
for offset = 1:length(offsets)
    X = randn(n,p);
    for i=1:p
        X(:,i) = X(:,i) + (rand-0.5) * offsets(offset);
    end
    C = 1/(n-1)*transpose(X)*X; %// covariance matrix (non-centred!)

    %// convert to correlation
    d = diag(C);
    C = diag(1./sqrt(d))*C*diag(1./sqrt(d));

    %// displaying C
    subplot(length(offsets),3,(offset-1)*3+1)
    imagesc(C, [-1 1])

    %// histogram of the off-diagonal elements
    subplot(length(offsets),3,(offset-1)*3+2)
    offd = C(logical(ones(size(C))-eye(size(C))));
    hist(offd)
    xlim([-1 1])

    %// QQ-plot to check the normality
    subplot(length(offsets),3,(offset-1)*3+3)
    qqplot(offd)

    %// eigenvalues
    eigv = eig(C);
    display([num2str(min(eigv),2) ' ... ' num2str(max(eigv),2)])
end

La salida de este código (valores propios mínimos y máximos) es:

0.51 ... 1.7
0.44 ... 8.6
0.32 ... 22
0.1 ... 48

¿Puedes graficar el valor de los valores propios más pequeños que obtienes usando este método junto con tus parcelas?
usuario603

1
Sin cambiar la figura, simplemente puedo escribir aquí que los valores propios más pequeños son 0.5, 0.4, 0.3 y 0.1 respectivamente (para cada fila de mi figura). Los más grandes crecen de 1.7 a 48.
ameba dice Reinstate Monica

pero, ¿son estos los valores propios de la matriz de correlación o los de X'X ?.
user603

C

No creo que sea imposible, simplemente no podía verlo desde el código (no había usado matlab durante años en este momento)
usuario603


1

Si está intentando generar matrices de correlación aleatorias, considere tomar muestras de la distribución Wishart. La siguiente pregunta proporciona información sobre la distribución de Wishart, así como consejos sobre cómo muestrear: ¿Cómo generar de manera eficiente matrices de correlación positiva-semidefinida al azar?


Pero, ¿se puede controlar la desviación estándar de los elementos fuera de la diagonal resultantes con parámetros de la distribución Wishart? ¿Si es así, cómo?
ameba dice Reinstate Monica

1

Esta no es una respuesta muy sofisticada, pero no puedo evitar pensar que sigue siendo una buena respuesta ...

Si su motivación es que los parámetros de correlación producidos por los datos de series temporales tienden a parecer normales, ¿por qué no simplemente simular datos de series temporales, calcular los parámetros de correlación y usarlos?

Es posible que tenga una buena razón para no hacer esto, pero su pregunta no me deja claro.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.