如何创建任意协方差矩阵


21

例如,在R中的MASS::mvrnorm()功能对于生成数据以演示统计中的各种情况很有用。它采用强制性Sigma参数,该参数是一个对称矩阵,用于指定变量的协方差矩阵。如何创建带有任意条目的对称矩阵?ñ×ñ


3
我认为这个问题将受益于将其编辑为专注于“如何创建任意协方差矩阵”,而不是编码方面。正如答案所表明的,这里肯定存在一个潜在的统计问题。
银鱼

Answers:


22

创建具有任意值的n×n 矩阵A

然后使用作为协方差矩阵。 Σ=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

我喜欢控制我创建的对象,即使它们可能是任意的。

然后考虑所有可能的协方差矩阵可以表示为Σn×nΣ

Σ=P Diagonal(σ1,σ2,,σn) P

其中是正交矩阵,。σ 1σ 2σ Ñ0Pσ1σ2σn0

在几何上,这描述了具有一系列大小为的主分量的协方差结构。这些分量指向的行的方向。有关示例,请参见“理解主成分分析,特征向量和特征值”中的图。设置将设置协方差的大小及其相对大小,从而确定任何所需的椭圆形状。的行可根据您的喜好定向形状的轴。 P Ñ = 3 σ PσiPn=3σiP

这种方法的代数和计算优势是,当,很容易反转(这是对协方差矩阵的常见运算):Σσn>0Σ

Σ1=P Diagonal(1/σ1,1/σ2,,1/σn) P.

不关心方向,仅关心的大小范围?很好:您可以轻松生成随机正交矩阵。只需将 iid标准正态值包装到一个方矩阵中,然后对其正交即可。几乎可以肯定会工作(假设不大)。如代码所示,QR分解将完成此操作σin2n

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

之所以起作用,是因为这样生成的变量多正态分布是“椭圆形”的:在所有旋转和反射(通过原点)下,它都是不变的。因此,所有正交矩阵都是均匀生成的,正如如何在3-d单位球面上生成均匀分布的点所讨论的那样?n

一旦指定或创建了从和获得快速方法,就可以在算术运算中使用和利用数组的重用,如本示例中的:ΣPσicrossprodRσ=(σ1,,σ5)=(5,4,3,2,1)

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

作为检查,奇异值分解应同时返回和。您可以使用以下命令进行检查σP

svd(Sigma)

Sigma当然,仅通过将乘以的乘法更改为除法即可获得逆:σ

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

您可以通过查看来验证这一点zapsmall(Sigma %*% Tau),它应该是身份矩阵。甲广义逆(对于回归计算必要的)通过替换获得的任何由,如上述完全相同,但保持之中的任何零原样。n×nσi01/σiσi


可能有助于演示如何使用的行将轴定向为首选方向。P
gung-恢复莫妮卡

1
可能值得一提的是,其中的奇异值svd(Sigma)将重新排序-一分钟让我感到困惑。
FrankD


1

有一个专门用于此的程序包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()使矩阵为正定的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.