Saya memiliki 2 matriks korelasi dan (menggunakan koefisien korelasi linear Pearson melalui corrcoef Matlab () ). Saya ingin menghitung berapa banyak "lebih korelasi" berisi dibandingkan dengan . Apakah ada metrik atau tes standar untuk itu?
Misalnya matriks korelasi
mengandung "lebih banyak korelasi" daripada
Saya mengetahui Box M Test , yang digunakan untuk menentukan apakah dua atau lebih matriks kovarians sama (dan dapat digunakan untuk matriks korelasi juga karena yang terakhir sama dengan matriks kovarians dari variabel acak standar).
Saat ini saya sedang membandingkan dan melalui nilai rata-rata absolut dari elemen non-diagonal mereka, yaitu. (Saya menggunakan simetri matriks korelasi dalam rumus ini). Saya kira mungkin ada beberapa metrik yang lebih pintar.
Mengikuti komentar Andy W pada penentu matriks, saya menjalankan percobaan untuk membandingkan metrik:
- Berarti nilai absolut dari elemen non-diagonal mereka :
- Penentu matriks : :
Misalkan dan dua matriks simetris acak dengan yang ada pada diagonal dimensi . Segitiga atas (tidak termasuk diagonal) dari diisi dengan mengapung acak dari 0 hingga 1. Segitiga atas (tidak termasuk diagonal) dari diisi dengan pelampung acak dari 0 hingga 0,9. Saya menghasilkan 10.000 matriks seperti itu dan menghitung:
- 80,75% dari waktu
- 63,01% dari waktu
Mengingat hasilnya, saya akan cenderung berpikir bahwa adalah metrik yang lebih baik.
Kode 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
Contoh matriks simetrik acak dihasilkan dengan yang ada di 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