当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python SciPy stats.pearsonr用法及代码示例


本文简要介绍 python 语言中 scipy.stats.pearsonr 的用法。

用法:

scipy.stats.pearsonr(x, y, *, alternative='two-sided', method=None)#

用于测试非相关性的 Pearson 相关系数和 p 值。

Pearson 相关系数 [1] 衡量两个数据集之间的线性关系。与其他相关系数一样,这个系数在 -1 和 +1 之间变化,0 表示没有相关性。 -1 或 +1 的相关性意味着精确的线性关系。正相关意味着随着 x 的增加,y 也会增加。负相关意味着随着 x 增加,y 减少。

该函数还执行零假设检验,即样本的分布不相关且呈正态分布。 (有关输入非正态性对相关系数分布的影响的讨论,请参阅 Kowalski [3]。)p 值粗略地表示不相关系统生成的数据集的概率,这些数据集的 Pearson 相关性至少为根据这些数据集计算出的结果是极端的。

参数

x (N,) 数组

输入数组。

y (N,) 数组

输入数组。

alternative {‘双面’,‘greater’, ‘less’},可选

定义备择假设。默认为“双面”。可以使用以下选项:

  • “双边”:相关性不为零

  • ‘less’:相关性为负(小于零)

  • ‘greater’:相关性为正(大于零)

method 重采样方法,可选

定义用于计算 p 值的方法。如果方法是一个实例PermutationMethod/MonteCarloMethod,p 值的计算方法为scipy.stats.permutation_test/scipy.stats.monte_carlo_test使用提供的配置选项和其他适当的设置。否则,p 值将按照注释中的记录进行计算。

返回

result PearsonRResult

具有以下属性的对象:

统计 浮点数

皮尔逊 product-moment 相关系数。

p值 浮点数

与所选替代方案相关的 p 值。

该对象具有以下方法:

confidence_interval(confidence_level,方法)

这计算相关系数的置信区间统计对于给定的置信水平。置信区间以namedtuple带字段低的高的.如果方法未提供,置信区间是使用 Fisher 变换计算的[1].如果方法是一个实例BootstrapMethod,置信区间的计算方法为scipy.stats.bootstrap使用提供的配置选项和其他适当的设置。在某些情况下,由于退化重采样,置信限可能为 NaN,这对于非常小的样本(~6 个观测值)来说是典型的。

警告

ConstantInputWarning

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

NearConstantInputWarning

如果输入是“nearly” 常量,则引发。如果 norm(x - mean(x)) < 1e-13 * abs(mean(x)) ,则数组 x 被认为几乎是恒定的。在这种情况下,计算x - mean(x) 中的数值错误可能会导致 r 的计算不准确。

注意

相关系数计算如下:

其中 是向量 x 的平均值, 是向量 y 的平均值。

假设x和y取自独立正态分布(所以总体相关系数为0),样本相关系数r的概率密度函数为([1],[2]):

其中 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 值。对于相关系数为 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。

为了向后兼容,返回的对象也表现得像一个长度为 2 的元组,保存统计数据和 p 值。

参考

[1] (1,2,3)

“Pearson correlation coefficient”,维基百科,https://en.wikipedia.org/wiki/Pearson_correlation_coefficient

[2]

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

[3]

C. J. Kowalski,“关于非正态性对样本 Product-Moment 相关系数分布的影响”皇家统计学会杂志。系列 C(应用统计),卷。 21,第 1 期(1972 年),第 1-12 页。

例子

>>> import numpy as np
>>> from scipy import stats
>>> x, y = [1, 2, 3, 4, 5, 6, 7], [10, 9, 2.5, 6, 4, 3, 2]
>>> res = stats.pearsonr(x, y)
>>> res
PearsonRResult(statistic=-0.828503883588428, pvalue=0.021280260007523286)

要执行测试的精确排列版本:

>>> rng = np.random.default_rng()
>>> method = stats.PermutationMethod(n_resamples=np.inf, random_state=rng)
>>> stats.pearsonr(x, y, method=method)
PearsonRResult(statistic=-0.828503883588428, pvalue=0.028174603174603175)

要在数据来自均匀分布的原假设下执行检验:

>>> method = stats.MonteCarloMethod(rvs=(rng.uniform, rng.uniform))
>>> stats.pearsonr(x, y, method=method)
PearsonRResult(statistic=-0.828503883588428, pvalue=0.0188)

要生成渐近 90% 置信区间:

>>> res.confidence_interval(confidence_level=0.9)
ConfidenceInterval(low=-0.9644331982722841, high=-0.3460237473272273)

对于引导置信区间:

>>> method = stats.BootstrapMethod(method='BCa', random_state=rng)
>>> res.confidence_interval(confidence_level=0.9, method=method)
ConfidenceInterval(low=-0.9983163756488651, high=-0.22771001702132443)  # may vary

如果 y = a + b*x + e,则 x 和 y 之间存在线性相关性,其中 a,b 是常数,e 是随机误差项,假定与 x 无关。为简单起见,假设 x 是标准正态,a=0,b=1,让 e 服从均值为零且标准差 s>0 的正态分布。

>>> rng = np.random.default_rng()
>>> s = 0.5
>>> x = stats.norm.rvs(size=500, random_state=rng)
>>> e = stats.norm.rvs(scale=s, size=500, random_state=rng)
>>> y = x + e
>>> stats.pearsonr(x, y).statistic
0.9001942438244763

这应该接近给出的确切值

>>> 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)
PearsonRResult(statistic=-0.05444919272687482, pvalue=0.22422294836207743)

非零相关系数可能会产生误导。例如,如果 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)
PearsonRResult(statistic=0.861985781588, pvalue=4.813432002751103e-149)

这是不直观的,因为如果 x 大于零,则 x 和 y 没有依赖性,如果我们对 x 和 y 进行采样,大约有一半的情况会发生这种情况。

相关用法


注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.stats.pearsonr。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。