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


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

用法:

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

Pearson 相关系数和p-value 用于测试非相关性。

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

此函数还执行对样本基础分布不相关且正态分布的原假设的检验。 (有关输入的非正态性对相关系数分布的影响的讨论,请参见 Kowalski [3]。)p-value 粗略地表示不相关系统产生具有 Pearson 相关性的数据集的概率至少为极端是从这些数据集中计算出来的。

参数

x (N,) 数组

输入数组。

y (N,) 数组

输入数组。

alternative {‘two-sided’,‘greater’, ‘less’},可选

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

  • ‘two-sided’:相关性非零

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

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

返回

result PearsonRResult

具有以下属性的对象:

统计 浮点数

Pearson product-moment 相关系数。

p值 浮点数

p-value 与所选备选方案相关联。

该对象具有以下方法:

confidence_interval(confidence_level=0.95)

该方法计算相关系数的置信区间统计对于给定的置信水平。置信区间以namedtuple带字段低的高的.有关详细信息,请参阅注释。

警告

PearsonRConstantInputWarning

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

PearsonRNearConstantInputWarning

如果输入是“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-value 的分布。该分布是区间 [-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-value 是 two-sided p-value。对于具有相关系数 r 的给定样本,p-value 是从零相关总体中抽取的随机样本 x' 和 y' 的 abs(r') 大于或等于 abs(r) 的概率。根据上面显示的对象dist,给定 r 和长度 n 的 p-value 可以计算为:

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

当 n 为 2 时,上述连续分布不明确。当形状参数 a 和 b 接近 a = b = 0 时,可以将 beta 分布的极限解释为在 r = 1 和 r = -1 处具有相等概率质量的离散分布。更直接地,可以观察到,给定数据 x = [x1, x2] 和 y = [y1, y2],并假设 x1 != x2 和 y1 != y2,r 的唯一可能值是 1 和 -1 .因为任何长度为 2 的样本 x' 和 y' 的 abs(r') 将为 1,所以长度为 2 的样本的 two-sided p-value 始终为 1。

为了向后兼容,返回的对象也表现得像一个长度为 2 的元组,其中包含统计信息和 p-value。

参考

1 (12)

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

scipy.stats.pearsonr

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

scipy.stats.pearsonr

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

例子

>>> from scipy import stats
>>> res = stats.pearsonr([1, 2, 3, 4, 5], [10, 9, 2.5, 6, 4])
>>> res
PearsonRResult(statistic=-0.7426106572325056, pvalue=0.15055580885344558)
>>> res.confidence_interval()
ConfidenceInterval(low=-0.9816918044786463, high=0.40501116769030976)

如果 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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。