J'ai 2 matrices de corrélation et (en utilisant le coefficient de corrélation linéaire de Pearson via corrcoef () de Matlab ). Je voudrais quantifier combien « plus de corrélation » contient par rapport à . Existe-t-il une métrique standard ou un test pour cela?
Par exemple, la matrice de corrélation
contient "plus de corrélation" que
Je connais le test M de Box , qui est utilisé pour déterminer si deux ou plusieurs matrices de covariance sont égales (et peuvent également être utilisées pour les matrices de corrélation puisque ces dernières sont les mêmes que les matrices de covariance des variables aléatoires normalisées).
En ce moment, je compare et via la moyenne des valeurs absolues de leurs éléments non diagonaux, c'est-à-dire. (J'utilise la symétrie de la matrice de corrélation dans cette formule). Je suppose qu'il pourrait y avoir des mesures plus intelligentes.
Suite au commentaire d'Andy W sur le déterminant de la matrice, j'ai mené une expérience pour comparer les métriques:
- Moyenne des valeurs absolues de leurs éléments non diagonaux :
- Déterminant de la matrice : :
Soit et deux matrices symétriques aléatoires avec celles sur la diagonale de dimension . Le triangle supérieur (diagonale exclue) de est peuplé de flotteurs aléatoires de 0 à 1. Le triangle supérieur (diagonal exclu) de est peuplé de flotteurs aléatoires de 0 à 0,9. Je génère 10000 matrices de ce type et je compte:
- 80,75% du temps
- 63,01% du temps
Étant donné le résultat, j'aurais tendance à penser que est une meilleure métrique.
Code 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
Exemple d'une matrice symétrique aléatoire générée avec celles sur la diagonale:
>> 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
la source
Réponses:
Le déterminant de la covariance n'est pas une idée terrible, mais vous voudrez probablement utiliser l' inverse du déterminant. Imaginez les contours (lignes de densité de probabilité égale) d'une distribution bivariée. Vous pouvez considérer le déterminant comme mesurant (approximativement) le volume d'un contour donné. Ensuite, un ensemble de variables hautement corrélées a en fait moins de volume, car les contours sont tellement étirés.
Par exemple: Si et , où , alors donc donc le déterminant est . En revanche, si sont indépendants , alors le déterminant est 1.X∼N(0,1) Y=X+ϵ ϵ∼N(0,.01)
Comme toute paire de variables devient de plus en plus dépendante linéairement, le déterminant se rapproche de zéro, car il est le produit des valeurs propres de la matrice de corrélation. Ainsi, le déterminant peut ne pas être en mesure de faire la distinction entre une seule paire de variables presque dépendantes, par opposition à de nombreuses paires, et il est peu probable que ce soit un comportement que vous désirez. Je suggérerais de simuler un tel scénario. Vous pouvez utiliser un schéma comme celui-ci:
Alors rho aura un rang r approximatif, qui détermine le nombre de variables indépendantes presque linéairement que vous avez. Vous pouvez voir comment le déterminant reflète le rang approximatif r et l'échelle s.
la source