當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。