例如,在R
中的MASS::mvrnorm()
功能对于生成数据以演示统计中的各种情况很有用。它采用强制性Sigma
参数,该参数是一个对称矩阵,用于指定变量的协方差矩阵。如何创建带有任意条目的对称矩阵?
例如,在R
中的MASS::mvrnorm()
功能对于生成数据以演示统计中的各种情况很有用。它采用强制性Sigma
参数,该参数是一个对称矩阵,用于指定变量的协方差矩阵。如何创建带有任意条目的对称矩阵?
Answers:
创建具有任意值的 矩阵
然后使用作为协方差矩阵。
例如
n <- 4
A <- matrix(runif(n^2)*2-1, ncol=n)
Sigma <- t(A) %*% A
Sigma <- A + t(A)
。
我喜欢控制我创建的对象,即使它们可能是任意的。
然后考虑所有可能的协方差矩阵可以表示为Σ
其中是正交矩阵,。σ 1 ≥ σ 2 ≥ ⋯ ≥ σ Ñ ≥ 0
在几何上,这描述了具有一系列大小为的主分量的协方差结构。这些分量指向的行的方向。有关示例,请参见“理解主成分分析,特征向量和特征值”中的图。设置将设置协方差的大小及其相对大小,从而确定任何所需的椭圆形状。的行可根据您的喜好定向形状的轴。 P Ñ = 3 σ 我 P
这种方法的代数和计算优势是,当,很容易反转(这是对协方差矩阵的常见运算):Σ
不关心方向,仅关心的大小范围?很好:您可以轻松生成随机正交矩阵。只需将 iid标准正态值包装到一个方矩阵中,然后对其正交即可。几乎可以肯定会工作(假设不大)。如代码所示,QR分解将完成此操作
n <- 5
p <- qr.Q(qr(matrix(rnorm(n^2), n)))
之所以起作用,是因为这样生成的变量多正态分布是“椭圆形”的:在所有旋转和反射(通过原点)下,它都是不变的。因此,所有正交矩阵都是均匀生成的,正如如何在3-d单位球面上生成均匀分布的点所讨论的那样?。
一旦指定或创建了从和获得快速方法,就可以在算术运算中使用和利用数组的重用,如本示例中的:crossprod
R
Sigma <- crossprod(p, p*(5:1))
作为检查,奇异值分解应同时返回和。您可以使用以下命令进行检查
svd(Sigma)
Sigma
当然,仅通过将乘以的乘法更改为除法即可获得逆:
Tau <- crossprod(p, p/(5:1))
您可以通过查看来验证这一点zapsmall(Sigma %*% Tau)
,它应该是身份矩阵。甲广义逆(对于回归计算必要的)通过替换获得的任何由,如上述完全相同,但保持之中的任何零原样。
svd(Sigma)
将重新排序-一分钟让我感到困惑。
您可以使用广泛使用的软件包“ stats”中的函数“ rWishart”,从Wishart分布中模拟随机正定矩阵。
n <- 4
rWishart(1,n,diag(n))
有一个专门用于此的程序包clusterGeneration
(由该领域的知名人士Harry Joe编写)。
有两个主要功能:
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()
使矩阵为正定的。