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 ≥ ⋯ ≥ σ n ≥ 0 .Pσ1≥σ2≥⋯≥σn≥0

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 σ i ≠ 0 ile 1 adet / σ i olarak yukarıdaki, ama arasında herhangi bir sıfır tutmak σ I de olduğu gibi.n×nσi≠01/σ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.