So erstellen Sie eine beliebige Kovarianzmatrix


21

Zum Beispiel ist Rdie MASS::mvrnorm()Funktion in nützlich, um Daten zu generieren, um verschiedene Dinge in der Statistik zu demonstrieren. Ein obligatorisches SigmaArgument ist eine symmetrische Matrix, die die Kovarianzmatrix der Variablen angibt. Wie würde ich eine symmetrische Matrix mit beliebigen Einträgen erstellen ?n×n


3
Ich denke, dass diese Frage von einer Bearbeitung profitieren würde, um sich auf "Wie kann ich eine beliebige Kovarianzmatrix erstellen?" Und weniger auf den Codierungsaspekt zu konzentrieren. Wie die Antwort zeigt, liegt hier mit Sicherheit ein statistisches Problem zu einem bestimmten Thema zugrunde.
Silverfish

Antworten:


22

Erstelle eine Matrix mit beliebigen WertenAn×nA

Verwenden Sie dann als Kovarianzmatrix. Σ=ATA

Beispielsweise

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

Ebenso Sigma <- A + t(A).
RSL

6
@MoazzemHossen: Ihr Vorschlag wird eine symmetrische Matrix erzeugen, aber es kann sein, dass sie nicht immer positiv und semidefinit ist (z. B. könnte Ihr Vorschlag eine Matrix mit negativen Eigenwerten erzeugen) und daher möglicherweise nicht als Kovarianzmatrix geeignet ist
Henry,

Ja, ich habe festgestellt, dass R einen Fehler zurückgibt, falls meine vorgeschlagene Methode eine ungeeignete Matrix erzeugt.
RSL

4
Beachten Sie, dass, wenn Sie eine Korrelationsmatrix für eine bessere Interpretierbarkeit bevorzugen , die Funktion ? Cov2cor vorhanden ist, die anschließend angewendet werden kann.
gung - Reinstate Monica

1
@ B11b: Du brauchst deine Kovarianzmatrix, um positiv semidefinit zu sein. Dies würde den Kovarianzwerten einige Grenzen setzen, nicht ganz offensichtliche, wennn>2
Henry,

24

Ich habe gerne die Kontrolle über die Objekte, die ich erstelle, auch wenn sie willkürlich sind.

Man bedenke also, dass alle möglichen Kovarianzmatrizen in der Form ausgedrückt werden könnenΣn×nΣ

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

Dabei ist eine orthogonale Matrix und .σ 1σ 2σ n0Pσ1σ2σn0

Geometrisch beschreibt dies eine Kovarianzstruktur mit einer Reihe von Hauptkomponenten der Größen . Diese Komponenten weisen in die Richtung der Reihen von . Beispiele mit Sie in den Abbildungen unter Erklären von Hauptkomponentenanalyse, Eigenvektoren und Eigenwerten . Durch Einstellen von werden die Größen der Kovarianzen und ihre relativen Größen festgelegt, wodurch eine beliebige Ellipsoidform bestimmt wird. Die Reihen richten die Achsen der Form nach Ihren Wünschen aus. P n = 3 σ i PσiPn=3σiP

Ein algebraischer und rechnerischer Vorteil dieses Ansatzes besteht darin, dass, wenn , leicht invertiert wird (was eine übliche Operation für Kovarianzmatrizen ist):Σσn>0Σ

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

Kümmern Sie sich nicht um die Richtungen, sondern nur um die Größenbereiche des ? Das ist in Ordnung: Sie können leicht eine zufällige orthogonale Matrix erzeugen. Wickle einfach iid Normwerte in eine quadratische Matrix und orthogonalisiere sie. Es wird fast sicher funktionieren (vorausgesetzt, ist nicht riesig). Die QR-Dekomposition erledigt dies wie in diesem Coden 2 nσin2n

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

Dies funktioniert, weil die so erzeugte Multinormalverteilung mit Variablen "elliptisch" ist: Sie ist bei allen Rotationen und Reflexionen (durch den Ursprung) invariant. Somit werden alle orthogonalen Matrizen gleichmäßig erzeugt, wie unter Wie werden gleichmäßig verteilte Punkte auf der Oberfläche der 3D-Einheitskugel erzeugt? .n

Eine schnelle Methode, um aus und , nachdem Sie sie angegeben oder erstellt haben, verwendet und nutzt die Wiederverwendung von Arrays in arithmetischen Operationen, wie in diesem Beispiel mit :P σ i σ = ( σ 1 , , σ 5 ) = ( 5 , 4 , 3 , 2 , 1 )ΣPσicrossprodRσ=(σ1,,σ5)=(5,4,3,2,1)

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

Zur Überprüfung sollte die Singularwertzerlegung sowohl als auch . Sie können es mit dem Befehl überprüfenP σP

svd(Sigma)

Die Umkehrung Sigmaerhält man natürlich nur, indem man die Multiplikation mit in eine Division :σ

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

Sie können dies überprüfen, indem Sie zapsmall(Sigma %*% Tau)die Identitätsmatrix anzeigen. Eine verallgemeinerte Inverse (wesentlich für Regressionsberechnungen) wird erhalten, indem jedes durch , genau wie oben, wobei alle Nullen unter dem so wie sie waren.σ i0 1 / σ i σ in×nσi01/σiσi


Es kann hilfreich sein, zu demonstrieren, wie die Zeilen von , um die Achsen wie bevorzugt auszurichten. P
gung - Reinstate Monica

1
Erwähnenswert wäre, dass die einzelnen Werte in svd(Sigma)neu geordnet werden - das hat mich eine Minute verwirrt.
FrankD

1

Sie können zufällige positiv definierte Matrizen aus der Wishart-Distribution mit der Funktion "rWishart" aus dem weit verbreiteten Paket "stats" simulieren.

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

1

Es gibt ein spezielles Paket dafür clusterGeneration(geschrieben unter anderem von Harry Joe, einem großen Namen auf diesem Gebiet).

Es gibt zwei Hauptfunktionen:

  • genPositiveDefMat Generieren Sie eine Kovarianzmatrix, 4 verschiedene Methoden
  • rcorrmatrix : Korrelationsmatrix erzeugen

Ein kurzes Beispiel:

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

Erstellt am 27.10.2019 durch das Paket reprex (v0.3.0)

Beachten Sie schließlich, dass ein alternativer Ansatz darin besteht, einen ersten Versuch von Grund auf durchzuführen und dann Matrix::nearPD()Ihre Matrix positiv zu definieren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.