Korelasyonu elde etmek için 2D verileri nasıl yeniden düzenleyebilirim?


9

İki sürekli değişkenli basit veri setim var; yani:

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

Temel dağıtım

Değişkenler arasındaki korelasyon ~ 0.6 olacak şekilde verileri yeniden düzenlemem gerekiyor. Her iki değişkenin ortalamalarını ve diğer tanımlayıcı istatistiklerini (sd, min, max, vb.) Sabit tutmam gerekiyor.

Verilen verilerle hemen hemen her türlü korelasyonun mümkün olduğunu biliyorum:

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

resim açıklamasını buraya girin

sampleBu görev için işlev kullanmaya çalışırsam :

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))
}

Oldukça geniş bir korelasyon aralığı elde ediyorum:

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

ancak bu aralık veri çerçevesindeki satır sayısına ve boyut artışıyla azalmaya bağlıdır.

> 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

Sorum şu:

Korelasyonu (ör: 0.7) almak için bu veri kümesini nasıl yeniden düzenleyebilirim? (Yöntem, veri kümesi boyutuna bağımlılığı kaldıracaksa da iyi olacaktır)

Yanıtlar:


6

Ek rasgele sayılar üretmeye dayanan verileri yeniden düzenlemenin bir yolu.

Belirlenen korelasyon ile iki değişkenli normal dağılımdan örnekler çiziyoruz. Ardından, elde ettiğimiz ve değerlerinin saflarını hesaplıyoruz . Bu dereceler orijinal değerleri sıralamak için kullanılır. Bu yaklaşım için, üst tür hem orijinal olması ve değerleri.xyxy

İlk olarak, gerçek veri kümesini oluştururuz (örneğin örneğiniz gibi).

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

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

Şimdi bir korelasyon matrisi belirledik.

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

, (her iki değişken için) ve belirtilen korelasyon ile iki değişkenli normal dağılımın ardından rastgele veriler üretiriz . R de, bu paketin fonksiyonuyla yapılabilir . Biz kullanmak korelasyon ampirik korelasyon (değil nüfus korelasyon) olduğunu belirtmek için.μ=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

Rastgele veriler belirtilen korelasyonla mükemmel şekilde eşleşir.

Sonra, rastgele verilerin saflarını hesaplıyoruz.

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

Orijinal verilerin dsıralamalarını kullanmak için orijinal verileri sıralamamız gerekir.

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

Şimdi, sıralanan verilerin sırasını belirtmek için sıraları kullanabiliriz.

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

Elde edilen korelasyon, belirtilen korelasyonla mükemmel bir şekilde eşleşmez, ancak fark nispeten küçüktür.

Burada dx_sorted[rx]ve dy_sorted[ry]orijinal verilerin yeniden örneklenmiş sürümleri d.


2
+1 Bu çok havalı. Adımlar 1) doğru Pearson korelasyonu ile normal veriler üretmek, 2) orijinal verileri yapmak ve üretilen veri eşleme sıra korelasyonlarını tam olarak yapmak, 3) orijinal veriler şu anda kabaca aynı Pearson korelasyonuna sahiptir. Bu neden işe yarıyor? Yaptığını söyleyen analitik bir sonuç var mı? İyi davranış dağılımları veya benzeri şeyler için çeşitli korelasyon önlemlerini birbirine yakın tutan eşitsizlikleri sınırlamak mı?
Bill

1
@ Fatura Yaklaşımı analitik olarak açıklayamam. Aklıma gelen sadece bir fikir. Ancak, adımları güzel bir şekilde özetlediniz. Teşekkürler.
Sven Hohenstein

2

Belirli bir korelasyon ile iki düzgün dağılım oluşturmak için Ruscio & Kaczetow (2008) algoritması çalışacaktır. R kodu sağlarlar . Daha sonra hedef min, maks, ortalama ve SD'yi elde etmek için basit bir doğrusal işlevle dönüştürebilirsiniz.

Ruscio & Kaczetow Algoritması

İki değişkenli durumu özetleyeceğim, ancak çok değişkenli sorunlarla da çalışabilir. ilintisizXÖ ve YÖherhangi bir şekil ile üretilir (örneğin, üniform). Sonra,X1 ve Y1 ara korelasyon ile iki değişkenli normal olarak üretilir. X1 ve Y1 ile değiştirildi X0 ve Y0rütbeli bir şekilde. Ara korelasyonu r (X1,Y1) çok düşük veya çok yüksek. X2 ve Y2yeni ara korelasyon ile iki değişkenli normal olarak üretilir . Tekrar et.

Bunun yinelemenin dışında @Sven Hohenstein'ın çözümüne çok benzediğine dikkat edin, bu nedenle ara korelasyon, ayırt edilemez olana kadar hedef korelasyona daha yakın ve daha yakın olacaktır. Ayrıca, bu algoritmanın daha küçük örneklerin çizileceği büyük bir popülasyon (örneğin, N = 1 milyon) oluşturmak için kullanılabileceğine dikkat edin - bu, örnekleme hatasına ihtiyacınız varsa kullanışlıdır.

İlgili bir gönderi için: Korelasyon ve normal olmayan dağılımlar

Betimsel İstatistikleri Koruma

Algoritmanın tam olarak aynı tanımlamaları üreteceğine dair bir garanti yoktur. Bununla birlikte, tekdüze bir dağılımın ortalaması ve SD'si min ve maks ile belirlendiğinden, her şeyi düzeltmek için min ve maks'i ayarlayabilirsiniz.

İzin Vermek Xg ve Yg Ruscio & Kaczetow algoritmasının son yinelemesinden üretilen değişkenleriniz olun, Xf ve Yf sahip olmayı umduğunuz nihai değişkenleriniz (hedef tanımlayıcıları ile) ve X ve Y veri kümenizdeki orijinal değişkenleriniz olun.

Hesaplamak Xf=(Xg-mbenn(X))*(mbirx(X)-mbenn(x))/(mbirx(Xg)-mbenn(Xg))

İçin aynısını yapın Yf

Referans:

Ruscio, J. ve Kaczetow, W. (2008). Yinelemeli bir algoritma kullanarak çok değişkenli normal olmayan verilerin simülasyonu. Çok Değişkenli Davranışsal Araştırma, 43, 355-381. DOI: 10,1080 / 00273170802285693


1

"Yeniden örnek" dediğinizde "benzet" demek istediğinizi tahmin ediyorum. Aşağıda, normal, iki değişkenli verileri belirli bir korelasyonla simüle etmeyi bildiğim en kısa yol. R ve n için istediğiniz değerlerin yerine koyun.

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")

3
Hayır, gerçekten "yeniden örnekleme" demek istiyorum. Her iki değişkenin ortalamalarını ve diğer tanımlayıcı istatistiklerini (sd, min, max) sabit tutmam gerekiyor. Soru güncellendi.
Yuriy Petrovskiy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.