scipy.stats.pearsonr

scipy.stats.pearsonr(x, y)[源代码]

皮尔逊相关系数和p值用于检验不相关性。

皮尔逊相关系数 [1] 测量两个数据集之间的线性关系。p值的计算依赖于假设每个数据集是正态分布的。(见科瓦尔斯基 [3] 讨论输入的非正态分布对相关系数分布的影响。)与其他相关系数一样,此系数在-1和+1之间变化,0表示没有相关性。-1或+1的相关性意味着精确的线性关系。

参数
x(n,)类似数组

输入数组。

y(n,)类似数组

输入数组。

退货
r浮动

皮尔逊相关系数。

p-value浮动

双尾p值。

警告
PearsonRConstantInputWarning

如果输入是常量数组,则引发。在这种情况下没有定义相关系数,因此 np.nan 返回。

PearsonRNearConstantInputWarning

如果输入“几乎”不变,则引发。该阵列 x 如果满足以下条件,则被认为是几乎不变的 norm(x - mean(x)) < 1e-13 * abs(mean(x)) 。计算中的数值误差 x - mean(x) 在这种情况下,可能会导致r的计算不准确。

参见

spearmanr

Spearman秩相关系数。

kendalltau

肯德尔的τ,序数数据的相关性度量。

注意事项

相关系数计算如下:

\[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是β函数。这有时被称为r的精确分布。 pearsonr 来计算p值。分布是区间上的贝塔分布 [-1, 1] ,形状参数a=b=n/2-1相等。根据本网站对β分布的实现,r的分布为:

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

返回的p值 pearsonr 是一个双边p值。p值大致表示不相关系统产生的数据集具有至少与从这些数据集计算的数据集一样极端的皮尔逊相关性的概率。更准确地说,对于具有相关系数r的给定样本,p值是从具有零相关性的总体中抽取的随机样本x‘和y’的abs(r‘)将大于或等于abs(R)的概率。就客体而言 dist 如上所示,给定r和长度n的p值可以计算为:

p = 2*dist.cdf(-abs(r))

当n为2时,上述连续分布定义不明确。当形状参数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)

“皮尔逊相关系数”,维基百科,https://en.wikipedia.org/wiki/Pearson_correlation_coefficient

2

学生,“相关系数的可能误差”,“比瑟里斯卡”,第6卷,第2-3期,1908年9月1日,第302-310页。

3

C.J.科瓦尔斯基,“非正态分布对样本乘积-矩相关系数分布的影响”,“皇家统计学会学报”。C辑(应用统计),第21卷,第1期(1972年),第1-12页。

示例

>>> from scipy import stats
>>> stats.pearsonr([1, 2, 3, 4, 5], [10, 9, 2.5, 6, 4])
(-0.7426106572325057, 0.1505558088534455)

如果y=a+b*x+e,则x和y之间存在线性相关性,其中a,b是常数,e是随机误差项,假定它与x无关。为简单起见,假设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
>>> stats.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)
>>> stats.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)
>>> stats.pearsonr(x, y)
(0.8537091583771509, 3.183461621422181e-143) # may vary

这是不直观的,因为如果x大于零,x和y不存在相关性,如果我们采样x和y,大约有一半的情况会发生这种情况。