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