任意の共分散行列を作成する方法


21

たとえばR、のMASS::mvrnorm()関数は、統計のさまざまなことを示すデータを生成するのに役立ちます。Sigma変数の共分散行列を指定する対称行列である必須引数を取ります。任意のエントリを持つ対称行列を作成するにはどうすればよいですか?n×n


3
この質問は、「任意の共分散行列を作成するにはどうすればよいか」に焦点を合わせて編集することで、コーディングの側面ではなく、恩恵を受けると思います。答えが示すように、ここには確かにトピックに関する基礎的な統計上の問題があります。
シルバーフィッシュ

回答:


22

任意の値で 行列Aを作成しますn×nA

そして、共分散行列としてを使用します。 Σ=ATA

例えば

n <- 4  
A <- matrix(runif(n^2)*2-1, ncol=n) 
Sigma <- t(A) %*% A

同様に、Sigma <- A + t(A)
RSL

6
@MoazzemHossen:あなたの提案が対称行列が生成されますが、それは常に半正定値ではないかもしれない(例えば、あなたの提案は、負の固有値を持つ行列を作り出すことができる)、それは共分散行列として適切でないかもしれないので
ヘンリー

はい、私が提案した方法が不適切な行列を生成した場合、Rはエラーを返すことに気付きました。
rsl

4
解釈性を高めるために相関行列を使用する場合は、?cov2cor関数があり、後で適用できます。
GUNG -復活モニカ

1
@ B11b:共分散行列は半正定である必要があります。これは、共分散値にいくつかの制限をかけることになり、全く明らかでないものときn>2
ヘンリー・

24

私が作成したオブジェクトは、それらがarbitrary意的であっても、制御したいのです。

次に、考えられるすべての共分散行列Σが次の形式で表現できることを考慮してください。n×nΣ

Σ=P 対角線σ1σ2σn P

ここで、直交行列であり、σ 1σ 2σ N0Pσ1σ2σn0

幾何学的にこれは、の範囲と共分散構造を記述する主成分サイズの。これらのコンポーネントは、Pの行の方向を指します。n = 3の例については、主成分分析、固有ベクトル、および固有値の理解の図を参照してください。設定σ iは、それによって、任意の所望の楕円形状を決定する、共分散の大きさとそれらの相対的なサイズを設定しますします。Pの行は、必要に応じて形状の軸を方向付けます。σPn=3σP

一代数このアプローチの利点を計算する際にすることであるΣは容易に反転する(共分散行列に共通の動作です)。σn>0Σ

Σ1=P 対角線1/σ11/σ21/σn P

だけの大きさの範囲について、方向性を気にしないでください?それは問題ありません:ランダムな直交行列を簡単に生成できます。n 2 iidの標準法線値を正方行列にラップし、それを直交化します。ほぼ確実に機能します(nが大きくない場合)。このコードのように、QR分解はそれを行いますσn2n

n <- 5
p <- qr.Q(qr(matrix(rnorm(n^2), n)))

これは、そのように生成された変量多重正規分布が「楕円」であるために機能します。これは、すべての回転および反射(原点を通る)で不変です。したがって、3次元単位球の表面に均一に分布した点を生成する方法で議論したように、すべての直交行列は均一に生成されます。n

ΣPσcrossprodRσ=σ1σ5=54321

Sigma <- crossprod(p, p*(5:1))

σP

svd(Sigma)

Sigmaσ

Tau <- crossprod(p, p/(5:1))

zapsmall(Sigma %*% Tau)n×nσ01/σσ


P

1
の特異値svd(Sigma)が並べ替えられることを言及する価値があるかもしれません-それはちょっと私を混乱させました。
FrankD

1

広く使用されているパッケージ「stats」の関数「rWishart」を使用して、ウィシャート分布からランダムな正定行列をシミュレートできます。

n <- 4
rWishart(1,n,diag(n))

1

そのための特別なパッケージがありますclusterGeneration(他の人の間では、この分野で有名なHarry Joeによって書かれています)。

2つの主な機能があります。

  • genPositiveDefMat 共分散行列を生成する、4つの異なる方法
  • rcorrmatrix :相関行列を生成する

簡単な例:

library(clusterGeneration)
#> Loading required package: MASS
genPositiveDefMat("unifcorrmat",dim=3)
#> $egvalues
#> [1] 15.408962  5.673916  1.228842
#> 
#> $Sigma
#>          [,1]     [,2]     [,3]
#> [1,] 6.714871 1.643449 6.530493
#> [2,] 1.643449 6.568033 2.312455
#> [3,] 6.530493 2.312455 9.028815
genPositiveDefMat("eigen",dim=3)
#> $egvalues
#> [1] 8.409136 4.076442 2.256715
#> 
#> $Sigma
#>            [,1]       [,2]      [,3]
#> [1,]  2.3217300 -0.1467812 0.5220522
#> [2,] -0.1467812  4.1126757 0.5049819
#> [3,]  0.5220522  0.5049819 8.3078880

reprexパッケージ(v0.3.0)によって2019-10-27に作成

最後に、別のアプローチは、最初から最初から試行してからMatrix::nearPD()、行列を正定値にするために使用することです。

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