pearsonr#
- scipy.stats.mstats.pearsonr(x, y)[源代码]#
Pearson 相关系数和用于检验非相关的 p 值。
Pearson 相关系数 [1] 衡量两个数据集之间的线性关系。p 值的计算依赖于每个数据集都呈正态分布的假设。(有关输入非正态性对相关系数分布的影响的讨论,请参见 Kowalski [3]。)与其他相关系数一样,该系数在 -1 和 +1 之间变化,0 表示没有相关性。-1 或 +1 的相关性表示精确的线性关系。
- 参数:
- x(N,) 类数组
输入数组。
- y(N,) 类数组
输入数组。
- 返回:
- r浮点数
Pearson 相关系数。
- p-value浮点数
双尾 p 值。
- 警告:
ConstantInputWarning
如果输入是常数数组则引发。在这种情况下未定义相关系数,因此返回
np.nan
。NearConstantInputWarning
如果输入“几乎”是常数则引发。如果
norm(x - mean(x)) < 1e-13 * abs(mean(x))
,则数组x
被认为几乎是常数。在这种情况下,x - mean(x)
计算中的数值误差可能导致 r 的不准确计算。
参见
spearmanr
Spearman 等级顺序相关系数。
kendalltau
Kendall tau,一种用于顺序数据的相关性度量。
注释
相关系数计算如下
\[r = \frac{\sum (x - m_x) (y - m_y)} {\sqrt{\sum (x - m_x)^2 \sum (y - m_y)^2}}\]其中 \(m_x\) 是向量 x 的平均值,\(m_y\) 是向量 y 的平均值。
在假设 x 和 y 来自独立的正态分布(因此总体相关系数为 0)的前提下,样本相关系数 r 的概率密度函数为 ([1], [2])
\[f(r) = \frac{{(1-r^2)}^{n/2-2}}{\mathrm{B}(\frac{1}{2},\frac{n}{2}-1)}\]其中 n 是样本数量,B 是 beta 函数。这有时被称为 r 的精确分布。这是在
pearsonr
中用于计算 p 值的分布。该分布是区间 [-1, 1] 上的 beta 分布,具有相等的形状参数 a = b = n/2 - 1。就 SciPy 对 beta 分布的实现而言,r 的分布是dist = scipy.stats.beta(n/2 - 1, n/2 - 1, loc=-1, scale=2)
pearsonr
返回的 p 值是双侧 p 值。p 值大致表明一个不相关的系统产生的数据集的 Pearson 相关性至少与从这些数据集计算出的相关性一样极端的概率。更准确地说,对于给定相关系数为 r 的样本,p 值是来自具有零相关性的总体的随机样本 x’ 和 y’ 的 abs(r’) 大于或等于 abs(r) 的概率。用上面显示的dist
对象表示,对于给定的 r 和长度 n,p 值可以计算为p = 2*dist.cdf(-abs(r))
当 n 为 2 时,上述连续分布未明确定义。可以将 beta 分布的极限解释为形状参数 a 和 b 接近 a = b = 0 的离散分布,在 r = 1 和 r = -1 处具有相等的概率质量。更直接地说,可以观察到,给定数据 x = [x1, x2] 和 y = [y1, y2],并且假设 x1 != x2 和 y1 != y2,r 的唯一可能值为 1 和 -1。因为任何长度为 2 的样本 x’ 和 y’ 的 abs(r’) 都将为 1,所以长度为 2 的样本的双侧 p 值始终为 1。
参考
[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.
示例
>>> 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)
如果 y = a + b*x + e,其中 a,b 是常数,e 是一个随机误差项,假设独立于 x,则 x 和 y 之间存在线性依赖关系。为简单起见,假设 x 是标准正态分布,a=0,b=1,并让 e 服从均值为零且标准差 s>0 的正态分布。
>>> 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
这应该接近以下给出的精确值
>>> 1/np.sqrt(1 + s**2) 0.8944271909999159
对于 s=0.5,我们观察到高度相关。通常,噪声的较大方差会降低相关性,而当误差的方差接近于零时,相关性接近于 1。
重要的是要记住,除非 (x, y) 联合正态,否则没有相关性并不意味着独立性。当存在非常简单的依赖结构时,相关性甚至可以为零:如果 X 服从标准正态分布,则令 y = abs(x)。请注意,x 和 y 之间的相关性为零。事实上,由于 x 的期望值为零,因此 cov(x, y) = E[x*y]。根据定义,这等于 E[x*abs(x)],根据对称性,该值为零。以下代码行说明了这一观察结果
>>> y = np.abs(x) >>> mstats.pearsonr(x, y) (-0.016172891856853524, 0.7182823678751942) # may vary
非零相关系数可能会产生误导。例如,如果 X 具有标准正态分布,则当 x < 0 时定义 y = x,否则 y = 0。一个简单的计算表明 corr(x, y) = sqrt(2/Pi) = 0.797…,这意味着高度相关
>>> y = np.where(x < 0, x, 0) >>> mstats.pearsonr(x, y) (0.8537091583771509, 3.183461621422181e-143) # may vary
这是不直观的,因为如果 x 大于零,则 x 和 y 之间没有依赖关系,如果我们对 x 和 y 进行采样,则大约一半的情况下会发生这种情况。