Wie kann eine zufällige Korrelationsmatrix erzeugt werden, die ungefähr normalverteilte nicht diagonale Einträge mit gegebener Standardabweichung aufweist?


11

Ich möchte eine zufällige Korrelationsmatrix erzeugen, so dass die Verteilung ihrer nicht diagonalen Elemente ungefähr aussieht normal . Wie kann ich es tun?

Die Motivation ist dies. Für einen Satz von Zeitreihendaten sieht die Korrelationsverteilung oft ziemlich normal aus. Ich möchte viele "normale" Korrelationsmatrizen generieren, um die allgemeine Situation darzustellen und sie zur Berechnung der Risikonummer zu verwenden.n


Ich kenne eine Methode, aber die resultierende Standardabweichung (der Verteilung der nicht diagonalen Elemente) ist für meinen Zweck zu klein: einheitliche oder normale Zufallszeilen einer Matrix X erzeugen , die Zeilen standardisieren (Mittelwert subtrahieren, durch dividieren Standardabweichung), dann die Probenkorrelationsmatrix 1nXhat normalerweise verteilt off-Diagonaleinträge [Aktualisierungnach Kommentare: Standardabweichung wird~n-1/2].1n1XXn1/2

Kann jemand eine bessere Methode vorschlagen, mit der ich die Standardabweichung steuern kann?


1
@ Richard, danke für deine Frage. Leider erzeugt die oben beschriebene Methode keine Einträge, die normal verteilt sind. Die Diagonalen sind 1 mit der Wahrscheinlichkeit eins und die Off-Diagonalen sind zwischen und + 1 begrenzt . Jetzt konvergieren die neu skalierten Einträge asymptotisch zu einer Normalverteilung um Null. Können Sie uns weitere Informationen zu dem Problem geben, das Sie tatsächlich lösen möchten? Und warum wollen Sie "normalverteilte" Diagonalen? 1+1
Kardinal

1
@Richard, ich meine, angenommen, und Y = ( Y 1 , Y 2 , ... , Y n ) sind zwei unabhängige Vektoren, so dass die Einträge von jedem iid sind Standard normal. Compute ρ n = s x y / ( s x s y ) ; das heißt, die Stichprobenkorrelation zwischen X Y.X.=((X.1,X.2,,X.n)Y.=((Y.1,Y.2,,Y.n)ρ^n=sxy/.((sxsy)X. undY. . Dann konvergiert in Verteilung auf eine Standardnormalzufallsvariable. Mit „neu skaliert“, meinte ich die Multiplikation mit n 1 / 2 das istwas eine nicht entartete Grenzverteilung zu erhaltenisterforderlich. n1/.2ρ^nn1/.2
Kardinal

1
@Richard, das Wesentliche des "Problems" ist, dass Sie durch zwei Einschränkungen (a), dass die Normen jeder Zeile 1 sind und (b) dass die Einträge aus einer Zufallsstichprobe generiert werden, die Korrelationen zwangsläufig ganz erzwingen müssen klein (in der Größenordnung von . der Grund dafür ist , dass man nicht beliebig große Korrelationen zwischen den Reihen haben und immer noch die Normen jeder Reihe bekommen 1 in Gegenwart von so viel Unabhängigkeit zu sein.n- -1/.2
Kardinal

1
...now, you can get larger correlations in magnitude by first correlating the rows among themselves before renormalizing. But, you essentially only have one parameter to play with, so both the asymptotic mean and variance will be tied to that parameter. So, that probably won't give you the flexibility you seem to want, either.
cardinal

1
Sure, let's take a simple case. Call the generating matrix X, which we'll assume to be m×n without loss of generality. Now, generate the columns of X as i.i.d. vectors such that the elements of each vector are standard normal random variables that are equicorrelated with correlation ρ. Now, use the procedure you have been. Let ρ^ichj denote the sample correlation between the ichth and jth *row* of X.. Then for fixed m, letting n, n1/.2((ρ^ichj- -ρ) converges in distribution to a N.((0,((1- -ρ2)2) random variable.
cardinal

Antworten:


5

I have first provided what I now believe is a sub-optimal answer; therefore I edited my answer to start with a better suggestion.


Using vine method

In this thread: How to efficiently generate random positive-semidefinite correlation matrices? -- I described and provided the code for two efficient algorithms of generating random correlation matrices. Both come from a paper by Lewandowski, Kurowicka, and Joe (2009).

Please see my answer there for a lot of figures and matlab code. Here I would only like to say that the vine method allows to generate random correlation matrices with any distribution of partial correlations (note the word "partial") and can be used to generate correlation matrices with large off-diagonal values. Here is the relevant figure from that thread:

Weinrebenmethode

±1

Nicht diagonale Elemente

Ich denke, diese Verteilungen sind einigermaßen "normal", und man kann sehen, wie die Standardabweichung allmählich zunimmt. Ich sollte hinzufügen, dass der Algorithmus sehr schnell ist. Einzelheiten finden Sie im verknüpften Thread.


Meine ursprüngliche Antwort

Eine einfache Änderung Ihrer Methode kann den Trick tun (abhängig davon, wie nahe die Verteilung an der Normalität liegen soll). Diese Antwort wurde von den obigen Kommentaren von @ cardinal und von der Antwort von @ psarka auf meine eigene Frage inspiriert Wie kann eine große zufällige Korrelationsmatrix mit vollem Rang und einigen starken Korrelationen erstellt werden?

Der Trick besteht darin, Proben von Ihnen zu machen X.korreliert (keine Merkmale, sondern Stichproben). Hier ein Beispiel: Ich generiere eine ZufallsmatrixX. von 1000×100 Größe (alle Elemente von Standard normal), und fügen Sie dann eine Zufallszahl von hinzu [- -ein/.2,ein/.2]] zu jeder Reihe, z ein=0,1,2,5. Zumein=0 die Korrelationsmatrix X.X. (nach dem Standardisieren der Merkmale) haben nicht diagonale Elemente, die ungefähr normal mit Standardabweichung verteilt sind 1/.1000. Zumein>0Ich berechne die Korrelationsmatrix, ohne die Variablen zu zentrieren (dies behält die eingefügten Korrelationen bei), und die Standardabweichung der nicht diagonalen Elemente wächst mit ein wie in dieser Abbildung gezeigt (Zeilen entsprechen ein=0,1,2,5):

zufällige Korrelationsmatrizen

Alle diese Matrizen sind natürlich eindeutig positiv. Hier ist der Matlab-Code:

offsets = [0 1 2 5];
n = 1000;
p = 100;

rng(42) %// random seed

figure
for offset = 1:length(offsets)
    X = randn(n,p);
    for i=1:p
        X(:,i) = X(:,i) + (rand-0.5) * offsets(offset);
    end
    C = 1/(n-1)*transpose(X)*X; %// covariance matrix (non-centred!)

    %// convert to correlation
    d = diag(C);
    C = diag(1./sqrt(d))*C*diag(1./sqrt(d));

    %// displaying C
    subplot(length(offsets),3,(offset-1)*3+1)
    imagesc(C, [-1 1])

    %// histogram of the off-diagonal elements
    subplot(length(offsets),3,(offset-1)*3+2)
    offd = C(logical(ones(size(C))-eye(size(C))));
    hist(offd)
    xlim([-1 1])

    %// QQ-plot to check the normality
    subplot(length(offsets),3,(offset-1)*3+3)
    qqplot(offd)

    %// eigenvalues
    eigv = eig(C);
    display([num2str(min(eigv),2) ' ... ' num2str(max(eigv),2)])
end

Die Ausgabe dieses Codes (minimale und maximale Eigenwerte) lautet:

0.51 ... 1.7
0.44 ... 8.6
0.32 ... 22
0.1 ... 48

Können Sie den Wert der kleinsten Eigenwerte, die Sie mit dieser Methode erhalten, neben Ihren Plots darstellen?
user603

1
Ohne die Figur zu ändern, kann ich hier einfach schreiben, dass die kleinsten Eigenwerte 0,5, 0,4, 0,3 bzw. 0,1 sind (für jede Zeile meiner Figur). Die größten wachsen von 1,7 auf 48.
Amöbe sagt Reinstate Monica

aber sind dies die Eigenwerte der Korrelationsmatrix oder die von X'X?.
user603

Dies sind die Eigenwerte von my C.Matrix, die normalisiert ist, um diejenigen auf der Diagonale zu haben, - also der Korrelationsmatrix. Ich habe meine Antwort aktualisiert, damit Sie sie im Code sehen können. Darf ich fragen, warum Sie daran zweifeln, dass dies möglich ist? Gibt es einen Grund zu der Annahme, dass große Korrelationsmatrizen sehr kleine nicht diagonale Elemente haben sollten?
Amöbe sagt Reinstate Monica

Ich denke nicht, dass es unmöglich ist, ich konnte es einfach nicht aus dem Code
ersehen


1

Wenn Sie versuchen, zufällige Korrelationsmatrizen zu generieren, ziehen Sie eine Stichprobe aus der Wishart-Verteilung in Betracht. Diese folgende Frage enthält Informationen zur Wishart-Verteilung sowie Hinweise zur Stichprobe: Wie lassen sich zufällige positiv-semidefinite Korrelationsmatrizen effizient generieren?


Aber kann man die Standardabweichung der resultierenden nicht diagonalen Elemente mit Parametern der Wishart-Verteilung steuern? Wenn das so ist, wie?
Amöbe sagt Reinstate Monica

1

Dies ist keine sehr raffinierte Antwort, aber ich kann nicht anders, als zu denken, dass es immer noch eine gute Antwort ist ...

Wenn Ihre Motivation darin besteht, dass Korrelationsparameter, die durch Zeitreihendaten erzeugt werden, normalerweise normal aussehen, warum nicht einfach Zeitreihendaten simulieren, die Korrelationsparameter berechnen und diese verwenden?

Sie haben vielleicht einen guten Grund, dies nicht zu tun, aber es ist mir aus Ihrer Frage nicht klar.

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.