Erzeugen von korrelierten Zahlen

8

Hier ist ein Spaß: Ich muss zufällige x / y-Paare erzeugen, die bei einem gegebenen Wert von Pearson-Produkt korreliert sind Momentenkorrelationskoeffizient oder Pearson r . Man kann sich dies als zwei Arrays vorstellen, Array X und Array Y, wobei die Werte von Array X und Array Y neu erzeugt, umgeordnet oder transformiert werden müssen, bis sie auf einer gegebenen Ebene von Pearson r miteinander korreliert sind. Hier ist der Kicker: Array X und Array Y müssen einheitliche Verteilungen sein.

Ich kann das mit einer normalen Verteilung machen, aber die Werte zu transformieren, ohne die Verteilung zu verzerren, hat mich ratlos gemacht. Ich habe versucht, die Werte in den Arrays neu zu ordnen, um die Korrelation zu erhöhen, aber ich werde Arrays nie bei 1,00 oder -1,00 durch Sortieren erhalten.

Irgendwelche Ideen?

-

Hier ist der AS3-Code für zufällig korrelierte Gaussianer, damit sich die Räder drehen:

%Vor%     
Gideon 11.11.2009, 20:41
quelle

6 Antworten

5

Ich schrieb ein kurzes Papier dazu

Es enthält nicht Ihre Sortiermethode (obwohl in der Praxis denke ich, dass es ähnlich wie meine erste Methode auf Umwegen ist), beschreibt aber zwei Wege, die keine Iteration erfordern.

    
andrew cooke 22.11.2009, 22:33
quelle
1

Hier ist eine Implementierung des Algorithmus von twolfe18, der in Actionscript 3 geschrieben wurde:

%Vor%

boxMuller ist nur eine Methode, die ein zufälliges Gaussian mit den Argumenten (mean, stdDev) erzeugt. size ist die Größe der Verteilung.

Beispielausgabe

%Vor%

Wie Sie sehen können, bin ich immer noch weit davon entfernt. Irgendwelche Vorschläge?

    
Gideon 12.11.2009 05:51
quelle
1

Diese scheinbar einfache Frage hat mich seit gestern Abend durcheinander gebracht! Ich suchte nach dem Thema, Verteilungen mit einer Abhängigkeit zu simulieren, und das Beste, was ich fand, war: simulierte abhängige Zufallsvariablen . Der Kern davon ist, Sie können 2 Normalen mit gegebener Korrelation leicht simulieren, und sie skizzieren eine Methode, um diese nicht-unabhängigen Normalen zu transformieren, aber dies wird die Korrelation nicht bewahren. Die Korrelation der Transformation wird sozusagen korreliert, aber nicht identisch. Siehe den Abschnitt "Rangkorrelationskoeffizienten".

Edit: Ausgehend von dem, was ich im zweiten Teil des Artikels erfahre, würde die Copula-Methode erlauben, Zufallsvariablen mit Rangkorrelation zu simulieren / generieren.

    
Mathias 12.11.2009 18:15
quelle
1

Beginnen Sie mit dem Modell y = x + e , wobei e der Fehler ist (eine normale Zufallsvariable). e sollte einen Mittelwert von 0 und Varianz k haben.

Lange Rede kurzer Sinn, Sie können eine Formel für den Erwartungswert des Pearson als k schreiben und für k auflösen. Beachten Sie, dass Sie Daten mit dem Pearson nicht genau mit einem bestimmten Wert erzeugen können, sondern nur mit dem erwarteten Pearson-Wert.

Ich werde versuchen, zurück zu kommen und diesen Beitrag zu bearbeiten, um eine geschlossene Formularlösung zu enthalten, wenn ich Zugang zu etwas Papier habe.

EDIT: ok, ich habe eine Hand-wellige Lösung, die wahrscheinlich korrekt ist (aber zur Bestätigung muss getestet werden). Nehmen wir jetzt an, dass Pearson = p > 0 gewünscht ist (Sie können den Fall p < 0 herausfinden). Wie bereits erwähnt, setze dein Modell auf Y = X + E ( X ist einheitlich, E ist normal).

  1. Beispiel, um Ihre xs
  2. zu erhalten
  3. berechnen var (x)
  4. die Varianz von E sollte sein: (1/(rsd(x)))^2 - var(x)
  5. erzeuge deine y basierend auf deinen x und sample aus deiner normalen Zufallsvariablen E

für p < 0 , set Y = -X + E . verfahren Sie entsprechend.

Grundsätzlich folgt dies aus der Definition von Pearson: cov (x, y) / var (x) * var (y). Wenn Sie Rauschen zu den Xs hinzufügen ( Y = X + E ), sollte sich die erwartete Kovarianz cov (x, y) nicht von der ohne Rauschen ändern. Die Variable (x) ändert sich nicht. das var (y) ist die Summe von var (x) und var (e), daher meine Lösung.

ZWEITE BEARBEITUNG: ok, ich muss die Definitionen besser lesen. Die Definition von Pearson ist cov (x, y) / (sd (x) sd (y)). Ich denke, der wahre Wert von var (E) sollte (1 / (r sd (x))) ^ 2 - var (x) sein. Schau, ob das funktioniert.

    
twolfe18 11.11.2009 21:19
quelle
1

Um eine Korrelation von 1 zu erhalten, sollten sowohl X als auch Y gleich sein, also kopiere X nach Y und du hast eine Korrelation von 1. Um eine -1 Korrelation zu erhalten, mach Y = 1 - X. [0,1])

    
Peter Lawrey 17.11.2009 20:12
quelle
0

Ein seltsames Problem erfordert eine seltsame Lösung - hier ist, wie ich es gelöst habe.

-Generiere Array X

-Clone-Array X zum Erstellen von Array Y

-Sortierfeld X (Sie können die Methode verwenden, die Sie zum Sortieren von Array X verwenden möchten - quicksort, heapsort alles stabil.)

- Messen Sie den Startlevel von Pearsons R mit Array X sortiert und Array Y unsortiert.

%Vor%

Und das ist es! Combsort ist der wahre Schlüssel, es hat die Wirkung, die Korrelation langsam und stetig zu erhöhen. Schauen Sie sich Jason Harrisons Demo an, um zu sehen, was ich meine. Um eine negative Korrelation zu erhalten, können Sie die Sortierung invertieren oder eines der Arrays invertieren, nachdem der gesamte Prozess abgeschlossen ist.

Hier ist meine Implementierung in AS3:

%Vor%     
Gideon 19.11.2009 20:35
quelle