[Pada pertanyaan baru-baru ini saya sedang mencari untuk menghasilkan vektor acak dalam R , dan saya ingin membagikan "penelitian" itu sebagai tanya jawab independen pada titik tertentu.]
Menghasilkan data acak dengan korelasi dapat dilakukan dengan menggunakan dekomposisi Cholesky dari matriks korelasi sini , sebagaimana tercermin pada posting sebelumnya di sini dan di sini .
Pertanyaan yang saya ingin alamat adalah bagaimana menggunakan distribusi Uniform untuk menghasilkan angka acak berkorelasi dari distribusi marjinal berbeda di R .
r
correlation
sampling
random-variable
random-generation
Antoni Parellada
sumber
sumber
Jawaban:
Karena pertanyaannya adalah
dan tidak hanya varian acak normal, jawaban di atas tidak menghasilkan simulasi dengan korelasi yang dimaksudkan untuk sepasang distribusi marginal sewenang-wenang di .R
Alasannya adalah bahwa, untuk sebagian besar cdf dan , when mana menunjukkan standar cdf normal.GX GY
Intinya, berikut adalah contoh tandingan dengan Exp (1) dan Gamma (.2,1) sebagai pasangan distribusi marginal saya di .R
Contoh tandingan lain yang jelas adalah ketika adalah cdf, dalam hal ini korelasinya tidak didefinisikan.GX
Untuk memberikan gambaran yang lebih luas, berikut ini adalah kode R di mana dan keduanya berubah-ubah:GX GY
Bermain-main dengan berbagai cdf membuat saya memilih kasus khusus untuk dan distribusi log-Normal untuk :χ23 GX GY
yang menunjukkan seberapa jauh dari diagonal korelasinya.
sumber
Saya menulis
correlate
paket. Orang-orang mengatakan itu menjanjikan (layak diterbitkan dalam Journal of Statistical Software), tetapi saya tidak pernah menulis makalah untuk itu karena saya memilih untuk tidak mengejar karir akademik.Saya percaya
correlate
paket yang tidak dikelola masih pada CRAN.Ketika Anda menginstalnya, Anda dapat melakukan hal berikut:
Hasilnya adalah bahwa data baru akan memiliki korelasi 0,5, tanpa mengubah distribusi univariat
a
danb
(nilai-nilai yang sama ada, mereka hanya bergerak di sekitar sampai korelasi multivariat 0,5 telah tercapai.Saya akan menjawab pertanyaan di sini, maaf karena kurangnya dokumentasi.
sumber
Hasilkan dua sampel data berkorelasi dari distribusi acak normal standar setelah korelasi yang telah ditentukan .
Sebagai contoh, mari kita pilih korelasi r = 0,7 , dan kode matriks korelasi seperti:
(C <- matrix(c(1,0.7,0.7,1), nrow = 2)) [,1] [,2] [1,] 1.0 0.7 [2,] 0.7 1.0
Kita dapat menggunakan
mvtnorm
untuk menghasilkan sekarang dua sampel ini sebagai vektor acak bivariat:set.seed(0)
SN <- rmvnorm(mean = c(0,0), sig = C, n = 1e5)
menghasilkan dua komponen vektor yang didistribusikan sebagai ~ dan dengan a . Kedua komponen dapat diekstrak sebagai berikut:cor(SN[,1],SN[,2])= 0.6996197 ~ 0.7
X1 <- SN[,1]; X2 <- SN[,2]
Berikut plot dengan garis regresi yang tumpang tindih:
Gunakan Probability Integral Transform di sini untuk mendapatkan vektor acak bivariat dengan distribusi marginal ~U(0,1) dan korelasi yang sama :
U <- pnorm(SN)
- jadi kami memasukkan kepnorm
dalamSN
vektor untuk menemukancor(U[,1], U[,2]) = 0.6816123 ~ 0.7
.Sekali lagi kita dapat menguraikan vektor
U1 <- U[,1]; U2 <- U[,2]
dan menghasilkan sebar dengan distribusi marjinal di tepi, jelas menunjukkan sifat seragam mereka:Terapkan metode sampling transformasi terbalik di sini untuk akhirnya mendapatkan bivektor dari titik berkorelasi sama yang dimiliki keluarga distribusi mana pun yang kami tuju untuk mereproduksi.
Dari sini kita hanya dapat menghasilkan dua vektor yang terdistribusi secara normal dan dengan varian yang sama atau berbeda . Misalnya:
Y1 <- qnorm(U1, mean = 8,sd = 10)
danY2 <- qnorm(U2, mean = -5, sd = 4)
, yang akan mempertahankan korelasi yang diinginkancor(Y1,Y2) = 0.6996197 ~ 0.7
,.Atau pilih distribusi yang berbeda. Jika distribusi yang dipilih sangat berbeda, korelasinya mungkin tidak tepat. Sebagai contoh, mari kitat distribusi dengan 3 df, dan λ = 1:
U1
ikuti aU2
eksponensial dengan aZ1 <- qt(U1, df = 3)
danZ2 <- qexp(U2, rate = 1)
Thecor(Z1,Z2) [1] 0.5941299 < 0.7
. Berikut adalah histogram masing-masing:Berikut adalah contoh kode untuk seluruh proses dan marginal normal:
Sebagai perbandingan, saya telah mengumpulkan fungsi berdasarkan dekomposisi Cholesky:
Mencoba kedua metode untuk menghasilkan yang berkorelasi (katakanlah,r=0.7 ) sampel didistribusikan ~ N(97,23) dan N(32,8) kita dapatkan, pengaturan
set.seed(99)
:Menggunakan Seragam:
dan Menggunakan Cholesky:
sumber