Sebuah makalah Menghasilkan matriks korelasi acak berdasarkan tanaman merambat dan metode bawang yang diperluas oleh Lewandowski, Kurowicka, dan Joe (LKJ), 2009, memberikan pengobatan terpadu dan paparan dua metode yang efisien untuk menghasilkan matriks korelasi acak. Kedua metode memungkinkan untuk menghasilkan matriks dari distribusi yang seragam dalam arti tertentu yang didefinisikan di bawah ini, mudah diterapkan, cepat, dan memiliki keuntungan tambahan karena memiliki nama yang lucu.
Matriks simetris sungguhan ukuran dengan yang ada di diagonal memiliki elemen off-diagonal yang unik dan dengan demikian dapat ditentukan sebagai titik dalam . Setiap titik dalam ruang ini sesuai dengan matriks simetris, tetapi tidak semua dari mereka adalah positif-pasti (seperti matriks korelasi harus). Matriks korelasi membentuk subset dari (sebenarnya subset cembung yang terhubung), dan kedua metode dapat menghasilkan poin dari distribusi yang seragam pada subset ini.d ( d - 1 ) / 2 R d ( d - 1 ) / 2d× dd( d- 1 ) / 2Rd( d- 1 ) / 2Rd( d- 1 )/ 2
Saya akan memberikan implementasi MATLAB saya sendiri untuk setiap metode dan menggambarkannya dengan .d= 100
Metode bawang
Metode bawang berasal dari makalah lain (ref # 3 di LKJ) dan memiliki namanya dengan fakta bahwa matriks korelasi dihasilkan mulai dengan matriks dan menumbuhkannya kolom demi kolom dan baris demi baris. Distribusi yang dihasilkan seragam. Saya tidak begitu mengerti matematika di balik metode ini (dan lebih memilih metode kedua), tetapi inilah hasilnya:1 × 1
Di sini dan di bawah judul setiap subplot menunjukkan nilai eigen terkecil dan terbesar, dan penentu (produk dari semua nilai eigen). Ini kodenya:
%// ONION METHOD to generate random correlation matrices distributed randomly
function S = onion(d)
S = 1;
for k = 2:d
y = betarnd((k-1)/2, (d-k)/2); %// sampling from beta distribution
r = sqrt(y);
theta = randn(k-1,1);
theta = theta/norm(theta);
w = r*theta;
[U,E] = eig(S);
R = U*E.^(1/2)*U'; %// R is a square root of S
q = R*w;
S = [S q; q' 1]; %// increasing the matrix size
end
end
Metode bawang merah yang diperluas
LKJ memodifikasi metode ini sedikit, agar dapat mengambil sampel matriks korelasi dari distribusi yang sebanding dengan . Semakin besar , semakin besar akan menjadi penentu, yang berarti bahwa matriks korelasi yang dihasilkan akan semakin mendekati matriks identitas. Nilai sesuai dengan distribusi seragam. Pada gambar di bawah ini, matriks dihasilkan dengan . [ d e tC η η = 1 η = 1 , 10 , 100 , 1000 , 10[ D e tC ]η- 1ηη= 1η= 1 , 10 , 100 , 1000 , 10000 , 100000
Untuk beberapa alasan untuk mendapatkan determinan dengan urutan yang sama besarnya seperti pada metode bawang vanili, saya perlu meletakkan dan bukan (seperti yang diklaim oleh LKJ). Tidak yakin di mana kesalahannya.η = 1η= 0η= 1
%// EXTENDED ONION METHOD to generate random correlation matrices
%// distributed ~ det(S)^eta [or maybe det(S)^(eta-1), not sure]
function S = extendedOnion(d, eta)
beta = eta + (d-2)/2;
u = betarnd(beta, beta);
r12 = 2*u - 1;
S = [1 r12; r12 1];
for k = 3:d
beta = beta - 1/2;
y = betarnd((k-1)/2, beta);
r = sqrt(y);
theta = randn(k-1,1);
theta = theta/norm(theta);
w = r*theta;
[U,E] = eig(S);
R = U*E.^(1/2)*U';
q = R*w;
S = [S q; q' 1];
end
end
Metode anggur
Metode Vine pada awalnya disarankan oleh Joe (J dalam LKJ) dan ditingkatkan oleh LKJ. Saya lebih menyukainya, karena secara konsep lebih mudah dan juga lebih mudah untuk dimodifikasi. Idenya adalah untuk menghasilkan korelasi parsial (mereka independen dan dapat memiliki nilai dari tanpa kendala) dan kemudian mengubahnya menjadi korelasi mentah melalui rumus rekursif. Lebih mudah mengatur komputasi dalam urutan tertentu, dan grafik ini dikenal sebagai "anggur". Yang penting, jika korelasi parsial diambil dari distribusi beta tertentu (berbeda untuk sel yang berbeda dalam matriks), maka matriks yang dihasilkan akan didistribusikan secara seragam. Di sini, LKJ memperkenalkan parameter tambahan untuk sampel dari distribusi yang proporsional[ - 1 , 1 ] η [ d e td( d- 1 ) / 2[ - 1 , 1 ]η[ D e tC ]η- 1 . Hasilnya identik dengan bawang merah yang diperluas:
%// VINE METHOD to generate random correlation matrices
%// distributed ~ det(S)^eta [or maybe det(S)^(eta-1), not sure]
function S = vine(d, eta)
beta = eta + (d-1)/2;
P = zeros(d); %// storing partial correlations
S = eye(d);
for k = 1:d-1
beta = beta - 1/2;
for i = k+1:d
P(k,i) = betarnd(beta,beta); %// sampling from beta
P(k,i) = (P(k,i)-0.5)*2; %// linearly shifting to [-1, 1]
p = P(k,i);
for l = (k-1):-1:1 %// converting partial correlation to raw correlation
p = p * sqrt((1-P(l,i)^2)*(1-P(l,k)^2)) + P(l,i)*P(l,k);
end
S(k,i) = p;
S(i,k) = p;
end
end
end
Metode Vine dengan pengambilan sampel manual korelasi parsial
Seperti yang dapat dilihat di atas, distribusi yang seragam menghasilkan matriks korelasi yang hampir diagonal. Tetapi orang dapat dengan mudah memodifikasi metode anggur untuk memiliki korelasi yang lebih kuat (ini tidak dijelaskan dalam makalah LKJ, tetapi langsung): untuk yang ini harus sampel korelasi parsial dari distribusi yang terkonsentrasi sekitar . Di bawah ini saya sampel dari distribusi beta (dihitung ulang dari menjadi ) dengan . Semakin kecil parameter distribusi beta, semakin terkonsentrasi di dekat tepi.[ 0 , 1 ] [ - 1 , 1 ] α = β = 50 , 20 , 10 , 5 , 2± 1[ 0 , 1 ][ - 1 , 1 ]α = β= 50 , 20 , 10 , 5 , 2 , 1
Perhatikan bahwa dalam hal ini distribusi tidak dijamin sebagai permutasi invarian, jadi saya juga secara acak mengubah baris dan kolom setelah generasi.
%// VINE METHOD to generate random correlation matrices
%// with all partial correlations distributed ~ beta(betaparam,betaparam)
%// rescaled to [-1, 1]
function S = vineBeta(d, betaparam)
P = zeros(d); %// storing partial correlations
S = eye(d);
for k = 1:d-1
for i = k+1:d
P(k,i) = betarnd(betaparam,betaparam); %// sampling from beta
P(k,i) = (P(k,i)-0.5)*2; %// linearly shifting to [-1, 1]
p = P(k,i);
for l = (k-1):-1:1 %// converting partial correlation to raw correlation
p = p * sqrt((1-P(l,i)^2)*(1-P(l,k)^2)) + P(l,i)*P(l,k);
end
S(k,i) = p;
S(i,k) = p;
end
end
%// permuting the variables to make the distribution permutation-invariant
permutation = randperm(d);
S = S(permutation, permutation);
end
Berikut adalah bagaimana histogram elemen off-diagonal mencari matriks di atas (varians dari distribusi meningkat secara monoton):
Pembaruan: menggunakan faktor acak
Salah satu metode yang sangat sederhana untuk menghasilkan matriks korelasi acak dengan beberapa korelasi kuat digunakan dalam jawaban oleh @ shabbychef, dan saya ingin mengilustrasikannya di sini juga. Idenya adalah untuk secara acak menghasilkan beberapa ( ) loadings faktor (matriks acak ukuran ), membentuk matriks kovarians (yang tentu saja tidak akan peringkat penuh ) dan tambahkan padanya matriks diagonal acak dengan elemen positif untuk membuat peringkat penuh. Matriks kovarians yang dihasilkan dapat dinormalisasi menjadi matriks korelasi, dengan membiarkank < dWk × dW W⊤DB = W W⊤+ DC = E- 1 / 2B E- 1 / 2, Di mana adalah matriks diagonal dengan diagonal yang sama seperti . Ini sangat sederhana dan bermanfaat. Berikut adalah beberapa contoh matriks korelasi untuk :EBk = 100 , 50 , 20 , 10 , 5 , 1
Dan kodenya:
%// FACTOR method
function S = factor(d,k)
W = randn(d,k);
S = W*W' + diag(rand(1,d));
S = diag(1./sqrt(diag(S))) * S * diag(1./sqrt(diag(S)));
end
Berikut adalah kode pembungkus yang digunakan untuk menghasilkan angka:
d = 100; %// size of the correlation matrix
figure('Position', [100 100 1100 600])
for repetition = 1:6
S = onion(d);
%// etas = [1 10 100 1000 1e+4 1e+5];
%// S = extendedOnion(d, etas(repetition));
%// S = vine(d, etas(repetition));
%// betaparams = [50 20 10 5 2 1];
%// S = vineBeta(d, betaparams(repetition));
subplot(2,3,repetition)
%// use this to plot colormaps of S
imagesc(S, [-1 1])
axis square
title(['Eigs: ' num2str(min(eig(S)),2) '...' num2str(max(eig(S)),2) ', det=' num2str(det(S),2)])
%// use this to plot histograms of the off-diagonal elements
%// offd = S(logical(ones(size(S))-eye(size(S))));
%// hist(offd)
%// xlim([-1 1])
end