spearmanr#
- scipy.stats.spearmanr(a, b=None, axis=0, nan_policy='propagate', alternative='two-sided')[source]#
计算斯皮尔曼等级相关系数以及相关的p值。
斯皮尔曼等级顺序相关系数是一种衡量两个数据集之间单调关系的非参数方法。与其他相关系数一样,该系数介于-1和+1之间,0表示不相关。 -1或+1的相关性意味着完全单调关系。正相关意味着随着x的增加,y也增加。负相关意味着随着x的增加,y减小。
p值大致表示一个不相关的系统产生的数据集的斯皮尔曼相关性至少与从这些数据集计算出的斯皮尔曼相关性一样极端的概率。 尽管p值的计算没有对样本的基础分布做出强烈的假设,但它仅对非常大的样本(> 500个观测值)是准确的。 对于较小的样本量,请考虑置换检验(请参见下面的“示例”部分)。
- 参数:
- a, b类似数组,1D或2D,b是可选的
包含多个变量和观测值的一个或两个1-D或2-D数组。当它们是1-D时,每个数组代表单个变量的观测值向量。对于2-D情况下的行为,请参见下面的
axis
。两个数组需要在axis
维度上具有相同的长度。- axisint 或 None,可选
如果axis = 0(默认),则每列代表一个变量,观测值在行中。如果axis = 1,则关系被转置:每一行代表一个变量,而各列包含观测值。如果axis = None,则两个数组都将被展平。
- nan_policy{‘propagate’, ‘raise’, ‘omit’},可选
定义如何处理输入包含nan时的情况。以下选项可用(默认为’propagate’)
‘propagate’:返回nan
‘raise’:引发错误
‘omit’:执行计算时忽略nan值
- alternative{‘two-sided’, ‘less’, ‘greater’},可选
定义备择假设。 默认为“two-sided”。以下选项可用
‘two-sided’:相关性非零
‘less’:相关性为负(小于零)
‘greater’:相关性为正(大于零)
版本1.7.0中添加。
- 返回:
- resSignificanceResult
一个包含属性的对象
- statisticfloat 或 ndarray (2-D 正方形)
斯皮尔曼相关矩阵或相关系数(如果仅将2个变量作为参数给出)。 相关矩阵是正方形的,其长度等于
a
和b
中变量(列或行)的总数。- pvaluefloat
假设检验的p值,其原假设是两个样本没有序数相关性。 有关备择假设,请参见上面的alternative。pvalue的形状与statistic相同。
- 引发:
- ValueError
如果axis不是0、1或None,或者如果a的维数大于2,或者如果b为None并且a的维数小于2。
- 警告:
ConstantInputWarning
如果输入是常量数组,则引发。 在这种情况下,未定义相关系数,因此返回
np.nan
。
另请参见
- 斯皮尔曼相关系数
扩展示例
参考
[1]Zwillinger, D. 和 Kokoska, S. (2000). CRC Standard Probability and Statistics Tables and Formulae. Chapman & Hall: New York. 2000. 第 14.7 节
[2]Kendall, M. G. 和 Stuart, A. (1973). The Advanced Theory of Statistics, Volume 2: Inference and Relationship. Griffin. 1973. 第 31.18 节
示例
>>> import numpy as np >>> from scipy import stats >>> res = stats.spearmanr([1, 2, 3, 4, 5], [5, 6, 7, 8, 7]) >>> res.statistic 0.8207826816681233 >>> res.pvalue 0.08858700531354381
>>> rng = np.random.default_rng() >>> x2n = rng.standard_normal((100, 2)) >>> y2n = rng.standard_normal((100, 2)) >>> res = stats.spearmanr(x2n) >>> res.statistic, res.pvalue (-0.07960396039603959, 0.4311168705769747)
>>> res = stats.spearmanr(x2n[:, 0], x2n[:, 1]) >>> res.statistic, res.pvalue (-0.07960396039603959, 0.4311168705769747)
>>> res = stats.spearmanr(x2n, y2n) >>> res.statistic array([[ 1. , -0.07960396, -0.08314431, 0.09662166], [-0.07960396, 1. , -0.14448245, 0.16738074], [-0.08314431, -0.14448245, 1. , 0.03234323], [ 0.09662166, 0.16738074, 0.03234323, 1. ]]) >>> res.pvalue array([[0. , 0.43111687, 0.41084066, 0.33891628], [0.43111687, 0. , 0.15151618, 0.09600687], [0.41084066, 0.15151618, 0. , 0.74938561], [0.33891628, 0.09600687, 0.74938561, 0. ]])
>>> res = stats.spearmanr(x2n.T, y2n.T, axis=1) >>> res.statistic array([[ 1. , -0.07960396, -0.08314431, 0.09662166], [-0.07960396, 1. , -0.14448245, 0.16738074], [-0.08314431, -0.14448245, 1. , 0.03234323], [ 0.09662166, 0.16738074, 0.03234323, 1. ]])
>>> res = stats.spearmanr(x2n, y2n, axis=None) >>> res.statistic, res.pvalue (0.044981624540613524, 0.5270803651336189)
>>> res = stats.spearmanr(x2n.ravel(), y2n.ravel()) >>> res.statistic, res.pvalue (0.044981624540613524, 0.5270803651336189)
>>> rng = np.random.default_rng() >>> xint = rng.integers(10, size=(100, 2)) >>> res = stats.spearmanr(xint) >>> res.statistic, res.pvalue (0.09800224850707953, 0.3320271757932076)
对于小样本,请考虑执行置换检验,而不是依赖于渐近p值。 请注意,要计算统计量的零分布(对于样本
x
和y
中观测值之间的所有可能的配对),只需要置换两个输入之一。>>> x = [1.76405235, 0.40015721, 0.97873798, ... 2.2408932, 1.86755799, -0.97727788] >>> y = [2.71414076, 0.2488, 0.87551913, ... 2.6514917, 2.01160156, 0.47699563]
>>> def statistic(x): # permute only `x` ... return stats.spearmanr(x, y).statistic >>> res_exact = stats.permutation_test((x,), statistic, ... permutation_type='pairings') >>> res_asymptotic = stats.spearmanr(x, y) >>> res_exact.pvalue, res_asymptotic.pvalue # asymptotic pvalue is too low (0.10277777777777777, 0.07239650145772594)
有关更详细的示例,请参见斯皮尔曼相关系数。