Maaf jika ini agak terlalu mendasar, tapi kurasa aku hanya ingin mengonfirmasi pengertian di sini. Saya merasa saya harus melakukan ini dalam dua langkah, dan saya mulai mencoba untuk mendapatkan matriks korelasi, tetapi itu baru mulai terlihat benar-benar terlibat. Saya mencari penjelasan singkat (idealnya dengan petunjuk menuju solusi pseudocode) tentang cara yang baik dan cepat untuk menghasilkan bilangan acak berkorelasi.
Diberi dua variabel pseudorandom, tinggi dan berat dengan sarana dan varian yang diketahui, dan korelasi yang diberikan, saya pikir pada dasarnya saya mencoba memahami seperti apa langkah kedua ini:
height = gaussianPdf(height.mean, height.variance)
weight = gaussianPdf(correlated_mean(height.mean, correlation_coefficient),
correlated_variance(height.variance,
correlation_coefficient))
- Bagaimana cara menghitung mean dan varians yang berkorelasi? Tetapi saya ingin mengkonfirmasi bahwa itu benar-benar masalah yang relevan di sini.
- Apakah saya perlu menggunakan manipulasi matriks? Atau apakah saya memiliki sesuatu yang sangat salah dalam pendekatan dasar saya untuk masalah ini?
probability
correlation
conditional-probability
random-generation
Joseph Weissman
sumber
sumber
Jawaban:
Untuk menjawab pertanyaan Anda tentang "cara cepat yang baik dan idealnya menghasilkan angka acak berkorelasi": Diberikan matriks varians-kovarian yang diinginkan, yang secara definitif positif pasti, dekomposisi Cholesky adalah: = ; menjadi matriks segitiga lebih rendah.C L L T LC C L LT L.
Jika Anda sekarang menggunakan matriks untuk memproyeksikan vektor variabel acak tidak berkorelasi , proyeksi yang dihasilkan akan menjadi variabel acak berkorelasi.X Y = L XL X Y=LX
Anda dapat menemukan penjelasan singkat mengapa ini terjadi di sini .
sumber
+1 ke @ user11852, dan @ jem77bfp, ini adalah jawaban yang bagus. Biarkan saya mendekati ini dari sudut pandang yang berbeda, bukan karena saya pikir itu selalu lebih baik dalam praktek , tetapi karena saya pikir ini instruktif. Berikut adalah beberapa fakta relevan yang sudah kita ketahui:
Y Xr2 adalah proporsi varians dalam disebabkan varians dalam , Y X
(juga, dari aturan untuk varian ):
Sekarang, kita dapat menggabungkan keempat fakta ini untuk membuat dua variabel normal standar yang populasinya akan memiliki korelasi, (lebih tepat, ), meskipun sampel yang Anda hasilkan akan memiliki korelasi sampel yang bervariasi. Idenya adalah untuk membuat variabel pseudorandom, , yaitu standar normal, , dan kemudian menemukan koefisien, , dan varian kesalahan, , sehingga , di mana . (Perhatikan bahwa harus agar ini berfungsi, dan, apalagi, .) Jadi, Anda mulai denganr ρ X N(0,1) a ve Y∼N(0,a2+ve) a2+ve=1 |a| ≤1 a=r r yang Anda inginkan; itu koefisien Anda, . Kemudian Anda mengetahui varians kesalahan yang Anda butuhkan, itu . (Jika perangkat lunak Anda mengharuskan Anda untuk menggunakan standar deviasi, mengambil akar kuadrat dari nilai tersebut.) Akhirnya, untuk setiap pseudorandom variate, , bahwa Anda telah dihasilkan, menghasilkan kesalahan variate pseudorandom, , dengan varians kesalahan yang sesuai , dan hitung variasi pseudorandom yang dikorelasikan, , dengan mengalikan dan menambahkan. a 1−r2 xi ei ve yi
Jika Anda ingin melakukan ini di R, kode berikut mungkin bekerja untuk Anda:
(Sunting: Saya lupa menyebutkan :) Seperti yang saya jelaskan, prosedur ini memberi Anda dua variabel berkorelasi normal standar. Jika Anda tidak ingin normals standar , tetapi ingin variabel memiliki beberapa cara khusus (bukan 0) dan SD (bukan 1), Anda dapat mengubahnya tanpa mempengaruhi korelasinya. Dengan demikian, Anda akan mengurangi mean yang diamati untuk memastikan bahwa rata-rata tepat , kalikan variabel dengan SD yang Anda inginkan dan kemudian tambahkan rata-rata yang Anda inginkan. Jika Anda ingin rata-rata yang diamati berfluktuasi secara normal di sekitar rata-rata yang diinginkan, Anda akan menambahkan perbedaan awal kembali. Pada dasarnya, ini adalah transformasi z-skor secara terbalik. Karena ini adalah transformasi linear, variabel yang diubah akan memiliki korelasi yang sama dengan variabel lain seperti sebelumnya.0
Sekali lagi, ini, dalam bentuk yang paling sederhana, hanya memungkinkan Anda menghasilkan sepasang variabel berkorelasi (ini bisa ditingkatkan, tetapi menjadi cepat jelek), dan tentu saja bukan cara yang paling nyaman untuk menyelesaikan pekerjaan. Dalam R, Anda ingin menggunakan ? Mvrnorm dalam paket MASS , baik karena lebih mudah dan karena Anda dapat menghasilkan banyak variabel dengan matriks korelasi populasi yang diberikan. Meskipun demikian, saya pikir bermanfaat untuk menjalani proses ini untuk melihat bagaimana beberapa prinsip dasar berjalan dengan cara yang sederhana.
sumber
Secara umum ini bukan hal yang mudah dilakukan, tapi saya percaya ada paket untuk pembuatan variabel normal multivariat (setidaknya dalam R, lihat
mvrnorm
dalamMASS
paket), di mana Anda hanya memasukkan matriks kovarians dan vektor rata-rata.Ada juga satu lagi pendekatan "konstruktif". Katakanlah kita ingin memodelkan vektor acak dan kita memiliki fungsi distribusinya . Langkah pertama adalah untuk mendapatkan fungsi distribusi marginal; yaitu mengintegrasikan atas semua : Kemudian kami menemukan - fungsi terbalik - dan pasang variabel acak yang didistribusikan secara seragam pada interval . Pada langkah ini kami membuat koordinat pertama .(X1,X2) F(x1,x2) F x2
Sekarang, karena kita telah mendapatkan satu koordinat, kita perlu menghubungkannya ke fungsi distribusi awal dan kemudian mendapatkan fungsi distribusi bersyarat dengan kondisi : mana adalah fungsi kepadatan probabilitas dari distribusi marginal ; yaitu .F(x1,x2) x1=x^1
Kemudian Anda menghasilkan variabel yang terdistribusi secara seragam di (tidak tergantung dari ) dan hubungkan ke invers . Karena itu, Anda memperoleh ; yaitu, memenuhi . Metode ini dapat digeneralisasi ke vektor dengan dimensi lebih banyak, tetapi kelemahannya adalah Anda harus menghitung, secara analitik atau numerik, banyak fungsi. Idenya dapat ditemukan di artikel ini juga: http://www.econ-pol.unisi.it/dmq/pdf/DMQ_WP_34.pdf .ξ2 [0,1] ξ1 F(x2|X1=x^1) x^2=(F(x2|X1=x^1))−1(ξ) x^2 F(x^2|X1=x^1)=ξ
Jika Anda tidak memahami arti memasukkan variabel seragam ke dalam fungsi distribusi probabilitas terbalik, cobalah membuat sketsa dari kasus univariat dan kemudian ingat apa interpretasi geometris dari fungsi terbalik.
sumber
Jika Anda siap untuk memberikan efisiensi, Anda dapat menggunakan alogoritma yang dibuang. Keuntungannya adalah, memungkinkan distribusi apa pun (tidak hanya Gaussian).
Mulailah dengan membuat dua urutan bilangan acak yang tidak berkorelasi dan dengan distribusi yang diinginkan. Biarkan dengan nilai koefisien korelasi yang diinginkan. Kemudian lakukan hal berikut:{xi}Ni=1 {yi}Ni=1 C
1) Hitung koefisien korelasicold=corr({xi},{yi})
2) Menghasilkan dua munber acak dann1 n2:1≤n1,2≤N
3) Tukar angka danxn1 xn2
4) Hitung korelasi barucnew=corr({xi},{yi})
5) Jikalalu pertahankan swap. Jangan batalkan swap.|C−cnew|<|C−cold|
6) Jika stop, goto 1)|C−c|<ϵ
Swap acak tidak akan mengubah distribusi marginal dari .xi
Semoga berhasil!
sumber