事前に指定された相関行列を使用してデータを生成するにはどうすればよいですか?


19

平均=、分散=、相関係数=相関ランダムシーケンスを生成しようとしています。以下のコードでは、標準偏差として&を使用し、平均として&を使用しています。1 0.8010.8s1s2m1m2

p = 0.8 
u = randn(1, n)
v = randn(1, n)
x = s1 * u + m1
y = s2 * (p * u + sqrt(1 - p^2) * v) + m2

これによりcorrcoef()xとの間の0.8が正確になりyます。私が欲しい場合、私は、一連の手段を生成することができますどのように私の質問はzそれがまたと相関しているy(同じ相関でr=0.8)ではなく、とx。知っておく必要がある特定の式はありますか?私が見つかりました。一つが、それを理解できませんでした。


回答:


21

特定の相関行列でデータを生成する方法を尋ねているようです。

便利な事実であること、あなたがランダムなベクトルを持っている場合はとの共分散行列Σ、その後、ランダムなベクトルAのX持つ平均A E Xと共分散行列Ω = A Σ A T。したがって、平均がゼロのデータから始めても、Aを掛けてもそれは変わらないため、最初の要件は簡単に満たされます。 xΣAxAE(x)Ω=AΣATA

(平均ゼロ)無相関データ(つまり、共分散行列は対角線)から始めましょう-相関行列について話しているので、単に取ります。AΩのコレスキー平方根として選択することにより、これを所定の共分散行列を持つデータに変換できます。その場合、A xは所望の共分散行列Ωを持ちます。Σ=IAΩAxΩ

あなたの例では、次のようなものが欲しいようです:

Ω=(1.80.81.80.81)

残念ながら、その行列は正定ではないため、共分散行列にはなりません。行列式が負であることを確認することでこれを確認できます。おそらく、代わりに

Ω=(1.8.3.81.8.3.81)    or   Ω=(12/302/312/302/31)

十分でしょう。matlabでコレスキー平方根を計算する方法はわかりません(これは使用しているように見えます)がRchol()関数を使用できます。

この例では、上記の2つのに対して、適切な行列の倍数(それぞれ)はΩ

A=(100.8.60.3.933.1972)    or   A=(1002/3.745300.8944.4472)

これRに到達するために使用されるコードは次のとおりです。

x = matrix(0,3,3)
x[1,]=c(1,.8,.3)
x[2,]=c(.8,1,.8)
x[3,]=c(.3,.8,1)
t(chol(x))

     [,1]      [,2]      [,3]
[1,]  1.0 0.0000000 0.0000000
[2,]  0.8 0.6000000 0.0000000
[3,]  0.3 0.9333333 0.1972027

x[1,]=c(1,2/3,0)
x[2,]=c(2/3,1,2/3)
x[3,]=c(0,2/3,1)
t(chol(x))

      [,1]      [,2]      [,3]
[1,] 1.0000000 0.0000000 0.0000000
[2,] 0.6666667 0.7453560 0.0000000
[3,] 0.0000000 0.8944272 0.4472136

1
MATLAB関数は、とも呼ばれますcholがほぼ特異な場合、これは非常に数値的に不安定になることに注意してください。その場合、SVDなどを介して取得された対称平方根を使用することが、数値安定性の観点からしばしばより良い選択です。:)Ω
枢機

1
もちろん、それは正しい@cardinalです-ほぼ特異な行列を使用して数値的に処理しようとすると、理論的に正当化された多くのことがうまくいきません。私は(都合の良いことに)これが問題となる領域にターゲット相関行列が存在しない状況を想像していました。あなたがこれを指摘したことは良いことです-ありがとう(そして、私の他の答えへの編集に感謝します)
マクロ

1
私がこれについて考えていた主な理由は、OPの最初の提案が明確なものでさえないことを認識した鋭い目によるものでした。そして、うまくいけば、他の質問の編集が熱心ではなかった。私はこれら両方の答えが好きです。
枢機

7

Rを使用している場合、正規分布変数が必要であると仮定して、MASSパッケージのmvrnorm関数も使用できます。実装は上記のマクロの説明に似ていますが、コレスキー分解と特異値分解によるスケーリングの代わりに相関行列の固有ベクトルを使用します(経験的オプションがtrueに設定されている場合)。

が正規分布から引き出されたエントリをもつ行列の場合、Σは固有ベクトルγをもつ正定相関行列であり、λは対角に沿ったΣからの平方根固有値を持つ正方行列です。バツΣγλΣ

バツ=γλバツT

Σバツ

相関行列は正定である必要がありますが、RのMatrixパッケージのnearPD関数を使用して変換すると便利です。


1

ΣyバツΣバツ=ΣyΛV

Σy=VΛVT=VΛΛTVT=AAT

y=Aバツ

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