Wie kann ich Daten mit einer vorgegebenen Korrelationsmatrix generieren?

19

Ich versuche, eine korrelierte Zufallsfolge mit dem Mittelwert = , der Varianz = und dem Korrelationskoeffizienten = zu erzeugen . Im folgenden Code verwende ich & als Standardabweichung und & als Mittel.010.8s1s2m1m2

p = 0.8 
u = randn(1, n)
v = randn(1, n)
x = s1 * u + m1
y = s2 * (p * u + sqrt(1 - p^2) * v) + m2

Das gibt mir die richtige corrcoef()von 0,8 zwischen xund y. Meine Frage ist, wie ich eine Serie generieren kann, heißt, wenn ich will, zdass das auch korreliert ist y(mit der gleichen Korrelation ), aber nicht mit . Gibt es eine bestimmte Formel, die ich kennen muss? Ich habe einen gefunden , konnte ihn aber nicht verstehen.r=0.8x

anisa
quelle

Antworten:

21

Offenbar fragen Sie sich, wie Daten mit einer bestimmten Korrelationsmatrix generiert werden sollen.

Eine nützliche Tatsache ist, dass, wenn Sie einen Zufallsvektor mit Kovarianzmatrix , der Zufallsvektor Mittelwert und Kovarianzmatrix . Wenn Sie also mit Daten beginnen, deren Mittelwert Null ist, ändert das Multiplizieren mit nichts daran, sodass Ihre erste Anforderung leicht erfüllt wird. A x A E ( x ) Ω = AA T AxΣEINxEINE(x)Ω=EINΣEINTEIN

Angenommen, Sie sind mit (Mittelwert Null) unkorrelierte Daten beginnen (dh die Kovarianzmatrix ist diagonal) - da wir über die Korrelationsmatrix sprechen, lassen Sie sich einfach nehmen . Sie können dies in Daten mit einer bestimmten Kovarianzmatrix umwandeln, indem Sie als cholesky Quadratwurzel von auswählen. Dann hätte die gewünschte Kovarianzmatrix .A Ω A x ΩΣ=ichEINΩEINxΩ

In Ihrem Beispiel möchten Sie anscheinend Folgendes:

Ω=(1.80.81.80.81)

Leider ist diese Matrix nicht eindeutig positiv, daher kann es sich nicht um eine Kovarianzmatrix handeln. Sie können dies überprüfen, indem Sie feststellen, dass die Determinante negativ ist. Vielleicht stattdessen

Ω=(1.8.3.81.8.3.81)    Or   Ω=(12/302/312/302/31)

würde genügen. Ich bin mir nicht sicher, wie ich die Cholesky-Quadratwurzel in Matlab berechnen soll (das scheint das zu sein, was Sie verwenden), aber in können RSie die chol()Funktion verwenden.

In diesem Beispiel wären für die beiden oben aufgelisteten s die richtigen Matrix-VielfachenΩ

EIN=(100.8.60.3.933.1972)    Or   EIN=(1002/3.74530089444472)

Der dazu verwendete RCode war:

x = matrix(0,3,3)
x[1,]=c(1,.8,.3)
x[2,]=c(.8,1,.8)
x[3,]=c(.3,.8,1)
t(chol(x))

     [,1]      [,2]      [,3]
[1,]  1.0 0.0000000 0.0000000
[2,]  0.8 0.6000000 0.0000000
[3,]  0.3 0.9333333 0.1972027

x[1,]=c(1,2/3,0)
x[2,]=c(2/3,1,2/3)
x[3,]=c(0,2/3,1)
t(chol(x))

      [,1]      [,2]      [,3]
[1,] 1.0000000 0.0000000 0.0000000
[2,] 0.6666667 0.7453560 0.0000000
[3,] 0.0000000 0.8944272 0.4472136
Makro
quelle
1
Die MATLAB-Funktion wird auch aufgerufen chol. Beachten Sie, dass dies numerisch sehr instabil sein kann, wenn fast singulär ist. In diesem Fall ist die Verwendung der symmetrischen Quadratwurzel, die z. B. über die SVD erhalten wird, häufig eine bessere Wahl hinsichtlich der numerischen Stabilität. :)Ω
Kardinal
1
Natürlich stimmt das @ cardinal - viele theoretisch begründete Dinge gehen schief, wenn Sie versuchen, Dinge numerisch mit fast singulären Matrizen zu tun. Ich stellte mir (bequemerweise) die Situation vor, in der sich die Zielkorrelationsmatrix nicht in dem Bereich befand, in dem dies ein Problem war. Es ist gut, dass Sie darauf hingewiesen haben - danke (und danke für die Bearbeitung meiner anderen Antwort)
Makro
1
Der Hauptgrund, warum ich darüber nachdachte, war Ihr scharfes Auge, als Sie erkannten, dass der erste Vorschlag des OP nicht einmal eindeutig positiv war. Und hoffentlich war die Bearbeitung der anderen Frage nicht übereifrig; Diese beiden Antworten gefallen mir.
Kardinal
7

Wenn Sie R verwenden, können Sie auch die Funktion mvrnorm aus dem MASS-Paket verwenden, sofern Sie normalverteilte Variablen wünschen. Die Implementierung ähnelt der obigen Beschreibung von Macro, verwendet jedoch die Eigenvektoren der Korrelationsmatrix anstelle der Cholesky-Zerlegung und Skalierung mit einer Singular-Wert-Zerlegung (wenn die empirische Option auf true gesetzt ist).

XΣγλΣ

X=γλXT

ΣX

Beachten Sie, dass die Korrelationsmatrix eindeutig positiv sein muss, aber eine Konvertierung mit der Funktion nearPD aus dem Matrix-Paket in R ist hilfreich.

zzk
quelle
1

ΣyxΣx=ichΣyΛV

Σy=VΛVT=(VΛ)(ΛTVT)=EINEINT

y=EINx

Mario Sansone
quelle