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
- Hitung .ρ=2sin(rπ/6)
- Hasilkan sepasang variabel acak dari Gaussian copula (misalnya, dengan pendekatan ini )
- 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 .
U2
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.cop
fungsi 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")