Eu tenho 2 matrizes de correlação e B (usando o coeficiente de correlação linear de Pearson através do corrcoef de Matlab () ). Gostaria de quantificar quanto "mais correlação" A contém comparação com B . Existe alguma métrica ou teste padrão para isso?
Por exemplo, a matriz de correlação
contém "mais correlação" que
Estou ciente do Teste M de Box , que é usado para determinar se duas ou mais matrizes de covariância são iguais (e podem ser usadas para matrizes de correlação, já que estas são as mesmas que as matrizes de covariância de variáveis aleatórias padronizadas).
No momento, estou comparando e B através da média dos valores absolutos de seus elementos não diagonais, ou seja, 2. (Eu uso a simetria da matriz de correlação nesta fórmula). Eu acho que pode haver algumas métricas mais inteligentes.
Após o comentário de Andy W sobre o determinante da matriz, realizei um experimento para comparar as métricas:
- Média dos valores absolutos dos seus elementos não diagonais : média
- Determinante Matrix : :
Deixe e B duas matrizes simétricas aleatórias com as na diagonal da dimensão 10 × 10 . O triângulo superior (diagonal excluída) de A é preenchido com flutuadores aleatórios de 0 a 1. O triângulo superior (diagonal excluída) de B é preenchido com flutuadores aleatórios de 0 a 0,9. Eu gero 10000 tais matrizes e faço algumas contagens:
- 80,75% das vezes
- 63,01% do tempo
Dado o resultado, eu tenderia a pensar que a média é uma métrica melhor.
Código 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
Exemplo de uma matriz simétrica aleatória 10 × gerada com uma na 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
fonte
Respostas:
O determinante da covariância não é uma idéia terrível, mas você provavelmente deseja usar o inverso do determinante. Imagine os contornos (linhas de igual densidade de probabilidade) de uma distribuição bivariada. Você pode pensar no determinante como (aproximadamente) medir o volume de um determinado contorno. Então, um conjunto de variáveis altamente correlacionadas realmente tem menos volume, porque os contornos são muito esticados.
Como qualquer par de variáveis se torna quase linearmente dependente, o determinante se aproxima de zero, pois é o produto dos autovalores da matriz de correlação. Portanto, o determinante pode não ser capaz de distinguir entre um único par de variáveis quase dependentes, em oposição a muitos pares, e é improvável que esse seja o comportamento que você deseja. Eu sugeriria simular esse cenário. Você poderia usar um esquema como este:
Então rho terá uma classificação aproximada r, que determina quantas variáveis quase linearmente independentes você possui. Você pode ver como o determinante reflete a classificação aproximada re a escala s.
fonte