Quantificando quanto "mais correlação" uma matriz de correlação A contém em comparação com uma matriz de correlação B

9

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?ABAB

Por exemplo, a matriz de correlação

insira a descrição da imagem aqui

contém "mais correlação" que

insira a descrição da imagem aqui

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, 2AB. (Eu uso a simetria da matriz de correlação nesta fórmula). Eu acho que pode haver algumas métricas mais inteligentes.2n2n1i<jn|xi,j|


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 metricmean()
  • Determinante Matrix : :metricdeterminant()

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:AB10×10AB

  • 80,75% das vezesmetricmean(B)metricmean(A)
  • 63,01% do tempometricdeterminant(B)metricdeterminant(A)

Dado o resultado, eu tenderia a pensar que a média é uma métrica melhor.metricmean(B)

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:10×10

>> 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
Franck Dernoncourt
fonte
2
Por curiosidade, que tipo de pergunta você está tentando responder com isso?
shadowtalker
1
O determinante da matriz pode ser considerado o volume da matriz no espaço multidimensional. Isso pode ser ruim se você tiver matrizes de correlação mal condicionadas.
Andy W
1
@ AndyW Obrigado, é uma ótima idéia, eu fiz alguns testes (veja a pergunta atualizada), o determinante da matriz parece ser um pouco menos preciso que a média.
Franck Dernoncourt
2
@FranckDernoncourt, não está claro para mim se as matrizes simétricas que você está simulando são necessariamente positivas. Eles sempre têm autovalores positivos?
Andrew M

Respostas:

3

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.

XN(0,1)Y=X+ϵϵN(0,.01)

Cov(X,Y)=[1111.01]
Corr(X,Y)[1.995.9951]
.0099X,YN(0,1)

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:

  1. Corrija uma dimensão P, uma classificação aproximada r, e seja uma constante grande
  2. Sejam A [1], ..., A [r] vetores aleatórios, extraídos iid da distribuição de N (0, s)
  3. Definir Sigma = Identidade (P)
  4. Para i = 1..r: Sigma = Sigma + A [i] * A [i] ^ T
  5. Defina rho como Sigma dimensionado como uma matriz de correlação

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.

Andrew M
fonte