Ich möchte eine zufällige Korrelationsmatrix einer Größe von erzeugen, so dass einige mäßig starke Korrelationen vorliegen:
- quadratische reelle symmetrische Matrix von Größe, mit zB ;
- positiv-definit, dh mit allen Eigenwerten real und positiv;
- voller Rang;
- alle diagonalen Elemente sind gleich ;
- Nicht diagonale Elemente sollten einigermaßen gleichmäßig auf . Die genaue Verteilung spielt keine Rolle, aber ich hätte gerne eine mäßig große Menge (z. B. ) von mäßig großen Werten (z. B. mit einem absoluten Wert von oder höher). Grundsätzlich möchte ich sicherstellen, dass ist nicht fast diagonal mit allen off-diagonalen Elemente .
Gibt es eine einfache Möglichkeit, dies zu tun?
Der Zweck besteht darin, solche Zufallsmatrizen zu verwenden, um einige Algorithmen zu vergleichen, die mit Korrelations- (oder Kovarianz-) Matrizen arbeiten.
Methoden, die nicht funktionieren
Hier sind einige Möglichkeiten, um zufällige Korrelationsmatrizen zu generieren, von denen ich weiß, die hier jedoch nicht funktionieren:
Erzeuge zufälliges von Größe, zentriere, standardisiere und bilde die Korrelationsmatrix . Wenn, führt dies im Allgemeinen dazu, dass alle nicht diagonalen Korrelationen um. Wenn, sind einige Korrelationen stark, aberhat nicht den vollen Rang.
Generiere zufällige positive definite Matrix auf eine der folgenden Arten:
Erzeuge ein zufälliges Quadrat und mache einen symmetrischen positiven Punkt B = A A ⊤ .
Generiere das zufällige Quadrat , mache symmetrisch E = A + A + und mache es positiv, indem du die Eigenzerlegung E = U S U ⊤ durchführst und alle negativen Eigenwerte auf Null setzt: B = U . Hinweis: Dies führt zu einer Matrix mit Rangdefizit.
Generiere zufälliges orthogonales (z. B. durch Generieren des zufälligen Quadrats A und Ausführen seiner QR-Zerlegung oder über den Gram-Schmidt-Prozess) und zufällige Diagonale D mit allen positiven Elementen; Form B = Q D Q ⊤ .
Erhaltenen Matrix leicht normalisiert werden kann alle diejenigen haben auf der Diagonale: C = D - 1 / 2 B D - 1 / 2 , wobei D = d i a g ist die Diagonalmatrix mit den gleichen Diagonalenwie B . Alle drei oben aufgeführten Wege zur Erzeugung von B führen dazu, dass C nicht diagonale Elemente nahe 0 hat .
Update: Ältere Threads
Nach dem Posten meiner Frage habe ich in der Vergangenheit zwei fast doppelte gefunden:
- Wie kann eine zufällige Korrelationsmatrix erzeugt werden, die ungefähr normalverteilte Einträge außerhalb der Diagonale mit gegebener Standardabweichung aufweist?
- Wie können zufällige positiv-semidefinite Korrelationsmatrizen effizient generiert werden?
Leider enthielt keiner dieser Threads eine zufriedenstellende Antwort (bis jetzt :)
quelle
nXk
W erzeugen , die nicht völlig zufällig ist, sondern diejenige, die wir wollen (sie wirdWW'+diag(noise)
die gesuchte cov-Matrix definieren. Die einzige Aufgabe besteht darin, das spaltennormierte W (dh das k) zu korrigieren "Eigenvektoren"), um orthogonal zu werden. Jede Methode zur Dekorrelation korrelierter Variablen (hier sind Variablen die Eigenvektoren) wird dies wahrscheinlich tun. (Dies ist eineAntworten:
Andere Antworten lieferten nette Tricks, um mein Problem auf verschiedene Arten zu lösen. Ich habe jedoch einen prinzipiellen Ansatz gefunden, der meiner Meinung nach den großen Vorteil hat, dass er konzeptionell sehr klar und einfach anzupassen ist.
In diesem Thread: Wie können zufällige positiv-semidefinite Korrelationsmatrizen effizient generiert werden? - Ich habe den Code für zwei effiziente Algorithmen zur Erzeugung zufälliger Korrelationsmatrizen beschrieben und bereitgestellt. Beide stammen aus einem Artikel von Lewandowski, Kurowicka und Joe (2009), auf den @ssdecontrol in den obigen Kommentaren Bezug genommen hat (vielen Dank!).
In meiner Antwort finden Sie viele Abbildungen, Erklärungen und Matlab-Code. Das sogenannte "vine" -Verfahren ermöglicht die Erzeugung zufälliger Korrelationsmatrizen mit beliebiger Verteilung von Teilkorrelationen und kann zur Erzeugung von Korrelationsmatrizen mit großen Werten außerhalb der Diagonale verwendet werden. Hier ist das Beispiel aus diesem Thread:
Das einzige, was sich zwischen Unterplots ändert, ist ein Parameter, der steuert, wie stark sich die Verteilung der Teilkorrelationen um .± 1
Ich kopiere meinen Code, um diese Matrizen auch hier zu generieren, um zu zeigen, dass er nicht länger ist als die anderen hier vorgeschlagenen Methoden. In meiner verknüpften Antwort finden Sie einige Erklärungen. Die Werte50 , 20 , 10 , 5 , 2 , 1 100
betaparam
für die obige Abbildung betrugen (und die Dimensionalität betrug 100 ).d
Update: Eigenwerte
@psarka fragt nach den Eigenwerten dieser Matrizen. In der Abbildung unten zeichne ich die Eigenwertspektren derselben sechs Korrelationsmatrizen wie oben. Beachten Sie, dass sie allmählich abnehmen; Im Gegensatz dazu führt die von @psarka vorgeschlagene Methode im Allgemeinen zu einer Korrelationsmatrix mit einem großen Eigenwert, der Rest ist jedoch ziemlich einheitlich.
Aktualisieren. Wirklich einfache Methode: mehrere Faktoren
Ähnlich wie @ttnphns in den obigen Kommentaren und @GottfriedHelms in seiner Antwort schrieb, besteht ein sehr einfacher Weg, um mein Ziel zu erreichen, darin, zufällig mehrere ( ) Faktorladungen W (Zufallsmatrix von k × n Größe) zu erzeugen , aus der Kovarianzmatrix W W ⊤ (die natürlich nicht den vollen Rang hat) und füge dazu eine zufällige Diagonalmatrix D mit positiven Elementen hinzu, um B = W W ⊤ + D zu erhaltenk < n W k × n W W⊤ D B = W W⊤+ D voller Rang. Die resultierende Kovarianzmatrix kann normalisiert werden, um eine Korrelationsmatrix zu werden (wie in meiner Frage beschrieben). Das ist sehr einfach und macht den Trick. Hier sind einige beispielhafte Korrelationsmatrizen für :k = 100 , 50 , 20 , 10 , 5 , 1
Der einzige Nachteil ist, dass die resultierende Matrix große Eigenwerte und dann einen plötzlichen Abfall aufweist, im Gegensatz zu einem guten Zerfall, der oben mit der Vine-Methode gezeigt wurde. Hier sind die entsprechenden Spektren:k
Hier ist der Code:
quelle
W
orthogonal sind (dh Kosinus zwischen ihnen ist 0). Es reichtW
natürlich nicht aus, einfach einen Zufallsgenerator zu erstellen. Wenn sie nicht orthogonal sind - dh Faktoren sind schräg (Anruf dannW
alsW_
) - Faktor Satz nichtWW'
aberW_CW_'
mitC
„Korrelationen“ (Cosinus) zwischen Faktoren zu sein. Nun,C=Q'Q
mitQ
der nichtorthogonalen Rotationsmatrix der RotationW_=inv(Q)'W
(und so weiterW=W_Q'
). Generiere someQ
- eine Matrix mit der Spalte ss = 1 und der Matrix ss = Größe der Matrix.W_=inv(Q)'W
natürlich nichtW_= W inv(Q)'
.W = replicate(k, rnorm(d)); S = W%*%t(W) + diag(rnorm(d),nrow=d); S = diag(1/sqrt(diag(S)))%*%S%*%diag(1/sqrt(diag(S)))
S <- matrix(nearPD(S, corr = TRUE, keepDiag = TRUE)$mat@x,ncol(S),ncol(S))
quelle
crs
Hmm, nachdem ich ein Beispiel in meiner MatMate-Sprache gemacht habe, sehe ich, dass es bereits eine Python-Antwort gibt, was vielleicht vorzuziehen ist, weil Python weit verbreitet ist. Aber weil Sie noch Fragen hatten, zeige ich Ihnen meinen Ansatz mit der Matmate-Matrix-Sprache, vielleicht ist er selbstkommentierender.
Methode 1
(mit MatMate):
Das Problem hier könnte sein, dass wir Blöcke von Submatrizen definieren, die hohe Korrelationen mit geringer Korrelation aufweisen, und dies nicht programmatisch, sondern durch die konstanten Verkettungsausdrücke. Vielleicht könnte dieser Ansatz eleganter in Python modelliert werden.
Methode 2 (a)
Danach gibt es einen völlig anderen Ansatz, bei dem wir die mögliche verbleibende Kovarianz in zufälligen Mengen von 100 Prozent in eine Faktor-Ladungsmatrixfüllen. Dies geschieht in Pari / GP:
und die erzeugte Korrelationsmatrix ist
Möglicherweise erzeugt dies eine Korrelationsmatrix mit dominanten Hauptkomponenten aufgrund der kumulativen Erzeugungsregel für die Faktorladungsmatrix. Es könnte auch besser sein, eine positive Bestimmtheit sicherzustellen, indem der letzte Teil der Varianz zu einem einzigartigen Faktor gemacht wird. Ich habe es im Programm belassen, um den Fokus auf das allgemeine Prinzip zu richten.
Eine 100x100-Korrelationsmatrix hatte die folgenden Korrelationshäufigkeiten (auf 1 Dezimalstelle gerundet)
[aktualisieren]. Hmm, die 100x100 Matrix ist schlecht konditioniert; Pari / GP kann die Eigenwerte mit der Polroots (charpoly ()) - Funktion auch mit 200-stelliger Genauigkeit nicht korrekt ermitteln. Ich habe eine Jacobi-Rotation in pca-Form auf der Ladematrix L durchgeführt und dabei meist extrem kleine Eigenwerte gefunden, die ich in Logarithmen zur Basis 10 ausgedruckt habe (die ungefähr die Position des Dezimalpunkts angeben). Lesen Sie von links nach rechts und dann zeilenweise:
[Update 2]
Methode 2 (b)
Eine Verbesserung könnte darin bestehen, die artikelspezifische Varianz auf ein nicht marginales Maß zu erhöhen und auf eine einigermaßen geringere Anzahl gemeinsamer Faktoren zu reduzieren (zum Beispiel ganzzahlige Quadratwurzel der Artikelnummer):
Die Struktur des Ergebnisses
in Bezug auf die Verteilung der Korrelationen:
bleibt ähnlich (auch die böse Nicht-Zerlegbarkeit durch PariGP), aber die Eigenwerte, wenn sie durch jacobi-Rotation der Ladungsmatrix gefunden werden, haben jetzt eine bessere Struktur, für ein neu berechnetes Beispiel habe ich die Eigenwerte als erhalten
quelle
Interessante Frage (wie immer!). Wie wäre es, eine Reihe von Beispielmatrizen zu finden, die die gewünschten Eigenschaften aufweisen, und dann konvexe Kombinationen davon zu verwenden, da wennEIN und B Sind positiv definitiv, dann ist es so λ A + ( 1 - λ ) B . Als Bonus ist keine Neuskalierung der Diagonalen aufgrund der Konvexität der Operation erforderlich. Durch Einstellen derλ Um konzentrierter gegen 0 und 1 zu sein als gleichmäßig verteilt, können Sie die Proben an den Rändern des Polytops oder im Inneren konzentrieren. (Sie können eine Beta / Dirichlet-Verteilung verwenden, um die Konzentration im Vergleich zur Gleichmäßigkeit zu steuern.)
Zum Beispiel könnten Sie lassenEIN komponentensymmetrisch sein und B sein toeplitz. Natürlich können Sie jederzeit eine weitere Klasse hinzufügenC , und nehme λEINA + λBB + λCC so dass ∑ λ = 1 und λ ≥ 0 , und so weiter.
quelle
R hat ein Paket (clusterGeneration) , das die Methode implementiert in:
Beispiel:
Leider scheint es nicht möglich zu sein, Korrelationen zu simulieren, die einer gleichmäßigen Verteilung folgen. Es scheint stärkere Korrelationen herzustellen, wenn
alphad
auf sehr kleine Werte gesetzt wird, aber selbst bei würde1/100000000000000
der Bereich der Korrelationen nur bis zu ungefähr 1,40 reichen.Trotzdem hoffe ich, dass dies für jemanden von Nutzen sein könnte.
quelle