本文簡要介紹 python 語言中 scipy.stats.mstats.pearsonr
的用法。
用法:
scipy.stats.mstats.pearsonr(x, y)#
用於測試非相關性的 Pearson 相關係數和 p 值。
皮爾遜相關係數 [1] 衡量兩個數據集之間的線性關係。 p 值的計算依賴於每個數據集呈正態分布的假設。 (有關輸入非正態性對相關係數分布的影響的討論,請參閱 Kowalski [3]。)與其他相關係數一樣,該係數在 -1 和 +1 之間變化,其中 0 表示不相關。 -1 或 +1 的相關性意味著精確的線性關係。
- x: (N,) 數組
輸入數組。
- y: (N,) 數組
輸入數組。
- r: 浮點數
皮爾遜相關係數。
- p-value: 浮點數
Two-tailed p 值。
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 值。 p 值粗略地表示不相關係統生成的數據集的 Pearson 相關性至少與根據這些數據集計算出的相關性一樣極端的概率。更準確地說,對於相關係數為 r 的給定樣本,p 值是從相關性為零的總體中抽取的隨機樣本 x' 和 y' 的 abs(r') 大於或等於 abs(r') 的概率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。
參考:
[1] (1,2)“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 >>> from scipy.stats import mstats >>> mstats.pearsonr([1, 2, 3, 4, 5], [10, 9, 2.5, 6, 4]) (-0.7426106572325057, 0.1505558088534455)
如果 y = a + b*x + e,則 x 和 y 之間存在線性相關性,其中 a,b 是常數,e 是隨機誤差項,假定與 x 無關。為簡單起見,假設 x 是標準正態,a=0,b=1,讓 e 服從均值為零且標準差 s>0 的正態分布。
>>> s = 0.5 >>> x = stats.norm.rvs(size=500) >>> e = stats.norm.rvs(scale=s, size=500) >>> y = x + e >>> mstats.pearsonr(x, y) (0.9029601878969703, 8.428978827629898e-185) # may vary
這應該接近給出的確切值
>>> 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) >>> mstats.pearsonr(x, y) (-0.016172891856853524, 0.7182823678751942) # may vary
非零相關係數可能會產生誤導。例如,如果 X 具有標準正態分布,則如果 x < 0 則定義 y = x,否則定義 y = 0。一個簡單的計算表明 corr(x, y) = sqrt(2/Pi) = 0.797…,意味著高度相關:
>>> y = np.where(x < 0, x, 0) >>> mstats.pearsonr(x, y) (0.8537091583771509, 3.183461621422181e-143) # may vary
這是不直觀的,因為如果 x 大於零,則 x 和 y 沒有依賴性,如果我們對 x 和 y 進行采樣,大約有一半的情況會發生這種情況。
相關用法
- Python SciPy mstats.trim用法及代碼示例
- Python SciPy mstats.winsorize用法及代碼示例
- Python SciPy mstats.argstoarray用法及代碼示例
- Python SciPy mstats.trima用法及代碼示例
- Python SciPy mstats.tmin用法及代碼示例
- Python SciPy mstats.tmax用法及代碼示例
- Python SciPy mstats.kruskalwallis用法及代碼示例
- Python SciPy mstats.sem用法及代碼示例
- Python SciPy mstats.zscore用法及代碼示例
- Python SciPy mstats.zmap用法及代碼示例
- Python SciPy mstats.mode用法及代碼示例
- Python SciPy mstats.hmean用法及代碼示例
- Python SciPy mstats.variation用法及代碼示例
- Python SciPy mstats.compare_medians_ms用法及代碼示例
- Python SciPy mstats.gmean用法及代碼示例
- Python SciPy mstats.kruskal用法及代碼示例
- Python SciPy mstats.tmean用法及代碼示例
- Python SciPy mstats.mquantiles用法及代碼示例
- Python SciPy mstats.count_tied_groups用法及代碼示例
- Python SciPy mstats.chisquare用法及代碼示例
- Python SciPy mstats.describe用法及代碼示例
- Python SciPy mstats.sen_seasonal_slopes用法及代碼示例
- Python SciPy mstats.find_repeats用法及代碼示例
- Python SciPy matlab.loadmat用法及代碼示例
- Python SciPy misc.ascent用法及代碼示例
注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.stats.mstats.pearsonr。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。