Korrelation zwischen zwei Variablen: cor()
Korrelation fragt: Wenn eine Variable steigt, neigt die andere dann auch zum Steigen (positiv), zum Fallen (negativ) oder macht sie ihr eigenes Ding (nahe null)? In R ist das ein Aufruf:
Die Antwort lautet etwa −0,87: Schwerere Autos verbrauchen mehr, und die Beziehung ist stark. Diese eine Zahl ist der Pearson-Korrelationskoeffizient, allgemein als r geschrieben.
r lesen
Der Koeffizient landet immer zwischen −1 und +1. Das Vorzeichen gibt die Richtung, der Betrag die Stärke:
| |r| | Übliche Lesart | | --- | --- | | 0,0 – 0,2 | vernachlässigbar | | 0,2 – 0,4 | schwach | | 0,4 – 0,6 | mäßig | | 0,6 – 0,8 | stark | | 0,8 – 1,0 | sehr stark |
Behandle diese Bänder als Gesprächseinstieg, nicht als Gesetz - in der Physik ist ein r von 0,6 enttäuschend, in der Psychologie ein Karrierehöhepunkt. Zwei Eigenschaften lohnen die Verinnerlichung: r hat keine Einheiten (Gewicht-in-Tonnen mit mpg zu korrelieren ergibt dasselbe r wie Gewicht-in-Kilogramm mit mpg, weil r auf standardisierten Werten berechnet wird), und r misst nur lineare Zusammenhänge - eine perfekt U-förmige Beziehung kann r ≈ 0 haben.
Und der Satz, der gesagt werden muss: Korrelation ist keine Kausalität. Eisverkäufe und Ertrinkungsfälle korrelieren über die Monate eines Jahres stark - nicht weil Eis Menschen ertränkt, sondern weil der Sommer beides antreibt. Eine Korrelation sagt dir, dass sich zwei Variablen gemeinsam bewegen; über das Warum schweigt sie. Vielleicht treibt x das y, vielleicht y das x, vielleicht treibt ein drittes Ding (hier die Jahreszeit) beides. Zwischen diesen Möglichkeiten zu entscheiden braucht Experimente oder sorgfältiges kausales Denken, kein größeres r.
Spearman und Kendall: wenn Pearson das falsche Werkzeug ist
Pearson arbeitet auf den Rohwerten, was es empfindlich gegenüber Ausreißern und blind für gekrümmte Beziehungen macht. Das Argument method wechselt zu rangbasierten Alternativen:
Spearman ersetzt jeden Wert durch seinen Rang und berechnet dann Pearson auf den Rängen. Da y stets steigt, während x steigt, fluchtet jeder Rang und Spearman meldet exakt 1 - die Größe des Ausreißers hört auf zu zählen, nur seine Position bleibt. Greif zu Spearman, wenn die Daten ordinal sind (Umfrageskalen), stark schief, oder wenn die Beziehung monoton, aber nicht geradlinig ist. Kendall beantwortet eine ähnliche Frage über konkordante/diskordante Paare; es ist in kleinen Stichproben robuster, aber langsamer, und Spearman ist die übliche Voreinstellung.
Die Korrelationsmatrix
Um Beziehungen über viele Variablen auf einmal zu überblicken, übergib cor() mehrere numerische Spalten:
Jede Variable gegen jede andere, mit Einsen auf der Diagonale (alles korreliert perfekt mit sich selbst) und einem Spiegelbild daran. Auf zwei Nachkommastellen zu runden zählt mehr, als es klingt - die ungerundete Matrix ist eine Wand aus Ziffern, und der Sinn einer Matrix ist, sie zu überfliegen. Hier zeigt der Überblick, dass mpg mit allen dreien negativ korreliert (schwerere, stärkere Autos mit größeren Motoren verbrauchen mehr Sprit), während wt, hp und disp untereinander alle stark positiv sind - ein Cluster aus "großes Auto"-Variablen, der zählen wird, wenn du zur linearen Regression und ihren Multikollinearitäts-Kopfschmerzen kommst.
Fehlende Werte: das Argument use
Bei fehlenden Daten ist cor()s Voreinstellung, NA zurückzugeben, statt zu raten:
use = "complete.obs"entfernt jede Zeile mit irgendeinemNAund berechnet dann die ganze Matrix aus den Überlebenden. Konsistent, aber verschwenderisch - ein fehlendeswtentfernt diese Zeile auch aus dem Paarmpg–hp.use = "pairwise.complete.obs"berechnet jede Zelle aus allen Zeilen, in denen dieses Paar vorhanden ist. Es behält mehr Daten, aber verschiedene Zellen ruhen auf verschiedenen Teilmengen, was sehr gelegentlich eine intern nicht konsistente Matrix erzeugen kann.
Bei ein paar verirrten NAs ist beides in Ordnung; sag nur, welches du genutzt hast.
Ist es signifikant? cor.test()
cor() liefert eine Zahl, aber kein Gefühl dafür, ob sie Rauschen sein könnte. cor.test() führt den Hypothesentest durch:
Gehen wir die Ausgabe Block für Block durch:
- t = −9.56, df = 30 - die Teststatistik. Die Nullhypothese ist, dass die wahre Korrelation null ist; das beobachtete r wird in eine t-Statistik mit n − 2 Freiheitsgraden umgerechnet (32 Autos − 2).
- p-value = 1.29e-10 - wäre die wahre Korrelation null, läge die Wahrscheinlichkeit, in einer Stichprobe von 32 ein so weit von null entferntes r zu sehen, bei etwa 0,0000000001. Das ist erdrückende Evidenz, dass der Zusammenhang echt ist - denk aber daran, dass der p-Wert sich darauf bezieht, ob r von null abweicht, nicht darauf, ob die Beziehung groß oder kausal ist.
- 95 percent confidence interval: −0.93 to −0.74 - der plausible Bereich für die wahre Korrelation. Oft nützlicher als der p-Wert: Selbst das optimistische Ende dieses Intervalls ist eine starke negative Korrelation.
- sample estimates: cor = −0.87 - dieselbe Zahl, die dir
cor()gegeben hat.
Kleine Stichproben verdienen hier besonderen Respekt: Bei n = 10 tauchen Korrelationen von ±0,5 beunruhigend oft durch Zufall auf, und das breite Konfidenzintervall wird dir das sagen. Berichte das Intervall, nicht nur den p-Wert.
Es sehen: immer plotten
Ein Korrelationskoeffizient komprimiert eine ganze Beziehung auf eine Zahl, und die Kompression kann Krümmung, Cluster oder einen einzelnen Punkt verbergen, der die ganze Arbeit macht. Bevor du irgendeinem r traust, sieh dir das Streudiagramm an:
plot(mtcars$wt, mtcars$mpg) # one pair
pairs(mtcars[, c("mpg", "wt", "hp", "disp")]) # every pair in the matrix
pairs() zeichnet ein Gitter aus Streudiagrammen passend zu deiner Korrelationsmatrix - der schnellste Weg zu prüfen, dass die Zahlen bedeuten, was du denkst. Für polierte Heatmap-artige Matrixgrafiken ist das Paket corrplot (install.packages("corrplot"), dann corrplot(cor(m))) das Standardwerkzeug.
Was du mitnimmst
cor(x, y)liefert Pearsons r: Vorzeichen ist Richtung, Betrag ist Stärke, immer in [−1, 1], ohne Einheiten.- Korrelation misst lineare Mitbewegung und sagt nichts über Kausalität - eine lauernde dritte Variable ist immer ein Kandidat.
method = "spearman"für Ränge: ordinale Daten, Ausreißer, monoton-aber-gekrümmte Beziehungen.cor(df)auf numerischen Spalten gibt die Matrix; runde sie mitround(, 2), und achte bei fehlenden Daten auf das Argumentuse =.cor.test(x, y)ergänzt p-Wert und Konfidenzintervall - berichte das Intervall.- Sieh dir immer das Streudiagramm an, bevor du der Zahl glaubst.
Als Nächstes: wenn sich die Frage von "Bewegen sie sich gemeinsam?" zu "Unterscheidet sich der Mittelwert dieser Gruppe von jenem?" schärft - der t-Test.
Häufig gestellte Fragen
Wie berechnet man in R die Korrelation?
cor(x, y) gibt den Pearson-Korrelationskoeffizienten zwischen zwei numerischen Vektoren zurück. Übergib stattdessen einen Data Frame numerischer Spalten - cor(df) -, um die vollständige Korrelationsmatrix zu bekommen. Für p-Wert und Konfidenzintervall nutze cor.test(x, y).
Wie bekommt man in R den p-Wert einer Korrelation?
cor() allein liefert keinen - nutze cor.test(x, y). Seine Ausgabe enthält die t-Statistik, die Freiheitsgrade, den p-Wert für die Nullhypothese, dass die wahre Korrelation null ist, ein 95-%-Konfidenzintervall und den geschätzten Koeffizienten.
Was ist der Unterschied zwischen Pearson- und Spearman-Korrelation?
Pearson (die Voreinstellung) misst den linearen Zusammenhang auf den Rohwerten. Spearman rangiert die Werte zuerst, misst also, ob die Beziehung durchgehend steigt oder fällt (monoton), und ist gegenüber Ausreißern weit unempfindlicher. Nutze cor(x, y, method = "spearman") für ordinale Daten, schiefe Daten oder gekrümmt-aber-monotone Beziehungen.
Wie geht man in cor() mit NA-Werten um?
Standardmäßig gibt cor() NA zurück, wenn irgendein Wert fehlt. Übergib use = "complete.obs", um zuerst Zeilen mit fehlenden Werten zu entfernen, oder use = "pairwise.complete.obs" in einer Matrix, um für jedes Variablenpaar alle Zeilen zu nutzen, in denen beide vorhanden sind.