Keyfi bir kovaryans matrisi nasıl oluşturulur


21

Örneğin, içinde R, MASS::mvrnorm()işlev istatistiklerde çeşitli şeyleri göstermek için veri üretmek için kullanışlıdır. SigmaDeğişkenlerin kovaryans matrisini belirten simetrik bir matris olan zorunlu bir argüman alır . Rasgele girişlerle simetrik bir n×n matrisi nasıl oluştururum ?


3
Bu sorunun "keyfi bir kovaryans matrisi nasıl oluşturabilirim" ve daha az kodlama yönüne odaklanmak için düzenlenmesinden fayda sağlayacağını düşünüyorum. Cevabın gösterdiği gibi, burada kesinlikle konuya ilişkin istatistiksel bir sorun var.
Gümüş Balık

Yanıtlar:


22

Rasgele değerlerle bir n×n matrisi A oluşturun

ve sonra kovaryans matrisiniz olarak kullanın Σ=ATA.

Örneğin

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

Aynı şekilde Sigma <- A + t(A),.
rsl

6
@MoazzemHossen: Öneriniz simetrik bir matris üretecek, ancak her zaman pozitif semidefinit olmayabilir (örneğin, öneriniz negatif özdeğerlere sahip bir matris üretebilir) ve bu nedenle bir kovaryans matrisi olarak uygun olmayabilir
Henry

Evet, önerilen yolumun uygun olmayan matris üretmesi durumunda R'nin hata verdiğini fark ettim.
rsl

4
Daha iyi yorumlanabilirlik için bir korelasyon matrisi tercih ederseniz , daha sonra uygulanabilecek ? Cov2cor fonksiyonunun olduğunu unutmayın.
gung - Monica'yı eski

1
@ B11b: Pozitif yarı-kesin olmak için kovaryans matrisinize ihtiyacınız var. Bu kovaryans değerleri üzerinde bazı sınırlar getirecektir, n>2
Henry

24

Keyfi olsalar bile, oluşturduğum nesneler üzerinde kontrol sahibi olmayı seviyorum.

O halde, tüm olası kovaryans matrislerinin Σ formunda ifade edilebileceğini düşününn×nΣ

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

burada dik bir matris ve σ 1σ 2σ n0 .Pσ1σ2σn0

Geometrik olarak bu, σ i boyutlarında bir dizi temel bileşen içeren bir kovaryans yapısını tarif eder . Bu bileşenler, P sıralarının yönlerini gösterir . N = 3 olan örnekler için Temel bileşen analizini, özvektörleri ve özdeğerlerini anlama konusundaki şekillere bakın . Ayar σ I ve böylece arzu edilen herhangi bir elips şeklini belirlemek, covariances ve göreli boyutları büyüklüğünü ayarlayacaktır. P satırları şeklin eksenlerini tercih ettiğiniz şekilde yönlendirir.σiPn=3σiP

Bu yaklaşımın bir cebirsel ve hesaplama yararı, , Σ kolayca ters çevrilmiş olmasıdır (bu kovaryans matrislerinde ortak bir işlemdir):σn>0Σ

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

Yönleri umurumda değil, sadece boyut aralıkları hakkında ? Bu iyi: kolayca rastgele bir dik matris oluşturabilirsiniz. Standart Normal değerleri n 2 iid kare şeklinde bir matrise sarın ve dikleştirin. Neredeyse kesinlikle işe yarayacak ( n büyük değilse). QR ayrışması bunu bu kodda olduğu gibi yapacakσin2n

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

Bu, bu şekilde üretilen değişken çok-dağılımlı "eliptik" olduğu için çalışır: tüm dönüşler ve yansımalar (başlangıç ​​noktası boyunca) altında değişmez. Böylece, tüm ortogonal matrisler , 3-d birim kürenin yüzeyi üzerinde düzgün dağılmış noktalar nasıl oluşturulur? .n

Hızlı bir yolu elde etmek gelen P ve σ i bunları belirtilen veya oluşturduktan sonra, kullanır ve istismarlara ile bu örnekte olduğu gibi aritmetik operasyonlarda Dizilerin 'ın yeniden kullanımı σ = ( σ 1 , ... , σ 5 ) = ( 5 , 4 , 3 , 2 , 1 ) :ΣPσicrossprodRσ=(σ1,,σ5)=(5,4,3,2,1)

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

Çek olarak Tekil Değer ayrışma hem dönmelidir ve P ' . Bunu komutla inceleyebilirsiniz.σP

svd(Sigma)

SigmaElbette tersi, sadece çarpımı bir bölüme değiştirerek elde edilir :σ

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

Bunu n × n kimlik matrisi zapsmall(Sigma %*% Tau)olması gerekenleri görüntüleyerek doğrulayabilirsiniz . Bir genelleştirilmiş ters (regresyon hesaplamaları için gerekli) bir değiştirilmesi ile elde edilir σ i0 ile 1 adet / σ i olarak yukarıdaki, ama arasında herhangi bir sıfır tutmak σ I de olduğu gibi.n×nσi01/σiσi


Eksenleri tercih edildiği gibi yönlendirmek için sıralarının nasıl kullanılacağını göstermeye yardımcı olabilir . P
gung - Monica'yı eski

1
İçindeki tekil değerlerin svd(Sigma)yeniden sıralanacağından bahsetmeye değer olabilir - bu beni bir dakika karıştırdı.
FrankD

1

Yaygın olarak kullanılan "istatistik" paketindeki "rWishart" işlevini kullanarak Wishart dağılımından rasgele pozitif belirli matrisleri simüle edebilirsiniz.

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

1

Bunun için özel bir paket var, clusterGeneration(Harry Joe tarafından yazılmış, bu alanda büyük bir isim).

İki ana işlev vardır:

  • genPositiveDefMat bir kovaryans matrisi üretme, 4 farklı yöntem
  • rcorrmatrix : bir korelasyon matrisi üret

Hızlı örnek:

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

2019-10-27 tarihinde reprex paketi tarafından oluşturuldu (v0.3.0)

Son olarak, alternatif bir yaklaşımın ilk denemeyi sıfırdan Matrix::nearPD()yapmak olduğunu , ardından matrisinizi pozitif-kesin yapmak için kullanın .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.