임의 공분산 행렬을 만드는 방법


22

예를 들면, R상기 MASS::mvrnorm()함수는 다양한 통계 것을 입증하는 데이터를 생성하는 데 유용하다. Sigma변수의 공분산 행렬을 지정하는 대칭 행렬 인 필수 인수가 필요 합니다. 임의의 항목 으로 대칭 행렬을 어떻게 만듭니 까?n×n


3
이 질문은 "임의 공분산 행렬을 만드는 방법"에 중점을두고 편집 ​​측면에서는 덜 중점을 두도록 편집하면 도움이 될 것이라고 생각합니다. 대답에 의해 입증 된 바와 같이 확실히 주제에 관한 기본 통계 문제가 있습니다.
Silverfish

답변:


23

임의의 값으로 행렬 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 : 귀하의 제안은 대칭 행렬을 생성하지만 항상 양의 반올림은 아니지만 (예를 들어 귀하의 제안은 음의 고유 값을 갖는 행렬을 생성 할 수 있습니다) 공분산 행렬로 적합하지 않을 수 있습니다
Henry

예, 제안 된 방법으로 부적절한 행렬을 생성하면 R이 오류를 반환한다는 것을 알았습니다.
rsl

4
더 나은 해석 성을 위해 상관 행렬을 선호하는 경우 ? cov2cor 함수 가 있으며,이 함수는 이후에 적용 할 수 있습니다.
gung-모니 티 복원

1
n>2

27

임의의 개체 일지라도 내가 만든 개체를 제어하고 싶습니다.

그러므로 모든 가능한 고려하십시오.n×nΣ

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

Pσ1σ2σn0

σiPn=3σiP

σn>0Σ

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

σin2n

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

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

1
단수 값 svd(Sigma)이 재정렬 될 것이라는 점을 언급 할 가치 가 있습니다.
FrankD

@ whuber n : crossprod (p, p * (n : 1))를 parametrize하는 코드 줄을 편집하십시오. 재현성을 높이기 위해 좋은 답변입니다!
Cristóbal Alcázar

@ CristóbalAlcázar 귀하의 의견에 감사드립니다. 이것은 구체적인 예이며 일반적인 목적을위한 것이 아니기 때문에 값을 하드 코딩 된 상태로 유지하는 것이 가장 좋습니다.
whuber

1

널리 사용되는 패키지 "stats"의 "rWishart"함수를 사용하여 Wishart 분포에서 무작위 양수 한정 행렬을 시뮬레이션 할 수 있습니다.

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

1

그것을 위해 특별히 패키지가 있습니다 clusterGeneration(해리 조가 그 분야에서 큰 이름을 썼습니다).

두 가지 주요 기능이 있습니다.

  • 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.