たとえばR
、のMASS::mvrnorm()
関数は、統計のさまざまなことを示すデータを生成するのに役立ちます。Sigma
変数の共分散行列を指定する対称行列である必須引数を取ります。任意のエントリを持つ対称行列を作成するにはどうすればよいですか?
たとえばR
、のMASS::mvrnorm()
関数は、統計のさまざまなことを示すデータを生成するのに役立ちます。Sigma
変数の共分散行列を指定する対称行列である必須引数を取ります。任意のエントリを持つ対称行列を作成するにはどうすればよいですか?
回答:
任意の値で 行列Aを作成します
そして、共分散行列としてを使用します。
例えば
n <- 4
A <- matrix(runif(n^2)*2-1, ncol=n)
Sigma <- t(A) %*% A
Sigma <- A + t(A)
。
私が作成したオブジェクトは、それらがarbitrary意的であっても、制御したいのです。
次に、考えられるすべての共分散行列Σが次の形式で表現できることを考慮してください。
ここで、直交行列であり、σ 1 ≥ σ 2 ≥ ⋯ ≥ σ N ≥ 0。
幾何学的にこれは、の範囲と共分散構造を記述する主成分サイズの。これらのコンポーネントは、Pの行の方向を指します。n = 3の例については、主成分分析、固有ベクトル、および固有値の理解の図を参照してください。設定σ iは、それによって、任意の所望の楕円形状を決定する、共分散の大きさとそれらの相対的なサイズを設定しますします。Pの行は、必要に応じて形状の軸を方向付けます。
一代数このアプローチの利点を計算する際にすることである、Σは容易に反転する(共分散行列に共通の動作です)。
だけの大きさの範囲について、方向性を気にしないでください?それは問題ありません:ランダムな直交行列を簡単に生成できます。n 2 iidの標準法線値を正方行列にラップし、それを直交化します。ほぼ確実に機能します(nが大きくない場合)。このコードのように、QR分解はそれを行います
n <- 5
p <- qr.Q(qr(matrix(rnorm(n^2), n)))
これは、そのように生成された変量多重正規分布が「楕円」であるために機能します。これは、すべての回転および反射(原点を通る)で不変です。したがって、3次元単位球の表面に均一に分布した点を生成する方法で議論したように、すべての直交行列は均一に生成されます。。
crossprod
R
Sigma <- crossprod(p, p*(5:1))
svd(Sigma)
Sigma
Tau <- crossprod(p, p/(5:1))
zapsmall(Sigma %*% Tau)
svd(Sigma)
が並べ替えられることを言及する価値があるかもしれません-それはちょっと私を混乱させました。
そのための特別なパッケージがあります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()
、行列を正定値にするために使用することです。