Saya ingin menghasilkan korelasi matriks acak dari ukuran sehingga ada beberapa korelasi cukup kuat hadir: n × n
- matriks simetris nyata persegi ukuran , dengan mis ;n = 100
- positif-pasti, yaitu dengan semua nilai eigen nyata dan positif;
- peringkat penuh;
- semua elemen diagonal sama dengan ;
- elemen off-diagonal harus terdistribusi secara merata pada . Distribusi yang tepat tidak masalah, tetapi saya ingin memiliki jumlah yang cukup besar (misalnya ) dari nilai yang cukup besar (misalnya dengan nilai absolut atau lebih tinggi). Pada dasarnya saya ingin memastikan bahwa adalah tidak hampir diagonal dengan semua elemen off-diagonal .10 % 0,5 C
Apakah ada cara sederhana untuk melakukannya?
Tujuannya adalah untuk menggunakan matriks acak semacam itu untuk membandingkan beberapa algoritma yang bekerja dengan matriks korelasi (atau kovarians).
Metode yang tidak berfungsi
Berikut adalah beberapa cara untuk menghasilkan matriks korelasi acak yang saya ketahui, tetapi itu tidak berfungsi untuk saya di sini:
Menghasilkan acak dari ukuran, pusat, standarisasi dan membentuk matriks korelasi . Jika , ini umumnya akan menghasilkan semua korelasi off-diagonal menjadi sekitar . Jika , beberapa korelasi akan kuat, tetapi tidak akan peringkat penuh. s × ns>n0s≪nC
Hasilkan matriks pasti positif acak dalam salah satu cara berikut:
Hasilkan kuadrat acak dan buat pasti positif simetris .B = A A ⊤
Hasilkan kuadrat acak , buat simetris , dan jadikan positif dengan melakukan eigen-dekomposisi dan mengatur semua nilai eigen negatif ke nol: . NB: ini akan menghasilkan matriks yang kekurangan peringkat.E = A + A ⊤ E = U S U ⊤ B = U
Hasilkan ortogonal acak (misalnya dengan menghasilkan kuadrat acak dan melakukan dekomposisi QR-nya, atau melalui proses Gram-Schmidt) dan random diagonal dengan semua elemen positif; bentuk .
Matriks yang diperoleh dapat dengan mudah dinormalisasi untuk memiliki semua yang ada di diagonal: , di mana adalah matriks diagonal dengan diagonal yang sama seperti . Ketiga cara yang tercantum di atas untuk menghasilkan menghasilkan memiliki elemen off-diagonal tutup .
Pembaruan: Utas yang lebih lama
Setelah memposting pertanyaan saya, saya menemukan dua duplikat di masa lalu:
- Bagaimana menghasilkan matriks korelasi acak yang memiliki entri off-diagonal yang terdistribusi normal dengan deviasi standar yang diberikan?
- Bagaimana cara secara efisien menghasilkan matriks korelasi positif-semidefinit acak?
Sayangnya, tidak ada utas ini yang berisi jawaban yang memuaskan (sampai sekarang :)
sumber
nXk
matriks pemuatan W, tidak sepenuhnya acak tetapi yang kita inginkan (itu akanWW'+diag(noise)
,, mendefinisikan matriks cov yang kita cari. Satu-satunya tugas adalah untuk memperbaiki kolom-dinormalisasi W (yaitu k "vektor eigen") untuk menjadi ortogonal. Metode apa pun untukJawaban:
Jawaban lain muncul dengan trik yang bagus untuk menyelesaikan masalah saya dengan berbagai cara. Namun, saya menemukan pendekatan berprinsip yang menurut saya memiliki keuntungan besar karena secara konsep sangat jelas dan mudah disesuaikan.
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), bahwa @ssdecontrol disebut dalam komentar di atas (terima kasih banyak!).
Silakan lihat jawaban saya di sana banyak angka, penjelasan, dan kode matlab. Metode yang disebut "anggur" memungkinkan untuk menghasilkan matriks korelasi acak dengan distribusi korelasi parsial dan dapat digunakan untuk menghasilkan matriks korelasi dengan nilai off-diagonal yang besar. Berikut ini contoh gambar dari utas itu:
Satu-satunya hal yang berubah di antara subplot, adalah satu parameter yang mengontrol seberapa banyak distribusi korelasi parsial terkonsentrasi di sekitar±1 .
Saya menyalin kode saya untuk menghasilkan matriks ini di sini juga, untuk menunjukkan bahwa itu tidak lebih dari metode lain yang disarankan di sini. Silakan lihat jawaban tertaut saya untuk beberapa penjelasan. Nilai50,20,10,5,2,1 100
betaparam
untuk gambar di atas adalah (dan dimensi adalah 100 ).d
Perbarui: nilai eigen
@psarka bertanya tentang nilai eigen dari matriks ini. Pada gambar di bawah ini saya plot spektrum nilai eigen dari enam matriks korelasi yang sama seperti di atas. Perhatikan bahwa mereka menurun secara bertahap; sebaliknya, metode yang disarankan oleh @psarka umumnya menghasilkan matriks korelasi dengan satu nilai eigen besar, tetapi sisanya cukup seragam.
Memperbarui. Metode yang sangat sederhana: beberapa faktor
Mirip dengan apa yang ditulis @ttnphns dalam komentar di atas dan @GottfriedHelms dalam jawabannya, satu cara yang sangat sederhana untuk mencapai tujuan saya adalah dengan secara acak menghasilkan beberapa ( ) pemuatan faktor W (matriks acak ukuran k × n ), membentuk matriks kovarian W W ⊤ (yang tentu saja tidak akan peringkat penuh) dan menambahkannya matriks diagonal acak D dengan elemen positif untuk membuat B = W W ⊤ + Dk<n W k × n WW⊤ D B=WW⊤+D peringkat penuh. Matriks kovarians yang dihasilkan dapat dinormalisasi menjadi matriks korelasi (seperti yang dijelaskan dalam pertanyaan saya). Ini sangat sederhana dan bermanfaat. Berikut adalah beberapa contoh matriks korelasi untuk :k=100,50,20,10,5,1
Satu-satunya downside adalah bahwa matriks yang dihasilkan akan memiliki nilai eigen besar dan kemudian penurunan tiba-tiba, yang bertentangan dengan pembusukan bagus yang ditunjukkan di atas dengan metode anggur. Berikut adalah spektrum yang sesuai:k
Ini kodenya:
sumber
W
adalah orthogonal (yaitu cosinus di antara mereka adalah 0). Cukup menghasilkan acakW
tentu saja tidak menyediakannya. Jika mereka tidak ortogonal - yaitu faktor-faktor yang miring (sebut kemudianW
sebagaiW_
) - teorema faktor tidakWW'
tetapiW_CW_'
denganC
menjadi "korelasi" (cosinus) antara faktor-faktor. Sekarang,C=Q'Q
denganQ
menjadi matriks rotasi nonorthogonal dari rotasiW_=inv(Q)'W
(dan sebagainyaW=W_Q'
). Hasilkan beberapaQ
- sebuah matriks dengan kolom ss = 1 dan matriks ss = ukuran matriks.W_=inv(Q)'W
, tentu sajaW_= W inv(Q)'
.W = replicate(k, rnorm(d)); S = W%*%t(W) + diag(rnorm(d),nrow=d); S = diag(1/sqrt(diag(S)))%*%S%*%diag(1/sqrt(diag(S)))
S <- matrix(nearPD(S, corr = TRUE, keepDiag = TRUE)$mat@x,ncol(S),ncol(S))
sumber
crs
Hmm, setelah saya melakukan contoh dalam bahasa MatMate saya, saya melihat bahwa sudah ada jawaban python, yang mungkin lebih disukai karena python banyak digunakan. Tetapi karena Anda masih memiliki pertanyaan, saya menunjukkan kepada Anda pendekatan saya menggunakan bahasa Matmate-matrix, mungkin itu lebih mandiri.
Metode 1
(Menggunakan MatMate):
Masalahnya di sini mungkin, bahwa kita mendefinisikan blok-blok submatrices yang memiliki korelasi tinggi di dalam dengan sedikit korelasi di antara dan ini tidak terprogram tetapi dengan konatenasi-ekspresi konstan. Mungkin pendekatan ini bisa dimodelkan dengan lebih elegan dalam python.
Metode 2 (a)
Setelah itu, ada pendekatan yang sama sekali berbeda, di mana kita mengisi kemungkinan kovarian yang tersisa dengan jumlah acak 100 persen ke dalam matriks faktor-pembebanan. Ini dilakukan di Pari / GP:
dan matriks korelasi yang dihasilkan adalah
Mungkin ini menghasilkan matriks korelasi dengan komponen utama yang dominan karena aturan pembangkit kumulatif untuk matriks faktor-pembebanan. Juga mungkin lebih baik untuk memastikan kepastian positif dengan membuat bagian terakhir dari varians sebagai faktor unik. Saya meninggalkannya di program untuk tetap fokus pada prinsip umum.
Matriks korelasi 100x100 memiliki frekuensi korelasi berikut (dibulatkan ke 1 tempat des)
[memperbarui]. Hmm, matriks 100x100 dikondisikan dengan buruk; Pari / GP tidak dapat menentukan nilai eigen dengan benar dengan polroot (charpoly ()) - berfungsi bahkan dengan presisi 200 digit. Saya telah melakukan rotasi Jacobi ke pca-form pada loadingsmatrix L dan menemukan nilai eigen yang sangat kecil, mencetaknya dalam logaritma ke basis 10 (yang secara kasar memberikan posisi titik desimal). Baca dari kiri ke kanan lalu baris demi baris:
[pembaruan 2]
Metode 2 (b)
Peningkatan mungkin untuk meningkatkan varians spesifik item ke beberapa level non-marginal dan mengurangi ke sejumlah faktor umum yang cukup kecil (misalnya integer-squareroot dari itemnumber):
Struktur hasilnya
dalam hal distribusi korelasi:
tetap serupa (juga dekomposabilitas buruk oleh PariGP), tetapi nilai eigen, ketika ditemukan oleh rotasi jacobi dari loadingsmatrix, sekarang memiliki struktur yang lebih baik, untuk contoh yang baru dihitung saya mendapatkan nilai eigen sebagai
sumber
sumber
R memiliki paket (clusterGeneration) yang mengimplementasikan metode dalam:
Contoh:
Sayangnya, sepertinya tidak mungkin untuk mensimulasikan korelasi yang mengikuti distribusi seragam-ish dengan ini. Tampaknya membuat korelasi yang lebih kuat ketika
alphad
diatur ke nilai yang sangat kecil, tetapi bahkan pada1/100000000000000
, kisaran korelasi hanya akan naik menjadi sekitar 1,40.Meskipun demikian, saya harap ini bisa berguna bagi seseorang.
sumber