本文简要介绍 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 个观测值)来说是典型的。
- result:
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 进行采样,大约有一半的情况会发生这种情况。
相关用法
- Python SciPy stats.pearson3用法及代码示例
- Python SciPy stats.percentileofscore用法及代码示例
- Python SciPy stats.permutation_test用法及代码示例
- Python SciPy stats.page_trend_test用法及代码示例
- Python SciPy stats.poisson用法及代码示例
- Python SciPy stats.poisson_means_test用法及代码示例
- Python SciPy stats.pareto用法及代码示例
- Python SciPy stats.planck用法及代码示例
- Python SciPy stats.ppcc_plot用法及代码示例
- Python SciPy stats.pointbiserialr用法及代码示例
- Python SciPy stats.probplot用法及代码示例
- Python SciPy stats.powerlognorm用法及代码示例
- Python SciPy stats.ppcc_max用法及代码示例
- Python SciPy stats.pmean用法及代码示例
- Python SciPy stats.powerlaw用法及代码示例
- Python SciPy stats.power_divergence用法及代码示例
- Python SciPy stats.powernorm用法及代码示例
- Python SciPy stats.anderson用法及代码示例
- Python SciPy stats.iqr用法及代码示例
- Python SciPy stats.genpareto用法及代码示例
- Python SciPy stats.skewnorm用法及代码示例
- Python SciPy stats.cosine用法及代码示例
- Python SciPy stats.norminvgauss用法及代码示例
- Python SciPy stats.directional_stats用法及代码示例
- Python SciPy stats.invwishart用法及代码示例
注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.stats.pearsonr。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。