Saya mencoba untuk menghasilkan urutan acak berkorelasi dengan mean = , varians = , koefisien korelasi = . Dalam kode di bawah ini, saya menggunakan s1
& s2
sebagai standar deviasi, dan m1
& m2
sebagai sarana.
p = 0.8
u = randn(1, n)
v = randn(1, n)
x = s1 * u + m1
y = s2 * (p * u + sqrt(1 - p^2) * v) + m2
Ini memberi saya benar corrcoef()
0,8 antara x
dan y
. Pertanyaan saya adalah bagaimana saya bisa menghasilkan seri artinya jika saya ingin z
itu juga berkorelasi dengan y
(dengan korelasi yang sama ), tetapi tidak dengan x
. Apakah ada formula khusus yang perlu saya ketahui? Saya menemukan satu tetapi tidak bisa memahaminya.
Jawaban:
Tampaknya Anda bertanya bagaimana cara menghasilkan data dengan matriks korelasi tertentu.
Sebuah fakta yang berguna adalah bahwa jika Anda memiliki vektor acak dengan kovarian matriks Σ , maka random vektor A x memiliki rata-rata A E ( x ) dan kovariansi matriks Ω = A Σ A T . Jadi, jika Anda mulai dengan data yang berarti nol, mengalikan dengan A tidak akan mengubahnya, sehingga persyaratan pertama Anda mudah dipenuhi.x Σ Ax AE(x) Ω=AΣAT A
Katakanlah Anda mulai dengan (mean nol) Data berkorelasi (yaitu matriks kovarians diagonal) - karena kita sedang berbicara tentang matriks korelasi, mari kita hanya mengambil . Anda dapat mengubah ini menjadi data dengan matriks kovarians yang diberikan dengan memilih A menjadi akar kuadrat cholesky dari Ω - maka A x akan memiliki matriks kovarians yang diinginkan Ω .Σ=I A Ω Ax Ω
Dalam contoh Anda, Anda tampaknya menginginkan sesuatu seperti ini:
Sayangnya matriks itu tidak pasti positif, jadi tidak bisa menjadi matriks kovarians - Anda dapat memeriksanya dengan melihat bahwa determinannya negatif. Mungkin sebaliknya
sudah cukup. Saya tidak yakin bagaimana menghitung root kuadrat cholesky di matlab (yang tampaknya adalah apa yang Anda gunakan) tetapi
R
Anda dapat menggunakanchol()
fungsinya.Dalam contoh ini, selama dua s tercantum di atas kelipatan matriks yang tepat (masing-masing) akanΩ
The
R
kode yang digunakan untuk sampai pada ini:sumber
chol
. Perhatikan bahwa ini bisa sangat tidak stabil secara numerik jika hampir tunggal. Dalam hal itu, menggunakan akar kuadrat simetris yang diperoleh, misalnya, melalui SVD, seringkali merupakan pilihan yang lebih baik dalam hal stabilitas numerik. :)Jika Anda menggunakan R, Anda juga dapat menggunakan fungsi mvrnorm dari paket MASS, dengan asumsi Anda ingin variabel yang terdistribusi normal. Implementasinya mirip dengan deskripsi Makro di atas, tetapi menggunakan vektor eigen dari matriks korelasi alih-alih dekomposisi cholesky dan penskalaan dengan dekomposisi nilai singular (jika opsi empiris disetel ke true).
JikaX Σ γ λ Σ
Perhatikan bahwa matriks korelasi harus pasti positif, tetapi mengonversinya dengan fungsi nearPD dari paket Matrix di R akan bermanfaat.
sumber
Solusi alternatif tanpa faktorisasi cholesky adalah sebagai berikut. Biarkan kovarians matriks yang diinginkan dan anggaplah Anda memiliki data x dengan Σ x = I . Misalkan ΣΣy x Σx=I Σy Λ V
Anda dapat menulisΣy=VΛVT=(VΛ−−√)(Λ−−√TVT)=AAT
sumber