Jak stworzyć dowolną macierz kowariancji

21

Na przykład, w RThe MASS::mvrnorm()Funkcja ta jest przydatna do generowania danych, aby wykazać różne rzeczy w statystykach. Bierze obowiązkowy Sigmaargument, który jest macierzą symetryczną określającą macierz kowariancji zmiennych. Jak utworzyć symetryczną macierz z dowolnymi wpisami?n×n

rsl
źródło
3
Myślę, że to pytanie przydałoby się zredagowania, aby skupić się na „jak stworzyć dowolną macierz kowariancji”, a mniej na aspekcie kodowania. Na pewno istnieje tutaj tematyczny problem statystyczny, na co wskazuje odpowiedź.
Silverfish

Odpowiedzi:

22

Utwórz macierz A o dowolnych wartościachn×nA

a następnie użyj jako macierzy kowariancji. Σ=ATA

Na przykład

n <- 4  
A <- matrix(runif(n^2)*2-1, ncol=n) 
Sigma <- t(A) %*% A
Henz
źródło
Podobnie Sigma <- A + t(A).
rsl
6
@MoazzemHossen: Twoja sugestia wytworzy macierz symetryczną, ale nie zawsze może być dodatnia półfinał (np. Twoja sugestia może wytworzyć matrycę z ujemnymi wartościami własnymi) i dlatego może nie być odpowiednia jako macierz kowariancji
Henry
Tak, zauważyłem, że R zwraca błąd w przypadku, gdy mój sugerowany sposób wytworzył nieodpowiednią matrycę.
rsl
4
Zauważ, że jeśli wolisz macierz korelacji dla lepszej interpretacji, istnieje funkcja ? Cov2cor , którą można zastosować później.
gung - Przywróć Monikę
1
@ B11b: Potrzebujesz macierzy kowariancji, aby była dodatnia na półokreślona. To ograniczyłoby pewne wartości kowariancji, nie do końca oczywiste, gdy n>2
Henry
24

Lubię mieć kontrolę nad obiektami, które tworzę, nawet jeśli mogą one być dowolne.

Rozważmy zatem, że wszystkie możliwe macierze kowariancji Σ można wyrazić w postacin×nΣ

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

gdzie jest macierzą ortogonalną, a σ 1σ 2σ n0 .Pσ1σ2σn0

Geometrycznie opisuje to strukturę kowariancji z zakresem głównych składników wielkości . Składniki te wskazują w kierunkach rzędami P . Zobacz liczby w Analiza sensu analizy głównych składowych, wektorów własnych i wartości własnych dla przykładów z n = 3 . Ustawienie Ď i ustawi wielkości tych kowariancji i ich względnych rozmiarów, a tym samym ustalenia dowolny kształt elipsoidalny. Rzędy P orientują osie kształtu według własnego uznania.σiPn=3σiP

Jedną z korzyści algebraicznych i obliczeniowych tego podejścia jest to, że gdy , Σ jest łatwo odwracane (co jest powszechną operacją na macierzach kowariancji):σn>0Σ

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

Nie przejmujesz się kierunkami, a jedynie zakresami rozmiarów ? W porządku: możesz łatwo wygenerować losową macierz ortogonalną. Wystarczy owinąć n 2 standardowe wartości normalne w macierz kwadratową, a następnie ortogonalizować. Prawie na pewno zadziała (pod warunkiem, że n nie jest ogromny). Dokonuje tego rozkład QR, jak w tym kodzieσin2n

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

Działa to, ponieważ wygenerowany w ten sposób -zmienny rozkład wielomianowy jest „eliptyczny”: jest niezmienny we wszystkich rotacjach i odbiciach (poprzez pochodzenie). Zatem wszystkie ortogonalne macierze są generowane równomiernie, jak argumentowano w Jak generować równomiernie rozmieszczone punkty na powierzchni sfery jednostkowej 3-d? .n

Szybki sposób na uzyskanie z P i σ i , po ich określeniu lub utworzeniu, wykorzystuje i wykorzystuje ponowne użycie tablic w operacjach arytmetycznych, jak w tym przykładzie z σ = ( σ 1 , , σ 5 ) = ( 5 , 4 , 3 , 2 , 1 ) :ΣPσicrossprodRσ=(σ1,,σ5)=(5,4,3,2,1)

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

W ramach kontroli rozkład wartości w liczbie pojedynczej powinien zwracać zarówno jak i P . Możesz to sprawdzić za pomocą poleceniaσP

svd(Sigma)

Odwrotność Sigmaoczywiście uzyskuje się jedynie przez zmianę mnożenia przez na dzielenie:σ

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

Możesz to sprawdzić, przeglądając zapsmall(Sigma %*% Tau), która powinna być matrycą tożsamości . Uogólnione odwrotny (niezbędne do obliczenia regresji) otrzymuje się przez zastąpienie któregokolwiek σ i0 o 1 / σ I , dokładnie tak, jak powyżej, ale zachowując wszystkie zera między Ď i jak są.n×nσi01/σiσi

Whuber
źródło
Pomoże to zademonstrować, jak używać rzędów do orientowania osi zgodnie z preferencjami. P
gung - Przywróć Monikę
1
Warto wspomnieć, że osobne wartości svd(Sigma)zostaną ponownie uporządkowane - to mnie na chwilę pomyliło.
FrankD
1

Możesz symulować losowe dodatnie określone macierze z rozkładu Wishart przy użyciu funkcji „rWishart” z szeroko stosowanego pakietu „stats”.

n <- 4
rWishart(1,n,diag(n))
Carlos Llosa
źródło
1

Specjalnie do tego jest pakiet clusterGeneration(napisany między innymi przez Harry'ego Joe, wielkie nazwisko w tej dziedzinie).

Istnieją dwie główne funkcje:

  • genPositiveDefMat wygenerować macierz kowariancji, 4 różne metody
  • rcorrmatrix : generuj macierz korelacji

Szybki przykład:

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

Utworzono 27.10.2019 przez pakiet reprezentx (v0.3.0)

Na koniec zwróć uwagę, że alternatywnym podejściem jest wykonanie pierwszej próby od zera, a następnie użycie jej Matrix::nearPD()do określenia dodatniej macierzy.

Matifou
źródło