Bagaimana cara menghasilkan angka acak berkorelasi (diberikan berarti, varian dan tingkat korelasi)?

53

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?
Joseph Weissman
sumber
1
Tidak yakin saya mengerti Anda dengan benar, tetapi Anda tidak harus menghitung "mean dan varians yang berkorelasi". Jika Anda mengasumsikan bahwa variabelnya normal bivariat, itu harus cukup untuk menentukan rata-rata dan varians individu serta korelasinya. Apakah ada perangkat lunak tertentu yang ingin Anda gunakan untuk ini?
mark999

Jawaban:

44

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 LCCLLTL

Jika Anda sekarang menggunakan matriks untuk memproyeksikan vektor variabel acak tidak berkorelasi , proyeksi yang dihasilkan akan menjadi variabel acak berkorelasi.X Y = L XLXY=LX

Anda dapat menemukan penjelasan singkat mengapa ini terjadi di sini .

usεr11852 kata Reinstate Monic
sumber
Terima kasih! Ini sangat membantu. Saya pikir saya setidaknya memiliki perasaan yang lebih baik tentang apa yang perlu saya lihat selanjutnya.
Joseph Weissman
7
Apakah metode ini hanya berlaku untuk distribusi Gaussian (seperti yang ditentukan dalam pertanyaan), atau dapatkah itu digunakan untuk menghasilkan variabel berkorelasi yang mengikuti distribusi lainnya? Jika tidak, apakah Anda mengetahui metode yang dapat digunakan dalam kasus itu?
user000001
1
@Michael: Ya. Setelah mengatakan bahwa diberikan adalah matriks kovarians yang valid dekomposisi Cholesky adalah cara tercepat. Anda juga bisa mendapatkan matriks akar (simetris) kuadrat dari dengan menggunakan SVD (jadi , di mana dari ) tetapi itu akan lebih mahal juga. X C C = X X = X X T X = U S 0,5 V T C = U S V TCXCC=XX=XXTX=US0.5VTC=USVT
usεr11852 mengatakan Reinstate Monic
1
@Michael: Tentu saja. Kovarians mereka akan (kurang-lebih) sama, bukan jumlahnya sendiri.
usεr11852 mengatakan Reinstate Monic
1
@ Id: Setiap distribusi berkelanjutan yang tidak didukung pada seluruh baris nyata akan segera gagal. Sebagai contoh jika kita menggunakan seragam kami tidak dapat menjamin bahwa "angka berkorelasi" akan berada di ; sama untuk Poisson kita akan berakhir dengan angka non-diskrit. Selain itu, distribusi mana pun yang jumlah distribusinya masih tidak sama dengan distribusi (mis. Menjumlahkan distribusi- tidak menghasilkan distribusi- ) juga akan gagal. Dalam semua kasus yang disebutkan, angka yang dihasilkan akan dikorelasikan menurut tetapi mereka tidak akan sesuai dengan distribusi yang kami mulai. [ 0 , 1 ] t t CU[0,1][0,1]ttC
usεr11852 kata Reinstate Monic
36

+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:

  1. X Y N ( 0 , 1 )r adalah kemiringan garis regresi ketika kedua dan yang standar , yaitu, , XYN(0,1)
  2. Y Xr2 adalah proporsi varians dalam disebabkan varians dalam , YX



    (juga, dari aturan untuk varian ):

  3. varians dari variabel acak dikalikan dengan konstanta adalah konstanta kuadrat kali varians aslinya:
    Var[aX]=a2Var[X]
  4. varians add , yaitu varians dari penjumlahan dari dua variabel acak (dengan asumsi mereka independen) adalah jumlah dari dua varians:
    Var[X+ε]=Var[X]+Var[ε]

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ρXN(0,1)aveYN(0,a2+ve)a2+ve=1|a| 1a=rr 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. a1r2xieiveyi

Jika Anda ingin melakukan ini di R, kode berikut mungkin bekerja untuk Anda:

correlatedValue = function(x, r){
  r2 = r**2
  ve = 1-r2
  SD = sqrt(ve)
  e  = rnorm(length(x), mean=0, sd=SD)
  y  = r*x + e
  return(y)
}

set.seed(5)
x = rnorm(10000)
y = correlatedValue(x=x, r=.5)

cor(x,y)
[1] 0.4945964

(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.

gung - Reinstate Monica
sumber
Pendekatan yang pada dasarnya penyesalan ini sangat bagus membiarkan seseorang untuk menghasilkan satu Y acak berkorelasi dengan sejumlah "prediktor" X yang ada . Apakah saya benar dalam pengertian seperti itu?
ttnphns
Itu tergantung pada pola korelasi apa yang tepat di antara variabel yang Anda inginkan, @ttnphns. Anda bisa mengulanginya satu per satu, tetapi itu akan membosankan. Untuk membuat banyak variabel berkorelasi dengan pola yang diberikan, lebih baik menggunakan dekomposisi Cholesky.
gung - Reinstate Monica
gung, apakah Anda tahu cara menggunakan Cholesky untuk menghasilkan satu Y berkorelasi (kira-kira, seperti dalam metode Anda) sesuai dengan vektor korelasi dengan beberapa X yang ada (tidak disimulasikan)?
ttnphns
@ttnphns, Anda ingin menghasilkan Y tunggal / korelasi populasi tertentu dengan satu set X, bukan satu set variabel p yang semuanya memiliki korelasi populasi yang ditentukan sebelumnya? Cara sederhana adalah menulis persamaan regresi untuk menghasilkan satu Y-hat dari X Anda, kemudian gunakan metode di atas untuk menghasilkan Y sebagai korelasi Y-hat Anda. Anda bisa mengajukan pertanyaan baru tentang itu, jika mau.
gung - Reinstate Monica
1
Inilah yang saya maksud dalam komentar awal saya: metode ini akan menjadi perpanjangan langsung dari apa yang Anda bicarakan dalam jawaban Anda: pada dasarnya metode penyesalan (Topi).
ttnphns
16

Secara umum ini bukan hal yang mudah dilakukan, tapi saya percaya ada paket untuk pembuatan variabel normal multivariat (setidaknya dalam R, lihat mvrnormdalam MASSpaket), 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)Fx2

FX1(x1)=F(x1,x2)dx2.
FX11FX1ξ1[0,1]x^1=FX11(ξ)

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

F(x2|X1=x^1)=F(x^1,x2)fX1(x^1),
fX1X1FX1(x1)=fX1(x1)

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]ξ1F(x2|X1=x^1)x^2=(F(x2|X1=x^1))1(ξ)x^2F(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.

jem77bfp
sumber
Ide cerdas! Memiliki daya tarik intuitif yang sederhana. Tapi ya sepertinya mahal secara komputasi.
MichaelChirico
(+1) poin yang sangat bagus. Akan lebih baik di awal mengatakan , kemudian mengalir lebih alami untuk pertama-tama menghasilkan satu distribusi mariginal dan kemudian distribusi bersyarat. Sangat bagus! fX,Y(x,y)=fX(x)fY|X(y)
KevinKim
1

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}i=1N{yi}i=1NC

1) Hitung koefisien korelasicold=corr({xi},{yi})

2) Menghasilkan dua munber acak dann1n2:1n1,2N

3) Tukar angka danxn1xn2

4) Hitung korelasi barucnew=corr({xi},{yi})

5) Jikalalu pertahankan swap. Jangan batalkan swap.|Ccnew|<|Ccold|

6) Jika stop, goto 1)|Cc|<ϵ

Swap acak tidak akan mengubah distribusi marginal dari .xi

Semoga berhasil!

F. Jatpil
sumber
Saya sedikit bingung dengan notasi. Apakah vektor? Jika tidak, apa yang dimaksud dengan ? xicorr(xi,yi)
Cliff AB
Saya minta maaf, saya seorang hobi dalam statistik - saya tidak fammiliar dengan notasi. adalah angka, adalah sequnce angka (ditandai dengan rata-rata, varians, distribusi probabilitas), dan begitu juga . tidak ditulis dengan baik, itu harus benarxi{xi}ycorr(xi,yi)corr({xi},{yi})=(1/N)Σi=1N(xix¯)(yyy¯)
F. Jatpil
Begitu ya, masuk akal. Saya mengabaikan " " dic o r r ( { x i } , { y i } ){}corr({xi},{yi})
Cliff AB