scipy.stats.mstats.

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:
ConstantInputWarning

Ausgelöst, wenn ein Input ein konstantes Array ist. Der Korrelationskoeffizient ist in diesem Fall nicht definiert, daher wird np.nan zurückgegeben.

NearConstantInputWarning

Wird ausgelöst, wenn eine Eingabe „nahezu“ konstant ist. Das Array x wird als nahezu konstant betrachtet, wenn norm(x - mean(x)) < 1e-13 * abs(mean(x)). Numerische Fehler bei der Berechnung x - mean(x) können in diesem Fall zu einer ungenauen Berechnung von r führen.

Siehe auch

spearmanr

Spearman-Rangkorrelationskoeffizient.

kendalltau

Kendalls 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 pearsonr zur 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 r

dist = scipy.stats.beta(n/2 - 1, n/2 - 1, loc=-1, scale=2)

Der von pearsonr zurü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 Objekt dist kann 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.