Bagaimana mengatur ulang data 2D untuk mendapatkan korelasi?

9

Saya memiliki dataset sederhana berikut dengan dua variabel kontinu; yaitu:

d = data.frame(x=runif(100,0,100),y = runif(100,0,100))
plot(d$x,d$y)
abline(lm(y~x,d), col="red")
cor(d$x,d$y) # = 0.2135273

Distribusi dasar

Saya perlu mengatur ulang data agar memiliki korelasi antara variabel menjadi ~ 0,6. Saya perlu menjaga statistik statistik deskriptif dan lainnya (sd, min, max, dll.) Dari kedua variabel konstan.

Saya tahu adalah mungkin untuk membuat hampir semua korelasi dengan data yang diberikan yaitu:

d2 = with(d,data.frame(x=sort(x),y=sort(y)))
plot(d2$x,d2$y)
abline(lm(y~x,d2), col="red")
cor(d2$x,d2$y) # i.e. 0.9965585

masukkan deskripsi gambar di sini

Jika saya mencoba menggunakan samplefungsi untuk tugas ini:

cor.results = c()
for(i in 1:1000){
    set.seed(i)
    d3 = with(d,data.frame(x=sample(x),y=sample(y)))
    cor.results =  c(cor.results,cor(d3$x,d3$y))
}

Saya mendapatkan rentang korelasi yang cukup luas:

> summary(cor.results)
     Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
-0.281600 -0.038330 -0.002498 -0.001506  0.034380  0.288800

tetapi rentang ini tergantung pada jumlah baris dalam bingkai data dan menurun dengan bertambahnya ukuran.

> d = data.frame(x=runif(1000,0,100),y = runif(1000,0,100))
> cor.results = c()
> for(i in 1:1000){
+ set.seed(i)
+ d3 = with(d,data.frame(x=sample(x),y=sample(y)))
+ cor.results =  c(cor.results,cor(d3$x,d3$y))
+ }
> summary(cor.results)
      Min.    1st Qu.     Median       Mean    3rd Qu.       Max. 
-0.1030000 -0.0231300 -0.0005248 -0.0005547  0.0207000  0.1095000

Pertanyaanku adalah:

Bagaimana mengatur ulang dataset tersebut untuk mendapatkan korelasi yang diberikan (yaitu 0,7)? (Ini juga akan baik jika metode akan menghapus ketergantungan pada ukuran dataset)

Yuriy Petrovskiy
sumber

Jawaban:

6

Berikut adalah salah satu cara untuk mengatur ulang data yang didasarkan pada menghasilkan angka acak tambahan.

Kami mengambil sampel dari distribusi normal bivariat dengan korelasi yang ditentukan. Selanjutnya, kita menghitung peringkat nilai dan kita peroleh. Peringkat ini digunakan untuk memesan nilai-nilai asli. Untuk pendekatan ini, kami memiliki urutan teratas baik nilai dan .y x yxyxy

Pertama, kami membuat kumpulan data aktual (seperti pada contoh Anda).

set.seed(1)
d <- data.frame(x = runif(100, 0, 100), y = runif(100, 0, 100))

cor(d$x, d$y)
# [1] 0.01703215

Sekarang, kami menentukan matriks korelasi.

corr <- 0.7  # target correlation
corr_mat <- matrix(corr, ncol = 2, nrow = 2)
diag(corr_mat) <- 1
corr_mat
#      [,1] [,2]
# [1,]  1.0  0.7
# [2,]  0.7  1.0

μ=0σ=1mvrnormMASSempirical = TRUE

library(MASS)
mvdat <- mvrnorm(n = nrow(d), mu = c(0, 0), Sigma = corr_mat, empirical = TRUE)

cor(mvdat)
#      [,1] [,2]
# [1,]  1.0  0.7
# [2,]  0.7  1.0

Data acak sangat cocok dengan korelasi yang ditentukan.

Selanjutnya, kami menghitung peringkat data acak.

rx <- rank(mvdat[ , 1], ties.method = "first")
ry <- rank(mvdat[ , 2], ties.method = "first")

Untuk menggunakan peringkat untuk data asli d, kita harus mengurutkan data asli.

dx_sorted <- sort(d$x)
dy_sorted <- sort(d$y)

Sekarang, kita bisa menggunakan peringkat untuk menentukan urutan data yang diurutkan.

cor(dx_sorted[rx], dy_sorted[ry])
# [1] 0.6868986

Korelasi yang diperoleh tidak cocok dengan yang ditentukan, tetapi perbedaannya relatif kecil.

Di sini, dx_sorted[rx]dan dy_sorted[ry]merupakan versi resampled dari data asli di d.

Sven Hohenstein
sumber
2
+1 Itu cukup keren. Langkah-langkahnya adalah 1) menghasilkan data normal dengan korelasi Pearson yang tepat, 2) membuat data asli dan data yang dihasilkan sesuai dengan korelasi peringkat, 3) data asli memiliki korelasi Pearson yang kira-kira sama sekarang. Mengapa ini bekerja? Apakah ada hasil analitik yang mengatakan itu? Membatasi ketidaksetaraan menjaga berbagai langkah korelasi dekat satu sama lain untuk distribusi berperilaku baik atau sesuatu?
Bill
1
@ Bill Aku tidak bisa menjelaskan pendekatannya secara analitis. Itu hanya ide yang muncul di benak saya. Namun, Anda merangkum langkah-langkahnya dengan cara yang baik. Terima kasih.
Sven Hohenstein
2

Untuk menghasilkan dua distribusi seragam dengan korelasi yang ditentukan, algoritma Ruscio & Kaczetow (2008) akan berfungsi. Mereka menyediakan kode R . Anda kemudian dapat mentransformasikannya dengan fungsi linear sederhana untuk mendapatkan target min, maks, rata-rata, dan SD Anda.

Algoritma Ruscio & Kaczetow

XHaiYHaiX1Y1X1Y1X0Y0X1,Y1X2Y2

Perhatikan bahwa ini sangat mirip dengan solusi @Sven Hohenstein, kecuali bahwa itu iteratif, sehingga korelasi antara akan semakin dekat dengan korelasi target sampai mereka tidak bisa dibedakan. Juga, perhatikan bahwa algoritma ini dapat digunakan untuk menghasilkan populasi yang besar (misalnya, N = 1 juta) untuk mengambil sampel yang lebih kecil - yang berguna jika Anda perlu memiliki kesalahan pengambilan sampel.

Untuk pos terkait: Korelasi dan distribusi tidak normal

Melestarikan Statistik Deskriptif

Tidak ada jaminan bahwa algoritma akan menghasilkan deskripsi yang sama persis. Namun, karena rerata distribusi seragam dan SD ditentukan oleh min dan maksnya, Anda cukup menyesuaikan min dan maks untuk memperbaiki semuanya.

XgYgXfYfXY

Xf=(Xg-msayan(X))(mSebuahx(X)-msayan(x))/(mSebuahx(Xg)-msayan(Xg))

Yf

Referensi:

Ruscio, J., & Kaczetow, W. (2008). Mensimulasikan data nonnormal multivarian menggunakan algoritma iteratif. Penelitian Perilaku Multivariat, 43, 355-381. doi: 10.1080 / 00273170802285693

Anthony
sumber
1

Saya menduga bahwa ketika Anda mengatakan "sampel ulang" berarti "simulasi", yang lebih umum. Berikut ini adalah cara paling ringkas yang saya tahu untuk mensimulasikan data normal, bivariat dengan korelasi yang ditentukan. Ganti nilai yang Anda inginkan untuk r dan n.

r = .6
n = 1000
x = rnorm(n) 
z = rnorm(n) 
y = (r/(1-r^2)^.5)*x + z

cor(x,y)
plot(x,y)
abline(lm(y~x), col="red")
rolando2
sumber
3
Tidak, yang saya maksud adalah "resample". Saya perlu menjaga cara dan statistik deskriptif lainnya (sd, min, maks) dari kedua variabel konstan. Memperbarui pertanyaan.
Yuriy Petrovskiy