Ich habe 2 Korrelationsmatrizen und (unter Verwendung des linearen Korrelationskoeffizienten nach Pearson durch Matlab's corrcoef () ). Ich möchte quantifizieren, wie viel "mehr Korrelation" Vergleich zu enthält . Gibt es dafür eine Standardmetrik oder einen Standardtest?B.B.
ZB die Korrelationsmatrix
enthält "mehr Korrelation" als
Mir ist der M-Test der Box bekannt , mit dem bestimmt wird, ob zwei oder mehr Kovarianzmatrizen gleich sind (und der auch für Korrelationsmatrizen verwendet werden kann, da letztere mit den Kovarianzmatrizen standardisierter Zufallsvariablen identisch sind).
Im Moment vergleiche ich und über den Mittelwert der Absolutwerte ihrer nicht diagonalen Elemente, dh. (Ich verwende die Symmetrie der Korrelationsmatrix in dieser Formel). Ich denke, dass es einige klügere Metriken geben könnte.B 2
Nach dem Kommentar von Andy W zur Matrixdeterminante führte ich ein Experiment durch, um die Metriken zu vergleichen:
- Mittelwert der absoluten Werte ihrer nicht diagonalen Elemente :
- Matrixdeterminante : :
Sei und zwei zufällige symmetrische Matrix mit Einsen auf der Diagonale der Dimension . Das obere Dreieck (diagonal ausgeschlossen) von ist mit zufälligen Gleitkommazahlen von 0 bis 1 gefüllt. Das obere Dreieck (diagonal ausgeschlossen) von ist mit zufälligen Gleitkommazahlen von 0 bis 0,9 besetzt. Ich generiere 10000 solcher Matrizen und zähle:B 10 × 10 A B.
- 80,75% der Zeit
- 63,01% der Zeit
Angesichts des Ergebnisses würde ich eher denken, dass eine bessere Metrik ist.
Matlab-Code:
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
Beispiel einer erzeugten zufälligen symmetrischen Matrix mit Einsen auf der 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
quelle
Antworten:
Die Determinante der Kovarianz ist keine schreckliche Idee, aber Sie möchten wahrscheinlich die Umkehrung der Determinante verwenden. Stellen Sie sich die Konturen (Linien gleicher Wahrscheinlichkeitsdichte) einer bivariaten Verteilung vor. Sie können sich die Determinante als (ungefähr) Messung des Volumens einer bestimmten Kontur vorstellen. Dann hat ein stark korrelierter Satz von Variablen tatsächlich weniger Volumen, weil die Konturen so gedehnt sind.
Wenn ein Variablenpaar nahezu linear abhängig wird, nähert sich die Determinante Null, da sie das Produkt der Eigenwerte der Korrelationsmatrix ist. Daher kann die Determinante im Gegensatz zu vielen Paaren möglicherweise nicht zwischen einem einzelnen Paar nahezu abhängiger Variablen unterscheiden, und es ist unwahrscheinlich, dass dies ein von Ihnen gewünschtes Verhalten ist. Ich würde vorschlagen, ein solches Szenario zu simulieren. Sie könnten ein Schema wie das folgende verwenden:
Dann hat rho den ungefähren Rang r, der bestimmt, wie viele nahezu linear unabhängige Variablen Sie haben. Sie können sehen, wie die Determinante den ungefähren Rang r und die Skalierung s widerspiegelt.
quelle