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