相関のある乱数を生成する方法(与えられた平均、分散、相関度)


53

これが少し基本的すぎるように思える場合は申し訳ありませんが、ここで理解を確認しようとしているだけだと思います。2つのステップでこれを行う必要があるという感覚が得られ、相関行列を理解しようとし始めましたが、実際には複雑に見え始めています。相関乱数を生成するための、理想的で迅速な優れた方法の簡潔な説明を(理想的には擬似コードソリューションへのヒントとともに)探しています。

既知の平均と分散を持つ2つの疑似ランダム変数の高さと重み、および特定の相関関係を考えると、この2番目のステップがどのように見えるかを基本的に理解しようとしていると思います。

   height = gaussianPdf(height.mean, height.variance)
   weight = gaussianPdf(correlated_mean(height.mean, correlation_coefficient), 
                        correlated_variance(height.variance, 
                        correlation_coefficient))
  • 相関平均と分散を計算するにはどうすればよいですか?しかし、ここで本当に関連する問題であることを確認したいと思います。
  • マトリックス操作に頼る必要がありますか?それとも、この問題に対する基本的なアプローチに何か他の非常に間違ったものがありますか?

1
私があなたを正しく理解しているかどうかはわかりませんが、「相関平均と分散」を計算する必要はありません。変数が二変量正規であると仮定している場合、個々の平均と分散および相関を指定するだけで十分です。これに使用したい特定のソフトウェアはありますか?
mark999


回答:


44

あなたの質問「良い、相関乱数を生成するための理想的な簡単な方法」を答えるために:与えられた目的の分散共分散行列の定義によって正定値であること、それのコレスキー分解がある: = ; は下三角行列です。C L L T LCCLLTL

この行列を使用して、相関のないランダム変数ベクトル投影すると、結果の投影は、相関ランダム変数の投影になります。X Y = L XLXY=LX

ここでなぜこれが起こるかについての簡潔な説明を見つけることができます。


ありがとう!これは非常に役に立ちました。私は少なくとも次に見なければならないことについて、より良い感覚を持っていると思います。
ジョセフワイスマン

7
この方法は(質問で指定されている)ガウス分布にのみ適用されますか、または他の分布に従う相関変数の生成に使用できますか?そうでない場合、その場合に使用できる方法を知っていますか?
user000001

1
@マイケル:はい。が有効な共分散行列であると述べたが、コレスキー分解が最も速い方法です。また、(対称)平方根得ることができるの行列 SVDを使用して(そう、から)それはよりなり高価すぎる。X C C = X X = X X T X = U S 0.5 V T C = U S V TCXCC=XX=XXTX=US0.5VTC=USVT
usεr11852が復活モニック言う

1
@マイケル:もちろん。それらの共分散は(ほぼ)同じであり、数値そのものではありません。
usεr11852が復活モニック言う

1
@Sid:実際の行全体でサポートされていない連続配布は、すぐに失敗します。私たちは一様使用している場合たとえば、、私たちは「相関数字は」になることを保証することはできません。同様に、ポアソンの場合、非離散的な数値になります。また、分布の和がまだ同じ分布(例えば加算されていない任意の分布 -distributionが生じない -distributions)も失敗します。言及されたすべての場合において、生成された数値はに従って相関されますが、開始された分布とは一致しません。[ 0 1 ] T T CU[0,1][0,1]ttC
usεr11852が回復モニック言います

36

@ user11852、@ jem77bfpへの+1、これらは良い答えです。別の観点からこれにアプローチさせてください。それは実際には必ずしも良いと思うからではなく、有益だと思うからです。すでにわかっているいくつかの関連する事実を以下に示します。

  1. 両方の回帰直線の傾きであり、 X及び Yはれる標準化、すなわち、 N0 1 rXYN(0,1)
  2. は、 Xの分散に起因する Yの分散の割合です。 r2YX



    (また、分散規則から):

  3. ランダム変数の分散に定数を乗じたものは、定数の2乗に元の分散を掛けたものです
    Var[aX]=a2Var[X]
  4. 分散add、つまり、2つの確率変数の合計の分散(独立していると仮定)は、2つの分散の合計です
    Var[X+ε]=Var[X]+Var[ε]

ここで、これらの4つの事実を組み合わせて、母集団に特定の相関(より適切にはρ)がある2つの標準正規変数を作成できますが、生成するサンプルにはさまざまなサンプル相関があります。アイデアは、疑似ランダム変数、作成することであるX、通常の規格である、N0 1 、次いで係数を見つけ、および誤差分散、V族E、ようにY N0 2 + v e、ここrρXN(0,1)aveYN(0,a2+ve)。(これが機能するために | a | 1 以下でなければならず、さらに a = rあることに注意してください。)したがって、必要な rから始めます。それは、あなたの係数です。次に、必要な誤差分散を計算します。これは 1 - r 2です。(ソフトウェアで標準偏差を使用する必要がある場合は、その値の平方根を取ります。)最後に、生成した各擬似ランダム変量 x iに対して、擬似ランダム誤差変量 e iを生成しますa2+ve=1|a| 1a=rra1r2xiei、適切な誤差分散を使用して、乗算と加算を行うことにより、相関擬似乱数変量y iを計算します。 veyi

Rでこれを実行したい場合は、次のコードが役に立ちます。

correlatedValue = function(x, r){
  r2 = r**2
  ve = 1-r2
  SD = sqrt(ve)
  e  = rnorm(length(x), mean=0, sd=SD)
  y  = r*x + e
  return(y)
}

set.seed(5)
x = rnorm(10000)
y = correlatedValue(x=x, r=.5)

cor(x,y)
[1] 0.4945964

0

繰り返しますが、これは最も単純な形式であり、相関変数のペアを生成することしかできません(これはスケールアップできますが、く高速になります)。Rでは、MASSパッケージで?mvrnormを使用することをお勧めします。これは、それが簡単であり、特定の母集団相関行列を使用して多くの変数を生成できるためです。それにもかかわらず、私はこのプロセスをいくつかの基本原則が簡単な方法でどのように機能するかを見るために歩いてみる価値があると思います。


この本質的に回帰的なアプローチは、任意の数の既存の X「予測子」と相関する1つのランダムYを生成できるようにすることで特に便利です。私はそのような理解で正しいですか?
ttnphns

これは、必要な変数@ttnphns間の相関関係のパターンによって異なります。これを次々に繰り返すことができますが、退屈になります。特定のパターンで多数の相関変数を作成するには、コレスキー分解を使用することをお勧めします。
gung-モニカの復職

gung、Choleskyを使用して、いくつかの既存の(シミュレートされていない)X との相関ベクトルに従って、1つのY相関(おおよそメソッドのように)を生成する方法を知っていますか?
ttnphns

@ttnphns、あなたはすべての事前に指定された母集団相関を持つp変数のセットではなく、与えられた母集団相関とXのセットを持つ単一のYを生成したいですか?簡単な方法は、回帰方程式を記述してXから単一のYハットを生成し、上記の方法を使用してYハットの相関としてYを生成することです。必要に応じて、新しい質問をすることができます。
gung-モニカの復職

1
これが私の最初のコメントで私が意味したことです。この方法は、あなたが答えで話すことの直接的な拡張であり、本質的に回帰(ハット)方法です。
ttnphns

16

一般に、これは簡単なことではありませんが、共変量行列と平均ベクトルを入力するだけの多変量正規変数生成用のパッケージ(少なくともRではmvrnormMASSパッケージを参照)があると思います。

(X1,X2)F(x1,x2)Fx2

FX1(x1)=F(x1,x2)dx2.
FX11FX1ξ1[0,1]x^1=FX11(ξ)

F(x1,x2)x1=x^1

F(x2|X1=x^1)=F(x^1,x2)fX1(x^1),
fX1X1FX1(x1)=fX1(x1)

ξ2[0,1]ξ1F(x2|X1=x^1)x^2=(F(x2|X1=x^1))1(ξ)x^2F(x^2|X1=x^1)=ξ

ユニフォーム変数を逆確率分布関数にプラグインする意味がわからない場合は、単変量のケースのスケッチを作成し、逆関数の幾何学的解釈が何であるかを覚えてください。


スマートなアイデア!シンプルで直感的な魅力があります。しかし、はいは計算量が多いようです。
MichaelChirico

fX,Y(x,y)=fX(x)fY|X(y)

1

効率を放棄する準備ができている場合は、使い捨てのアルゴリズムを使用できます。その利点は、ガウス分布だけでなく、あらゆる種類の分布を可能にすることです。

{xi}i=1N{yi}i=1NC

1)相関係数計算するcold=corr({xi},{yi})

n1n2:1n1,2N

3)数値入れ替えるxn1xn2

cnew=corr({xi},{yi})

|Ccnew|<|Ccold|

|Cc|<ϵ

xi

幸運を!


xicorr(xi,yi)

xi{xi}ycorr(xi,yi)corr({xi},{yi})=(1/N)Σi=1N(xix¯)(yyy¯)

{}corr({xi},{yi})
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.