Es tut mir leid, wenn dies ein bisschen zu grundlegend erscheint, aber ich schätze, ich versuche hier nur, das Verständnis zu bestätigen. Ich habe das Gefühl, dass ich dies in zwei Schritten tun müsste, und ich habe angefangen, Korrelationsmatrizen zu erstellen, aber es scheint erst sehr involviert zu sein. Ich suche eine prägnante Erklärung (idealerweise mit Hinweisen auf eine Pseudocodelösung) für einen guten, idealerweise schnellen Weg, um korrelierte Zufallszahlen zu generieren.
Angesichts zweier Pseudozufallsvariablen Größe und Gewicht mit bekannten Mitteln und Varianzen sowie einer gegebenen Korrelation versuche ich im Grunde zu verstehen, wie dieser zweite Schritt aussehen sollte:
height = gaussianPdf(height.mean, height.variance)
weight = gaussianPdf(correlated_mean(height.mean, correlation_coefficient),
correlated_variance(height.variance,
correlation_coefficient))
- Wie berechne ich den korrelierten Mittelwert und die Varianz? Aber ich möchte bestätigen, dass das hier wirklich das relevante Problem ist.
- Muss ich auf Matrixmanipulation zurückgreifen? Oder habe ich noch etwas sehr Falsches in meiner grundlegenden Herangehensweise an dieses Problem?
probability
correlation
conditional-probability
random-generation
Joseph Weissman
quelle
quelle
Antworten:
Zur Beantwortung Ihrer Frage "Ein guter, idealerweise schneller Weg, um korrelierte Zufallszahlen zu generieren": Bei einer gewünschten Varianz-Kovarianz-Matrix , die per Definition eindeutig positiv ist, ist ihre Cholesky-Zerlegung: = ; ist die untere Dreiecksmatrix.C L L T LC C LLT L
Wenn Sie nun mit dieser Matrix einen unkorrelierten Zufallsvariablenvektor projizieren, ist die resultierende Projektion die von korrelierten Zufallsvariablen.X Y = L XL X Y=LX
Eine kurze Erklärung dafür finden Sie hier .
quelle
+1 an @ user11852 und @ jem77bfp, das sind gute Antworten. Lassen Sie mich dies aus einer anderen Perspektive betrachten, nicht weil ich denke, dass es in der Praxis unbedingt besser ist , sondern weil ich es für lehrreich halte. Hier sind einige relevante Fakten, die wir bereits kennen:
Y Xr2 ist der Anteil der Varianz in der auf die Varianz in , Y X
(auch aus den Regeln für Abweichungen ):
Jetzt können wir diese vier Fakten kombinieren, um zwei normale Standardvariablen zu erstellen, deren Populationen eine bestimmte Korrelation haben, (genauer gesagt ), obwohl die von Ihnen generierten Stichproben unterschiedliche Stichproben-Korrelationen haben. Die Idee ist, eine Pseudozufallsvariable zu erstellen , die normal ist, , und dann einen Koeffizienten und eine Fehlervarianz , so dass , wobei . (Beachten Sie, dass muss, damit dies funktioniert, und dass außerdem .) Sie beginnen also mit demρ X N ( 0 , 1 ) a v e Y ~ N ( 0 , a 2 + v e ) a 2 + v e = 1 | a | ≤ 1 a = r r a 1 - r 2 x i e i v e y ir ρ X N(0,1) a ve Y∼N(0,a2+ve) a2+ve=1 |a| ≤1 a=r r das du willst; das ist dein Koeffizient, . Dann ermitteln Sie die benötigte Fehlervarianz: . (Wenn Ihre Software die Verwendung der Standardabweichung erfordert, nehmen Sie die Quadratwurzel dieses Werts.) Generieren Sie schließlich für jede von Ihnen generierte Pseudozufallsvariable eine Pseudozufallsvariable mit der entsprechenden Fehlervarianz . und die korrelierte Pseudozufallsvariable durch Multiplizieren und Addieren zu berechnen . a 1−r2 xi ei ve yi
Wenn Sie dies in R tun möchten, könnte der folgende Code für Sie funktionieren:
(Edit: Ich habe vergessen zu erwähnen :) Wie ich es beschrieben habe, liefert diese Prozedur zwei normale korrelierte Standardvariablen. Wenn Sie keine Standardnormalen möchten , aber möchten, dass die Variablen bestimmte Mittelwerte (nicht 0) und SDs (nicht 1) haben, können Sie sie transformieren, ohne die Korrelation zu beeinträchtigen. Sie subtrahieren also den beobachteten Mittelwert, um sicherzustellen, dass der Mittelwert genau ist. Multiplizieren Sie die Variable mit der gewünschten SD und addieren Sie dann den gewünschten Mittelwert. Wenn Sie möchten, dass der beobachtete Mittelwert normal um den gewünschten Mittelwert schwankt, würden Sie die anfängliche Differenz zurückaddieren. Dies ist im Wesentlichen eine umgekehrte Z-Score-Transformation. Da es sich um eine lineare Transformation handelt, hat die transformierte Variable dieselbe Korrelation mit der anderen Variablen wie zuvor.0
Auch hier können Sie in der einfachsten Form nur ein Paar korrelierter Variablen generieren (dies könnte skaliert werden, wird aber schnell hässlich) und ist sicherlich nicht die bequemste Methode, um die Aufgabe zu erledigen. In R möchten Sie ? Mvrnorm im MASS- Paket verwenden, da dies einfacher ist und Sie mit einer bestimmten Populationskorrelationsmatrix viele Variablen generieren können. Dennoch finde ich es lohnend, diesen Prozess durchlaufen zu haben, um zu sehen, wie sich einige Grundprinzipien auf einfache Weise auswirken.
quelle
Im Allgemeinen keine einfache Sache zu tun, aber ich glaube , dass es Pakete für sind multivariate Normal variable Generation (zumindest in R finden Sie
mvrnorm
imMASS
Paket), in dem gerade eingegebenen eine Kovarianzmatrix und eine mittlere Vektor.Da wir nun eine Koordinate haben, müssen wir sie in unsere ursprüngliche Verteilungsfunktion und dann eine bedingte Verteilungsfunktion mit der Bedingung : wobei eine Wahrscheinlichkeitsdichtefunktion von ist marginale Verteilung; dh .F(x1,x2) x1=x^1
Dann erzeugen Sie wieder eine gleichmäßig verteilte Variable auf (unabhängig von ) und fügen sie in die Umkehrung von . Daher erhalten Sie ; das heißt, erfüllt . Diese Methode kann auf Vektoren mit mehr Dimensionen verallgemeinert werden, hat jedoch den Nachteil, dass Sie viele Funktionen analytisch oder numerisch berechnen müssen. Die Idee finden Sie auch in diesem Artikel: http://www.econ-pol.unisi.it/dmq/pdf/DMQ_WP_34.pdf .ξ2 [0,1] ξ1 F(x2|X1=x^1) x^2=(F(x2|X1=x^1))−1(ξ) x^2 F(x^2|X1=x^1)=ξ
Wenn Sie die Bedeutung des Einfügens einer einheitlichen Variablen in eine inverse Wahrscheinlichkeitsverteilungsfunktion nicht verstehen, versuchen Sie, eine Skizze des univariaten Falls zu erstellen, und erinnern Sie sich dann an die geometrische Interpretation der inversen Funktion.
quelle
Wenn Sie bereit sind, auf Effizienz zu verzichten, können Sie einen Wegwerfalogorithmus verwenden. Ihr Vorteil ist, dass sie beliebige Distributionen (nicht nur Gauß) zulässt.
Beginnen Sie, indem Sie zwei unkorrelierte Folgen von Zufallszahlen und mit beliebigen Verteilungen erzeugen . Sei durch den gewünschten Wert des Korrelationskoeffizienten. Dann machen Sie folgendes:{xi}Ni=1 {yi}Ni=1 C
1) Berechne den Korrelationskoeffizientencold=corr({xi},{yi})
2) Generiere zwei Zufallszahlen undn1 n2:1≤n1,2≤N
3) Tausche die Zahlen undxn1 xn2
4) Neue Korrelationcnew=corr({xi},{yi})
5) Wenndann den Swap behalten. Andernfalls machen Sie den Swap rückgängig.|C−cnew|<|C−cold|
6) Wenn stop, sonst gehe zu 1)|C−c|<ϵ
Zufällige Swaps verändern die marginale Verteilung von .xi
Viel Glück!
quelle