pearsonr#
- scipy.stats.mstats.pearsonr(x, y)[Quelle]#
Pearson-Korrelationskoeffizient und p-Wert zum Testen auf Nicht-Korrelation.
Der Pearson-Korrelationskoeffizient [1] misst die lineare Beziehung zwischen zwei Datensätzen. Die Berechnung des p-Wertes basiert auf der Annahme, dass jeder Datensatz normalverteilt ist. (Siehe Kowalski [3] für eine Diskussion der Auswirkungen von Nicht-Normalverteilung der Eingabe auf die Verteilung des Korrelationskoeffizienten.) Wie andere Korrelationskoeffizienten schwankt dieser zwischen -1 und +1, wobei 0 keine Korrelation bedeutet. Korrelationen von -1 oder +1 implizieren eine exakte lineare Beziehung.
- Parameter:
- x(N,) array_like
Eingabearray.
- y(N,) array_like
Eingabearray.
- Rückgabe:
- rFloat
Pearson's Korrelationskoeffizient.
- p-Wertfloat
Zweiseitiger p-Wert.
- Warnungen:
ConstantInputWarningAusgelöst, wenn ein Input ein konstantes Array ist. Der Korrelationskoeffizient ist in diesem Fall nicht definiert, daher wird
np.nanzurückgegeben.NearConstantInputWarningWird ausgelöst, wenn eine Eingabe „nahezu“ konstant ist. Das Array
xwird als nahezu konstant betrachtet, wennnorm(x - mean(x)) < 1e-13 * abs(mean(x)). Numerische Fehler bei der Berechnungx - mean(x)können in diesem Fall zu einer ungenauen Berechnung von r führen.
Siehe auch
spearmanrSpearman-Rangkorrelationskoeffizient.
kendalltauKendalls Tau, ein Korrelationsmaß für ordinale Daten.
Hinweise
Der Korrelationskoeffizient wird wie folgt berechnet:
\[r = \frac{\sum (x - m_x) (y - m_y)} {\sqrt{\sum (x - m_x)^2 \sum (y - m_y)^2}}\]wobei \(m_x\) der Mittelwert des Vektors x und \(m_y\) der Mittelwert des Vektors y ist.
Unter der Annahme, dass x und y aus unabhängigen Normalverteilungen stammen (so dass der Populationskorrelationskoeffizient 0 ist), ist die Wahrscheinlichkeitsdichtefunktion des Stichprobenkorrelationskoeffizienten r ([1], [2])
\[f(r) = \frac{{(1-r^2)}^{n/2-2}}{\mathrm{B}(\frac{1}{2},\frac{n}{2}-1)}\]wobei n die Anzahl der Stichproben und B die Betafunktion ist. Dies wird manchmal als die exakte Verteilung von r bezeichnet. Dies ist die Verteilung, die in
pearsonrzur Berechnung des p-Wertes verwendet wird. Die Verteilung ist eine Beta-Verteilung auf dem Intervall [-1, 1] mit gleichen Formparametern a = b = n/2 - 1. In Bezug auf SciPys Implementierung der Beta-Verteilung ist die Verteilung von rdist = scipy.stats.beta(n/2 - 1, n/2 - 1, loc=-1, scale=2)
Der von
pearsonrzurückgegebene p-Wert ist ein zweiseitiger p-Wert. Der p-Wert gibt grob die Wahrscheinlichkeit an, dass ein unkorreliertes System Datensätze erzeugt, die eine Pearson-Korrelation aufweisen, die mindestens so extrem ist wie die aus diesen Datensätzen berechnete. Genauer gesagt ist für eine gegebene Stichprobe mit Korrelationskoeffizient r der p-Wert die Wahrscheinlichkeit, dass abs(r’) einer zufälligen Stichprobe x’ und y’, die aus der Population mit null Korrelation gezogen wurden, größer oder gleich abs(r) wäre. Bezogen auf das oben gezeigte Objektdistkann der p-Wert für ein gegebenes r und eine Länge n wie folgt berechnet werden:p = 2*dist.cdf(-abs(r))
Wenn n 2 ist, ist die obige kontinuierliche Verteilung nicht wohldefiniert. Man kann den Grenzwert der Beta-Verteilung interpretieren, wenn sich die Formparameter a und b a = b = 0 nähern, als eine diskrete Verteilung mit gleichen Wahrscheinlichkeitsmassen bei r = 1 und r = -1. Direkter kann man beobachten, dass bei gegebenen Daten x = [x1, x2] und y = [y1, y2] und unter der Annahme, dass x1 != x2 und y1 != y2, die einzig möglichen Werte für r 1 und -1 sind. Da abs(r’) für jede Stichprobe x’ und y’ der Länge 2 immer 1 ist, ist der zweiseitige p-Wert für eine Stichprobe der Länge 2 immer 1.
Referenzen
[1] (1,2)„Pearson correlation coefficient“, Wikipedia, https://en.wikipedia.org/wiki/Pearson_correlation_coefficient
[2]Student, „Probable error of a correlation coefficient“, Biometrika, Volume 6, Issue 2-3, 1 September 1908, pp. 302-310.
[3]C. J. Kowalski, „On the Effects of Non-Normality on the Distribution of the Sample Product-Moment Correlation Coefficient“, Journal of the Royal Statistical Society. Series C (Applied Statistics), Vol. 21, No. 1 (1972), pp. 1-12.
Beispiele
>>> import numpy as np >>> from scipy import stats >>> from scipy.stats import mstats >>> mstats.pearsonr([1, 2, 3, 4, 5], [10, 9, 2.5, 6, 4]) (-0.7426106572325057, 0.1505558088534455)
Es besteht eine lineare Abhängigkeit zwischen x und y, wenn y = a + b*x + e, wobei a, b Konstanten sind und e ein zufälliger Fehlerterm ist, der unabhängig von x angenommen wird. Der Einfachheit halber nehmen wir an, dass x standardnormal ist, a=0, b=1 und e einer Normalverteilung mit Mittelwert Null und Standardabweichung s>0 folgt.
>>> s = 0.5 >>> x = stats.norm.rvs(size=500) >>> e = stats.norm.rvs(scale=s, size=500) >>> y = x + e >>> mstats.pearsonr(x, y) (0.9029601878969703, 8.428978827629898e-185) # may vary
Dies sollte nahe am exakten Wert liegen, gegeben durch
>>> 1/np.sqrt(1 + s**2) 0.8944271909999159
Für s=0.5 beobachten wir ein hohes Maß an Korrelation. Im Allgemeinen reduziert eine große Varianz des Rauschens die Korrelation, während die Korrelation gegen eins konvergiert, wenn die Varianz des Fehlers gegen Null geht.
Es ist wichtig zu bedenken, dass keine Korrelation keine Unabhängigkeit impliziert, es sei denn, (x, y) ist gemeinsam normalverteilt. Korrelation kann sogar null sein, wenn es eine sehr einfache Abhängigkeitsstruktur gibt: wenn X einer Standardnormalverteilung folgt, sei y = abs(x). Beachten Sie, dass die Korrelation zwischen x und y null ist. Tatsächlich, da der Erwartungswert von x Null ist, cov(x, y) = E[x*y]. Per Definition ist dies gleich E[x*abs(x)], was aus Symmetriegründen null ist. Die folgenden Codezeilen veranschaulichen diese Beobachtung
>>> y = np.abs(x) >>> mstats.pearsonr(x, y) (-0.016172891856853524, 0.7182823678751942) # may vary
Ein von Null verschiedener Korrelationskoeffizient kann irreführend sein. Wenn X beispielsweise eine Standardnormalverteilung hat, definieren wir y = x, wenn x < 0, und y = 0 andernfalls. Eine einfache Berechnung zeigt, dass corr(x, y) = sqrt(2/Pi) = 0.797..., was ein hohes Maß an Korrelation impliziert
>>> y = np.where(x < 0, x, 0) >>> mstats.pearsonr(x, y) (0.8537091583771509, 3.183461621422181e-143) # may vary
Dies ist unintuitiv, da keine Abhängigkeit von x und y besteht, wenn x größer als Null ist, was etwa in der Hälfte der Fälle auftritt, wenn wir x und y stichprobenartig entnehmen.