Entferne Ausreißer aus der Korrelationskoeffizientenberechnung

8

Nehmen wir an, wir haben zwei numerische Vektoren x und y . Der Pearson-Korrelationskoeffizient zwischen x und y ist gegeben durch

  

cor (x, y)

Wie kann ich automatisch nur eine Teilmenge von x und y in der Berechnung berücksichtigen (zB 90%), um den Korrelationskoeffizienten zu maximieren?

    
Leo 12.01.2011, 08:20
quelle

5 Antworten

22

Wenn Sie wirklich dies tun möchten (entfernen Sie die größten (absoluten) Residuen), dann können wir das lineare Modell zur Schätzung der kleinsten Quadrate und der zugehörigen Residuen verwenden und dann die mittlere n% auswählen der Daten. Hier ist ein Beispiel:

Zuerst einige Dummy-Daten generieren:

%Vor%

Als nächstes passen wir das lineare Modell an und extrahieren die Residuen:

%Vor%

Die Funktion quantile() kann uns die erforderlichen Quantile der Residuen geben. Sie haben vorgeschlagen, 90% der Daten beizubehalten, also wollen wir die oberen und unteren 0,05 Quantile:

%Vor%

Wählen Sie diese Beobachtungen mit Residuen in den mittleren 90% der Daten aus:

%Vor%

Wir können dies dann visualisieren, wobei die roten Punkte diejenigen sind, die wir beibehalten werden:

%Vor%

Die Korrelationen für die vollständigen Daten und die ausgewählte Teilmenge sind:

%Vor%

Seien Sie sich bewusst, dass wir hier sehr gute Daten rauswerfen, weil wir nur die 5% mit den größten positiven Residuen und die 5% mit dem größten Negativ auswählen. Eine Alternative ist die Auswahl der 90% mit kleinsten absoluten Residuen:

%Vor%

Bei dieser etwas anderen Teilmenge ist die Korrelation etwas geringer:

%Vor%

Ein weiterer Punkt ist, dass wir selbst dann gute Daten rauswerfen. Sie sollten sich Cooks Entfernung als Maß für die Stärke der Ausreißer ansehen und nur die Werte oberhalb einer bestimmten Cook-Distanz verwerfen. Wikipedia hat Informationen über Cooks Entfernung und vorgeschlagene Schwellenwerte. Die Funktion cooks.distance() kann verwendet werden, um die Werte von mod :

abzurufen %Vor%

und wenn Sie die auf Wikipedia vorgeschlagenen Schwellenwerte berechnen und nur diejenigen entfernen, die den Schwellenwert überschreiten. Für diese Daten:

%Vor%

keiner der Cook-Abstände überschreitet die vorgeschlagenen Schwellenwerte (nicht überraschend angesichts der Art, wie ich die Daten generiert habe.)

Nachdem Sie das alles gesagt haben, warum wollen Sie das tun? Wenn Sie nur versuchen, Daten loszuwerden, um eine Korrelation zu verbessern oder eine signifikante Beziehung zu generieren, klingt das ein bisschen fischig und etwas wie Daten, die mich ausbaggern.

    
Gavin Simpson 12.01.2011, 09:49
quelle
15

Die Verwendung von method = "spearman" in cor ist robust gegenüber Kontaminationen und einfach zu implementieren, da nur cor(x, y) durch cor(x, y, method = "spearman") ersetzt werden muss.

Wenn wir die Prasad-Analyse wiederholen, aber stattdessen Spearman-Korrelationen verwenden, stellen wir fest, dass die Spearman-Korrelation in der Tat robust gegenüber der Kontamination ist und die zugrundeliegende Null-Korrelation wiederherstellt:

%Vor%     
G. Grothendieck 12.01.2011 13:30
quelle
9

Das mag dem OP schon klar gewesen sein, aber nur um sicher zu gehen ... Sie müssen vorsichtig sein, denn der Versuch, die Korrelation zu maximieren, kann dazu tendieren, Ausreißer einzubeziehen. (@Gavin hat diesen Punkt in seiner Antwort / Kommentare berührt.) Ich würde zuerst sein, um Ausreißer zu entfernen, dann um eine Korrelation zu berechnen. Allgemeiner wollen wir eine Korrelation zu Ausreißern berechnen (und es gibt viele solcher Methoden in R).

Um dies drastisch zu veranschaulichen, erstellen wir zwei Vektoren, die unkorreliert sind: x :

%Vor%

Nun fügen wir einen Ausreißerpunkt hinzu y :

%Vor%

Jetzt ist die Korrelation der beliebigen Teilmenge, die den Ausreißerpunkt enthält, nahezu 100%, und die Korrelation einer ausreichend großen Teilmenge, die den Ausreißer ausschließt, wird nahe bei Null liegen. Insbesondere

%Vor%

Wenn Sie eine "wahre" Korrelation schätzen möchten, die nicht auf Ausreißer reagiert, können Sie das (500,500) -Paket ausprobieren:

%Vor%

Sie können mit Parametern von robust herumspielen, um zu entscheiden, wie Sie die Daten trimmen. UPDATE: Es gibt auch covRob (robuste lineare Regression) im Paket rlm .

    
Prasad Chalasani 12.01.2011 12:22
quelle
4

Hier ist eine weitere Möglichkeit, die Ausreißer zu erfassen. Mit einem ähnlichen Schema wie Prasad:

%Vor%

In den anderen Antworten steckte 500 am Ende von x und y als Ausreißer. Das kann oder kann nicht zu einem Speicherproblem mit Ihrem Computer führen, also habe ich es auf 4 reduziert, um das zu vermeiden.

%Vor%

Hier sind die Bilder von den x1, y1, xy1 Daten:

    
bill_080 13.01.2011 00:42
quelle
2

Sie könnten versuchen, Ihre Daten zu laden, um den höchsten Korrelationskoeffizienten zu finden, z. B .:

%Vor%

Und nach dem Lauf max(boot.cor) . Seien Sie nicht enttäuscht, wenn alle Korrelationskoeffizienten alle gleich sind:)

    
daroczig 12.01.2011 08:55
quelle

Tags und Links