特定の相関行列でデータを生成する方法を尋ねているようです。
便利な事実であること、あなたがランダムなベクトルを持っている場合はとの共分散行列Σ、その後、ランダムなベクトル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でコレスキー平方根を計算する方法はわかりません(これは使用しているように見えます)がR
、chol()
関数を使用できます。
この例では、上記の2つのに対して、適切な行列の倍数(それぞれ)はΩ
A=⎛⎝⎜1.8.30.6.93300.1972⎞⎠⎟ or A=⎛⎝⎜12/300.7453.894400.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