Menghasilkan pasangan angka acak yang terdistribusi dan dikorelasikan secara seragam

14

Saya ingin menghasilkan pasangan angka acak dengan korelasi tertentu. Namun, pendekatan yang biasa menggunakan kombinasi linear dari dua variabel normal tidak valid di sini, karena kombinasi linear dari variabel seragam tidak lagi menjadi variabel yang terdistribusi secara seragam. Saya perlu dua variabel untuk menjadi seragam.

Adakah ide tentang bagaimana menghasilkan pasangan variabel seragam dengan korelasi yang diberikan?

Onturenio
sumber
6
Terkait erat: stats.stackexchange.com/questions/30526 . Anda juga ingin memeriksa tag kopula - cukup klik tautan di sini. Teknik cepat dan kotor adalah membiarkan X menjadi seragam [0,1] dan Y=X ketika Xα dan Y=1+αX sebaliknya. Korelasi adalah ρ=2(α1)3+1 , di mana α=1((1ρ)/2)1/3 melakukan trik. Tetapi kopula akan memberi Anda lebih banyak kontrol ....
whuber
Terima kasih atas komentarnya, tapi ya, saya pikir metode ini benar-benar "kotor"
Onturenio
1
Harapan saya adalah bahwa dalam melihat pendekatan ini Anda akan mengenali bahwa Anda dapat (dan seharusnya) memberikan kriteria tambahan mengenai sifat-sifat pasangan angka acak Anda. Jika ini "kotor," maka apa yang salah dengan solusinya? Beri tahu kami agar kami dapat memberikan jawaban yang lebih tepat untuk situasi Anda.
whuber
Pertanyaan ini dijawab secara tidak sengaja dalam menanggapi pertanyaan yang berkaitan erat: bagaimana menghasilkan pasangan RV dengan hubungan regresi linier. Karena kemiringan regresi linier terkait dengan cara yang siap dihitung dengan koefisien korelasi, dan semua kemiringan yang mungkin dapat dihasilkan, ini memberikan cara untuk menghasilkan apa yang Anda inginkan. Lihat stats.stackexchange.com/questions/257779/… .
whuber
1
Silakan juga lihat stats.stackexchange.com/questions/31771 , yang menjawab generalisasi ke tiga seragam acak.
whuber

Jawaban:

16

Saya tidak mengetahui metode universal untuk menghasilkan variabel acak berkorelasi dengan distribusi marginal yang diberikan. Jadi, saya akan mengusulkan metode ad hoc untuk menghasilkan pasangan variabel acak berdistribusi seragam dengan korelasi (Pearson) yang diberikan. Tanpa kehilangan keumuman, saya berasumsi bahwa distribusi marginal yang diinginkan adalah seragam standar (yaitu, dukungannya adalah ).[0,1]

Pendekatan yang diusulkan mengandalkan berikut:
a) Untuk variabel acak seragam standar dan U 2 dengan fungsi distribusi masing-masing F 1 dan F 2 , kita memiliki F i ( U i ) = U i , untuk i = 1 , 2 . Jadi, menurut definisi Spearman rho adalah ρ S ( U 1 , U 2 ) = c o r r ( FU1U2F1F2Fi(Ui)=Uii=1,2 Jadi, koefisien korelasi Spearman dan Pearson sama (versi sampel mungkin berbeda).

ρS(U1,U2)=corr(F1(U1),F2(U2))=corr(U1,U2).

b) Jika adalah variabel acak dengan margin kontinu dan Gaussian copula dengan koefisien korelasi (Pearson) ρ , maka Spearman rho adalah ρ S ( X 1 , X 2 ) = 6X1,X2ρ Ini membuatnya mudah untuk menghasilkan variabel acak yang memiliki nilai Spearman rho yang diinginkan.

ρS(X1,X2)=6πarcsin(ρ2).

Pendekatannya adalah untuk menghasilkan data dari Gaussian copula dengan koefisien korelasi yang sesuai sehingga Spearman rho sesuai dengan korelasi yang diinginkan untuk variabel acak seragam.ρ

Algoritma simulasi
Misalkan menunjukkan tingkat korelasi yang diinginkan, dan n jumlah pasangan yang akan dihasilkan. Algoritme adalah:rn

  1. Hitung .ρ=2sin(rπ/6)
  2. Hasilkan sepasang variabel acak dari Gaussian copula (misalnya, dengan pendekatan ini )
  3. Ulangi langkah 2 kali.n

Contoh
Kode berikut adalah contoh implementasi algoritma ini menggunakan R dengan korelasi target danr=0.6 pasangan.n=500

## Initialization and parameters 
set.seed(123)
r <- 0.6                            # Target (Spearman) correlation
n <- 500                            # Number of samples

## Functions
gen.gauss.cop <- function(r, n){
    rho <- 2 * sin(r * pi/6)        # Pearson correlation
    P <- toeplitz(c(1, rho))        # Correlation matrix
    d <- nrow(P)                    # Dimension
    ## Generate sample
    U <- pnorm(matrix(rnorm(n*d), ncol = d) %*% chol(P))
    return(U)
}

## Data generation and visualization
U <- gen.gauss.cop(r = r, n = n)
pairs(U, diag.panel = function(x){
          h <- hist(x, plot = FALSE)
          rect(head(h$breaks, -1), 0, tail(h$breaks, -1), h$counts/max(h$counts))})

Pada gambar di bawah, plot diagonal menunjukkan histogram variabel dan U 2 , dan plot off-diagonal menunjukkan plot hamburan U 1U1U2U1 dan . U2masukkan deskripsi gambar di sini

Dengan konstuksi, variabel acak memiliki margin yang seragam dan koefisien korelasi (mendekati) r . Tetapi karena efek pengambilan sampel, koefisien korelasi dari data yang disimulasikan tidak persis sama dengan .r

cor(U)[1, 2]
# [1] 0.5337697

Perhatikan bahwa gen.gauss.copfungsi harus bekerja dengan lebih dari dua variabel hanya dengan menentukan matriks korelasi yang lebih besar.

Studi
simulasi Studi simulasi berikut diulang untuk korelasi target menunjukkan bahwa distribusi koefisien korelasi menyatu dengan korelasi yang diinginkan ketika ukuran sampel n meningkat.r=0.5,0.1,0.6n

## Simulation
set.seed(921)
r <- 0.6                                                # Target correlation
n <- c(10, 50, 100, 500, 1000, 5000); names(n) <- n     # Number of samples
S <- 1000                                               # Number of simulations

res <- sapply(n,
              function(n, r, S){
                   replicate(S, cor(gen.gauss.cop(r, n))[1, 2])
               }, 
               r = r, S = S)
boxplot(res, xlab = "Sample size", ylab = "Correlation")
abline(h = r, col = "red")

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

QuantIbex
sumber
3
Metode umum untuk menghasilkan distribusi multivariat berkorelasi dengan distribusi marjinal yang diberikan disebut kopula .
whuber
@whuber, penggunaan kopula memungkinkan untuk menentukan struktur ketergantungan antara variabel acak. Masalahnya adalah bahwa korelasi (Orang) dipengaruhi oleh struktur ketergantungan dan margin. Jadi, setiap pilihan margin akan memerlukan pilihan yang sesuai dari parameter kopula, belum lagi bahwa beberapa tingkat korelasi tidak dapat dicapai untuk margin yang diberikan (misalnya, lihat di sini ). Jika Anda mengetahui metode yang memungkinkan untuk 'mengontrol' tingkat korelasi untuk setiap pilihan margin, saya akan senang mengetahuinya.
QuantIbex
Terima kasih @ QuantIbex. Tapi saya tidak mengerti mengapa "a) menyiratkan bahwa Spearman rho dan (Pearson) koefisien korelasi untuk variabel acak dengan margin seragam standar kira-kira sama dalam sampel besar"
Onturenio
2
[1,1]
1
@ Quantibex Saya mengambil kebebasan untuk menambahkan kalimat yang menunjukkan gen.gauss.copfungsi Anda akan bekerja untuk lebih dari dua variabel dengan tweak (sepele). Jika Anda tidak suka penambahan atau ingin membuatnya berbeda, silakan kembali atau ubah sesuai kebutuhan.
Glen_b -Reinstate Monica
0

u1U(0,1)u1w1U(0,1)I=1u1w2U(0,1)I=0u1U(0,1)u2

E(u1u2)=E[Iw1+(1I)w2][Iw1+(1I)w3]

I(I1)=0I2=I(1I)2=(1I)saya selalu baik 0 atau 1. Perhatikan juga itusaya tidak tergantung pada w, Yang juga independen satu sama lain. Begitu:

E(kamu1kamu2)=E(saya)E(w12)+E(1-saya)E(w2)E(w3) =pE(w12)+(1p)/4

From the fact that V(w1)=1/12, we get E(w12)=1/3, so E(u1u2)=p/12+1/4, that is: cov(u1u2)=p/12. Since V(u1)=V(u2)=1/12, we get finally that cor(u1,u2)=p.

Neal Oden
sumber
0

Here is one easy method for positive correlation: Let (u1,u2)=Iw1+(1I)(w2,w3), where w1,w2, and w3 are independent U(0,1) and I is Bernoulli(p). u1 and u2 will then have U(0,1) distributions with correlation p. This extends immediately to k-tuples of uniforms with compound symmetric variance matrix.

If you want pairs with negative correlation, use (u1,u2)=I(w1,1w1)+(1I)(w2,w3), and the correlation will be p.

Neal Oden
sumber
Can you add a short proof of why this works?
The Laconic
if your want to be computationally efficient, u1=w1 also produces the same correlation (both positive and negative cases)
Anvit