Tengo 2 matrices de correlación y (utilizando el coeficiente de correlación lineal de Pearson a través de corrcoef de Matlab () ). Me gustaría cuantificar cuánto "más correlación" contiene en comparación con . ¿Hay alguna medida estándar o prueba para eso?
Por ejemplo, la matriz de correlación
contiene "más correlación" que
Soy consciente de la prueba M de Box , que se usa para determinar si dos o más matrices de covarianza son iguales (y también se puede usar para matrices de correlación, ya que estas últimas son las mismas que las matrices de covarianza de variables aleatorias estandarizadas).
Ahora mismo estoy comparando y a través de la media de los valores absolutos de sus elementos no diagonales, es decir . (Utilizo la simetría de la matriz de correlación en esta fórmula). Supongo que podría haber algunas métricas más inteligentes.
Siguiendo el comentario de Andy W sobre el determinante de la matriz, realicé un experimento para comparar las métricas:
- Media de los valores absolutos de sus elementos no diagonales :
- Determinante matricial ::
Dejar y dos matrices simétricas aleatorias con unas en la diagonal de la dimensión . El triángulo superior (diagonal excluida) de se rellena con flotantes aleatorios de 0 a 1. El triángulo superior (excluida la diagonal) de se rellena con flotantes aleatorios de 0 a 0.9. Genero 10.000 matrices de este tipo y cuento:
- 80.75% del tiempo
- 63.01% del tiempo
Dado el resultado, tendería a pensar que Es una mejor métrica.
Código de Matlab:
function [ ] = correlation_metric( )
%CORRELATION_METRIC Test some metric for
% http://stats.stackexchange.com/q/110416/12359 :
% I have 2 correlation matrices A and B (using the Pearson's linear
% correlation coefficient through Matlab's corrcoef()).
% I would like to quantify how much "more correlation"
% A contains compared to B. Is there any standard metric or test for that?
% Experiments' parameters
runs = 10000;
matrix_dimension = 10;
%% Experiment 1
results = zeros(runs, 3);
for i=1:runs
dimension = matrix_dimension;
M = generate_random_symmetric_matrix( dimension, 0.0, 1.0 );
results(i, 1) = abs(det(M));
% results(i, 2) = mean(triu(M, 1));
results(i, 2) = mean2(M);
% results(i, 3) = results(i, 2) < results(i, 2) ;
end
mean(results(:, 1))
mean(results(:, 2))
%% Experiment 2
results = zeros(runs, 6);
for i=1:runs
dimension = matrix_dimension;
M = generate_random_symmetric_matrix( dimension, 0.0, 1.0 );
results(i, 1) = abs(det(M));
results(i, 2) = mean2(M);
M = generate_random_symmetric_matrix( dimension, 0.0, 0.9 );
results(i, 3) = abs(det(M));
results(i, 4) = mean2(M);
results(i, 5) = results(i, 1) > results(i, 3);
results(i, 6) = results(i, 2) > results(i, 4);
end
mean(results(:, 5))
mean(results(:, 6))
boxplot(results(:, 1))
figure
boxplot(results(:, 2))
end
function [ random_symmetric_matrix ] = generate_random_symmetric_matrix( dimension, minimum, maximum )
% Based on http://www.mathworks.com/matlabcentral/answers/123643-how-to-create-a-symmetric-random-matrix
d = ones(dimension, 1); %rand(dimension,1); % The diagonal values
t = triu((maximum-minimum)*rand(dimension)+minimum,1); % The upper trianglar random values
random_symmetric_matrix = diag(d)+t+t.'; % Put them together in a symmetric matrix
end
Ejemplo de un generado matriz simétrica aleatoria con unos en la diagonal:
>> random_symmetric_matrix
random_symmetric_matrix =
1.0000 0.3984 0.1375 0.4372 0.2909 0.6172 0.2105 0.1737 0.2271 0.2219
0.3984 1.0000 0.3836 0.1954 0.5077 0.4233 0.0936 0.2957 0.5256 0.6622
0.1375 0.3836 1.0000 0.1517 0.9585 0.8102 0.6078 0.8669 0.5290 0.7665
0.4372 0.1954 0.1517 1.0000 0.9531 0.2349 0.6232 0.6684 0.8945 0.2290
0.2909 0.5077 0.9585 0.9531 1.0000 0.3058 0.0330 0.0174 0.9649 0.5313
0.6172 0.4233 0.8102 0.2349 0.3058 1.0000 0.7483 0.2014 0.2164 0.2079
0.2105 0.0936 0.6078 0.6232 0.0330 0.7483 1.0000 0.5814 0.8470 0.6858
0.1737 0.2957 0.8669 0.6684 0.0174 0.2014 0.5814 1.0000 0.9223 0.0760
0.2271 0.5256 0.5290 0.8945 0.9649 0.2164 0.8470 0.9223 1.0000 0.5758
0.2219 0.6622 0.7665 0.2290 0.5313 0.2079 0.6858 0.0760 0.5758 1.0000
fuente
Respuestas:
El determinante de la covarianza no es una idea terrible, pero probablemente desee utilizar el inverso del determinante. Imagine los contornos (líneas de igual densidad de probabilidad) de una distribución bivariada. Puede pensar en el determinante como (aproximadamente) medir el volumen de un contorno dado. Entonces, un conjunto de variables altamente correlacionadas en realidad tiene menos volumen, porque los contornos están tan estirados.
Por ejemplo: siX∼ N( 0 , 1 ) y Y= X+ ϵ , dónde ϵ ∼ N( 0 , .01 ) , entonces
A medida que cualquier par de variables se vuelve más linealmente dependiente, el determinante se acerca a cero, ya que es el producto de los valores propios de la matriz de correlación. Por lo tanto, el determinante puede no ser capaz de distinguir entre un solo par de variables casi dependientes, a diferencia de muchos pares, y es poco probable que sea un comportamiento que desee. Sugeriría simular tal escenario. Podrías usar un esquema como este:
Entonces rho tendrá un rango aproximado r, que determina cuántas variables casi linealmente independientes tiene. Puede ver cómo el determinante refleja el rango aproximado r y la escala s.
fuente