Jika saya memiliki vektor probabilitas berkorelasiBagaimana saya bisa mengubahnya menjadi biner tanpa merusak korelasinya?

8

Tujuan utama saya adalah untuk dapat memiliki cara untuk menghasilkan vektor ukuran dari variabel acak berkorelasi Bernoulli. Salah satu cara saya melakukan ini adalah dengan menggunakan pendekatan Gaussian Coupla. Namun, pendekatan Gaussian Coupla hanya membuat saya dengan vektor:N

(p1,,pN)[0,1]N

Misalkan saya telah menghasilkan sedemikian rupa sehingga korelasi umum di antara mereka adalah . Sekarang, bagaimana saya bisa mengubahnya menjadi vektor baru atau ? Dengan kata lain, saya ingin:(p1,,pN)ρ01

(X1,,XN){0,1}N

tetapi dengan korelasi yang sama .ρ

Salah satu pendekatan yang saya pikirkan adalah menetapkan aturan cutoff keras sehingga jika , maka biarkan dan jika , maka biarkan .pi<0.5Xi=0pi0.5Xi=1

Ini tampaknya bekerja dengan baik dalam simulasi karena mempertahankan struktur korelasinya tetapi sangat arbitrer bagi saya apa nilai cutoff yang harus dipilih selain dari .0.5

Cara lain adalah memperlakukan setiap sebagai variabel acak Bernoulli dengan probabilitas keberhasilan dan sampel darinya. Namun pendekatan ini tampaknya menyebabkan hilangnya korelasi dan bukannya , saya mungkin mendapatkan atau .Xipiρρ2ρ3

Adakah yang punya pemikiran atau masukan dalam hal ini? Terima kasih.

pengguna321627
sumber
3
Anda memiliki variabel N. Mengapa Anda berbicara tentang rho tunggal dan bukan matriks rhos?
ttnphns
4
Lihat pertanyaan mathoverflow ini
Jakub Bartczuk

Jawaban:

3

Saya tidak cukup mengerti Gaussian Copula untuk mengetahui apa masalahnya. Tapi saya menemukan cara untuk menghasilkan vektor Bernoulli berkorelasi.

Mengikuti https://mathoverflow.net/a/19436/105908 jika kita mengambil satu set vektor tetap dan vektor acak pada unit sphere , kita dapat mengubah menjadi biner mana . Dalam pengaturan ini, mana adalah sudut antara dan .v1...vnuuXXi=(uvi>0)cor(Xi,Xj)=π2θ(i,j)πθ(i,j)vivj

Cara menemukan matriks yang sesuaiuntuk menghasilkan matriks korelasi yang diinginkan ? Kondisi sudut diterjemahkan menjadi dan dengan demikian kita dapat menemukan dengan dekomposisi Cholesky.V=|v1...vn|RVVT=cos(πRπ2)V

Contoh kode dalam R berikut:

#Get a simple correlation matrix 
N = 3
cor_matrix <- matrix(c(1,0.5,0.8,0.5,1,0.3,0.8,0.3,1), N, N)

#Calculate the vectors with desired angles
vector_matrix <- chol(cos( (pi * cor_matrix - pi) * -0.5))

#You can generate random unit vectors by normalizing a vector 
#of normally distributed variables, note however that the normalization
#does not affect the sign of the dot product and so we ignore it
num_samples <- 10000
normal_rand <- matrix(rnorm(num_samples * N), num_samples, N)

#Generate the target variables
B <- (normal_rand %*% vector_matrix) > 0

#See for yourself that it works
cor(B)  
cor(B) - cor_matrix 

Terima kasih @ jakub-bartczuk untuk menautkan ke pertanyaan MO - Saya tidak akan menemukannya sendiri.


Kode di atas memiliki satu batasan besar: distribusi marginal diperbaiki pada . Saat ini saya tidak mengetahui bagaimana memperluas pendekatan ini agar sesuai dengan korelasi dan distribusi marjinal. Jawaban lain memiliki pendekatan untuk kasus umum, tetapi kehilangan banyak kesederhanaan (melibatkan integrasi numerik). Ada juga makalah yang disebut Menghasilkan Lonjakan Kereta dengan Koefisien Korelasi Tertentu dan menyertai paket Matlab di mana pengambilan sampel melibatkan "hanya" menemukan secara numerik nol unik dari fungsi monoton oleh pembagian dua.XiBernoulli(0.5)

Martin Modrák
sumber
Terima kasih, ini luar biasa! Dapatkah saya bertanya bagaimana kondisi sudutnya adalah ? Terima kasih! VVT=cos(πRπ2)
user321627
1
@ user321627 Anda mulai dengan dan hubungan produk titik ke sudut Dari sana aljabar linier yang relatif sederhana. Saya terlalu malas untuk menulis di komputer :-)Ri,j=π2θ(i,j)πθ(i,j)=arccos(vi.vj|vi|.|vj|)
Martin Modrák