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.s1
s2
m1
m2
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 x
und y
. Meine Frage ist, wie ich eine Serie generieren kann, heißt, wenn ich will, z
dass 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.x
Antworten:
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 ) Ω = A ≤ A T Ax Σ A x A E( x ) Ω = A Σ AT EIN
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 ΩΣ = ich EIN Ω A x Ω
In Ihrem Beispiel möchten Sie anscheinend Folgendes:
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
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
R
Sie diechol()
Funktion verwenden.In diesem Beispiel wären für die beiden oben aufgelisteten s die richtigen Matrix-VielfachenΩ
Der dazu verwendete
R
Code war:quelle
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. :)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).
Beachten Sie, dass die Korrelationsmatrix eindeutig positiv sein muss, aber eine Konvertierung mit der Funktion nearPD aus dem Matrix-Paket in R ist hilfreich.
quelle
quelle