与えられた相関関係を得るために2Dデータを並べ替える方法は?


9

2つの連続変数を持つ次の単純なデータセットがあります。つまり:

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

ベース配布

変数間の相関が0.6になるようにデータを再配置する必要があります。両方の変数の平均と他の記述統計(sd、min、maxなど)を一定に保つ必要があります。

私は与えられたデータとほとんどすべての相関関係を作ることが可能であることを知っています:すなわち:

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

ここに画像の説明を入力してください

sampleこのタスクに関数を使用しようとすると:

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.281600 -0.038330 -0.002498 -0.001506  0.034380  0.288800

ただし、この範囲はデータフレームの行数に依存し、サイズの増加に伴って減少します。

> 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

私の質問は:

与えられた相関関係(つまり0.7)を取得するために、このようなデータセットを再配置する方法 (メソッドがデータセットのサイズへの依存を削除することも良いでしょう)

回答:


6

追加の乱数の生成に基づいてデータを再配置する1つの方法を次に示します。

指定された相関関係を持つ2変量正規分布からサンプルを抽出します。次に、取得した値と値のランクを計算します。これらのランクは、元の値を並べ替えるために使用されます。このアプローチでは、元の値と値の両方をトップソートします。y x yxyxy

まず、実際のデータセットを作成します(例のように)。

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

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

次に、相関行列を指定します。

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

、(両方の変数)、および指定された相関関係を持つ2変量正規分布に従ってランダムデータを生成します。Rでは、これはパッケージの関数で実行できます。相関が経験的相関(母集団相関ではない)であることを示すために使用します。σ = 1μ=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

ランダムデータは、指定された相関関係と完全に一致します。

次に、ランダムデータのランクを計算します。

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

で元のデータのランクを使用するには、元のデータdを並べ替える必要があります。

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

これで、ランクを使用して、ソートされたデータの順序を指定できます。

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

得られた相関関係は、指定された相関関係と完全には一致しませんが、差は比較的小さくなります。

ここで、dx_sorted[rx]およびdy_sorted[ry]は、の元のデータのリサンプリングされたバージョンですd


2
+1それはかなりクールです。手順は、1)正しいピアソン相関を使用して通常のデータを生成する、2)元のデータを作成し、生成されたデータをランク相関と正確に一致させる、3)元のデータがピアソン相関とほぼ同じになった。なぜこれが機能するのですか?あるという分析結果はありますか?正常な分布または何かについて、さまざまな相関測定を互いに近くに保つ境界不等式?
Bill

1
@ビル私は分析的にアプローチを説明することはできません。思いついたアイデアです。ただし、手順をわかりやすくまとめました。ありがとう。
Sven Hohenstein

2

指定された相関関係を持つ2つの一様分布を生成するには、Ruscio&Kaczetow(2008)アルゴリズムが機能します。Rコードを提供します。次に、単純な線形関数で変換して、ターゲットの最小値、最大値、平均値、およびSDを取得できます。

Ruscio&Kaczetowアルゴリズム

2変量のケースを要約しますが、多変量の問題でも機能します。無相関のおよびは、任意の形状(たとえば、均一)で生成されます。次に、とは、中間の相関を持つ2変量正規として生成されます。とは、ランクを維持する方法でとに置き換えられます。r()が低すぎるか高すぎるかに応じて、中間相関を高くまたは低く調整します。とは、新しい中間相関を持つ2変量正規として生成されます。繰り返す。XoYoX1Y1X1Y1X0Y0X1,Y1X2Y2

これは反復的であることを除いて、@ Sven Hohensteinのソリューションと非常に似ていることに注意してください。中間相関は、区別できなくなるまでターゲット相関にますます近づきます。また、このアルゴリズムを使用して多数の母集団(N = 100万など)を生成し、そこから小さなサンプルを抽出することもできます。これは、サンプリングエラーが必要な場合に便利です。

関連記事:相関と非正規分布

記述統計の保持

アルゴリズムがまったく同じ説明を生成するという保証はありません。ただし、均一分布の平均とSDはその最小値と最大値によって決定されるため、最小値と最大値を調整してすべてを修正できます。

ましょうと Ruscio&Kaczetowアルゴリズムの最後の反復からあなたの生成された変数であるとあなたが(ターゲット記述統計を)持っていると思っていことを最終的な変数である、そしておよび、データセット内の元の変数です。 XgYgXfYfXY

計算 Xf=(Xgmin(X))(max(X)min(x))/(max(Xg)min(Xg))

についても同じYf

参照:

Ruscio、J.&Kaczetow、W.(2008)。反復アルゴリズムを使用した多変量非正規データのシミュレーション。多変量行動研究、43、355–381。土井:10.1080 / 00273170802285693


1

「リサンプル」と言うときは、より一般的な「シミュレート」を意味していると思います。以下は、指定された相関関係を持つ通常の2変量データをシミュレートするために知っている最も簡潔な方法です。rと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")

3
いいえ、「リサンプル」という意味です。両方の変数の平均とその他の記述統計(sd、min、max)を一定に保つ必要があります。質問を更新しました。
Yuriy Petrovskiy、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.