Bagaimana menghasilkan matriks korelasi acak yang memiliki sekitar entri off-diagonal yang terdistribusi normal dengan deviasi standar yang diberikan?

11

Saya ingin menghasilkan matriks korelasi acak sehingga distribusi elemen off-diagonal yang tampak kurang seperti biasa. Bagaimana saya bisa melakukannya?

Motivasinya adalah ini. Untuk satu set data deret waktu, distribusi korelasi sering terlihat cukup dekat dengan normal. Saya ingin menghasilkan banyak matriks korelasi "normal" untuk mewakili situasi umum dan menggunakannya untuk menghitung angka risiko.n


Saya tahu satu metode, tetapi standar deviasi yang dihasilkan (dari distribusi elemen off-diagonal) terlalu kecil untuk tujuan saya: menghasilkan seragam atau baris acak normal dari matriks X , membakukan baris (kurangi rata-rata, bagi dengan standar deviasi), maka sampel matriks korelasi 1nXtelah terdistribusi normal off-diagonal entri [Perbaruisetelah komentar: standar deviasi akan~n-1/2].1n1XXn1/2

Adakah yang bisa menyarankan metode yang lebih baik yang saya dapat mengontrol standar deviasi?

Richard
sumber
1
@ Richard, terima kasih atas pertanyaan Anda. Sayangnya, metode yang Anda jelaskan di atas tidak akan menghasilkan entri yang didistribusikan secara normal. Diagonal adalah 1 dengan probabilitas satu dan off-diagonal dibatasi antara dan + 1 . Sekarang, entri yang dihitung ulang akan konvergen asimtotik ke distribusi normal yang berpusat di sekitar nol. Bisakah Anda memberi kami informasi lebih lanjut tentang masalah yang sebenarnya ingin Anda selesaikan? Dan, mengapa Anda ingin "didistribusikan secara normal" diagonal? 1+1
kardinal
1
@ Richard, apa yang saya maksud adalah, misalkan dan Y = ( Y 1 , Y 2 , ... , Y n ) adalah dua vektor independen sehingga entri masing-masing iid standar normal. Hitung ρ n = s x y / ( s x s y ) ; yaitu, korelasi sampel antara X danX=(X1,X2,,Xn)Y=(Y1,Y2,,Yn)ρ^n=sxy/(sxsy)X . Lalu n 1 / 2 ρ n konvergen dalam distribusi ke variabel acak normal standar. Dengan "rescaled", saya berarti perkalian dengan n 1 / 2 yang merupakan apa yang diperlukan untuk mendapatkan merosot membatasi distribusi non. Yn1/2ρ^nn1/2
kardinal
1
@ Richard, inti dari "masalah" adalah bahwa dengan membuat dua batasan (a) bahwa norma dari setiap baris adalah 1 dan (b) bahwa entri dihasilkan dari sampel acak, Anda tentu memaksa korelasi menjadi cukup kecil (pada urutan Alasannya adalah bahwa Anda tidak dapat memiliki korelasi besar yang sewenang-wenang antara baris dan masih mendapatkan norma dari setiap baris menjadi 1 di hadapan begitu banyak kemerdekaan.n1/2
kardinal
1
... sekarang, Anda bisa mendapatkan korelasi yang lebih besar dalam besarnya dengan terlebih dahulu mengkorelasikan baris di antara mereka sendiri sebelum melakukan renormalisasi. Tapi, Anda pada dasarnya hanya memiliki satu parameter untuk dimainkan, sehingga rerata asimptotik dan varians akan dikaitkan dengan parameter itu. Jadi, itu mungkin juga tidak akan memberi Anda fleksibilitas yang tampaknya Anda inginkan.
kardinal
1
Tentu, mari kita ambil contoh sederhana. Sebutkan matrix yang dihasilkan , yang akan kita asumsikan sebagai m × n tanpa kehilangan sifat umum. Sekarang, menghasilkan kolom dari X sebagai iid vektor seperti bahwa unsur-unsur masing-masing vektor standar variabel acak normal yang equicorrelated dengan korelasi ρ . Sekarang, gunakan prosedur yang telah Anda lakukan. Mari ρ i j menyatakan korelasi sampel antara i th dan j th * baris * dari X . Kemudian untuk m tetap , membiarkan n ,Xm×nXρρ^ijijXmn konvergen dalam distribusi ke N ( 0 , ( 1 - ρ 2 ) 2 ) variabel acak. n1/2(ρ^ijρ)N(0,(1ρ2)2)
kardinal

Jawaban:

5

Saya pertama kali memberikan apa yang sekarang saya yakini sebagai jawaban yang kurang optimal; karena itu saya mengedit jawaban saya untuk memulai dengan saran yang lebih baik.


Menggunakan metode pokok anggur

Di utas ini: Bagaimana cara efisien menghasilkan matriks korelasi positif-semidefinit acak? - Saya menjelaskan dan menyediakan kode untuk dua algoritma yang efisien untuk menghasilkan matriks korelasi acak. Keduanya berasal dari sebuah makalah oleh Lewandowski, Kurowicka, dan Joe (2009).

Silakan lihat jawaban saya di sana untuk banyak angka dan kode matlab. Di sini saya hanya ingin mengatakan bahwa metode anggur memungkinkan untuk menghasilkan matriks korelasi acak dengan distribusi korelasi parsial (perhatikan kata "parsial") dan dapat digunakan untuk menghasilkan matriks korelasi dengan nilai off-diagonal yang besar. Berikut adalah angka yang relevan dari utas itu:

Metode anggur

±1

Elemen off-diagonal

Saya pikir distribusi ini cukup "normal", dan orang dapat melihat bagaimana standar deviasi meningkat secara bertahap. Saya harus menambahkan bahwa algoritma ini sangat cepat. Lihat utas terkait untuk detailnya.


Jawaban asli saya

Modifikasi langsung metode Anda dapat melakukan trik (tergantung pada seberapa dekat Anda ingin distribusi menjadi normal). Jawaban ini terinspirasi oleh komentar @ cardinal di atas dan oleh jawaban @ psarka untuk pertanyaan saya sendiri. Bagaimana cara menghasilkan matriks korelasi acak peringkat penuh yang besar dengan beberapa korelasi kuat yang ada?

XX1000×100[a/2,a/2]a=0,1,2,5a=0XX1/1000a>0aa=0,1,2,5

matriks korelasi acak

Semua matriks ini tentu saja pasti positif. Berikut ini adalah kode matlab:

offsets = [0 1 2 5];
n = 1000;
p = 100;

rng(42) %// random seed

figure
for offset = 1:length(offsets)
    X = randn(n,p);
    for i=1:p
        X(:,i) = X(:,i) + (rand-0.5) * offsets(offset);
    end
    C = 1/(n-1)*transpose(X)*X; %// covariance matrix (non-centred!)

    %// convert to correlation
    d = diag(C);
    C = diag(1./sqrt(d))*C*diag(1./sqrt(d));

    %// displaying C
    subplot(length(offsets),3,(offset-1)*3+1)
    imagesc(C, [-1 1])

    %// histogram of the off-diagonal elements
    subplot(length(offsets),3,(offset-1)*3+2)
    offd = C(logical(ones(size(C))-eye(size(C))));
    hist(offd)
    xlim([-1 1])

    %// QQ-plot to check the normality
    subplot(length(offsets),3,(offset-1)*3+3)
    qqplot(offd)

    %// eigenvalues
    eigv = eig(C);
    display([num2str(min(eigv),2) ' ... ' num2str(max(eigv),2)])
end

Output dari kode ini (nilai eigen minimum dan maksimum) adalah:

0.51 ... 1.7
0.44 ... 8.6
0.32 ... 22
0.1 ... 48
amuba kata Reinstate Monica
sumber
dapatkah Anda memplot nilai nilai eigen terkecil yang Anda peroleh menggunakan metode ini bersama plot Anda?
user603
1
Tanpa mengubah angka, saya cukup menulis di sini bahwa nilai eigen terkecil masing-masing adalah 0,5, 0,4, 0,3, dan 0,1 (untuk setiap baris gambar saya). Yang terbesar tumbuh dari 1,7 menjadi 48.
Amuba mengatakan Reinstate Monica
tetapi apakah ini nilai eigen dari matriks korelasi atau nilai X'X ?.
user603
C
Saya tidak berpikir itu tidak mungkin, saya hanya tidak bisa melihatnya dari kode (setelah tidak menggunakan matlab selama bertahun-tahun saat ini)
user603
1

Anda mungkin tertarik pada beberapa kode di tautan berikut:

Korelasi dan Co-integrasi

bill_080
sumber
1

Jika Anda mencoba untuk menghasilkan matriks korelasi acak, pertimbangkan pengambilan sampel dari distribusi Wishart. Pertanyaan berikut ini memberikan informasi distribusi Wishart serta saran tentang cara sampel: Bagaimana cara efisien menghasilkan matriks korelasi positif-semidefinit acak?

Rick
sumber
Tetapi dapatkah seseorang mengontrol deviasi standar dari elemen-elemen off-diagonal yang dihasilkan dengan parameter distribusi Wishart? Jika ya, bagaimana caranya?
Amuba mengatakan Reinstate Monica
1

Ini bukan jawaban yang sangat canggih, tetapi saya tidak dapat membantu tetapi berpikir itu masih jawaban yang bagus ...

Jika motivasi Anda adalah bahwa parameter korelasi yang dihasilkan oleh data deret waktu cenderung terlihat normal, mengapa tidak hanya mensimulasikan data deret waktu, hitung parameter korelasinya dan gunakan itu?

Anda mungkin punya alasan bagus untuk tidak melakukan ini, tetapi tidak jelas bagi saya dari pertanyaan Anda.

Cliff AB
sumber