scipy.stats.

kendalltau#

scipy.stats.kendalltau(x, y, *, nan_policy='propagate', method='auto', variant='b', alternative='two-sided')[源代码]#

计算肯德尔 τ ,这是序数数据的相关度量。

肯德尔 τ 是两个排名之间对应关系的度量。接近 1 的值表示强相关性,接近 -1 的值表示强不相关性。这实现了两个变种的肯德尔的 τ:τ-b(默认)和 τ-c(也称为斯图尔特的 τ-c)。它们仅在归一化到 -1 到 1 范围内的方式上有所不同;假设检验(它们的 p 值)是相同的。肯德尔最初的 tau-a 没有单独实现,因为在没有联系的情况下,tau-b 和 tau-c 都减少为 tau-a。

参数:
x, y类数组

相同形状的排名数组。如果数组不为一维,它们将被扁平化为一维。

nan_policy{'propagate', 'raise', 'omit'},可选

定义了在输入包含 nan 时如何处理。有以下选项可用(默认值为‘propagate’)

  • ‘propagate’:返回 nan

  • “raise”:引发错误

  • “omit”:执行计算且忽略 NaN 值

方法{“auto”、“asymptotic”、“exact”},可选

定义用于计算 p 值的方法 [5]。可用以下选项(默认为“auto”)

  • “auto”:根据速度和精度之间的权衡关系选择适当的方法

  • “asymptotic”:对大样本使用有效的正态近似

  • “exact”:计算精确的 p 值,但仅当不存在同系数时才能使用。随着样本量的增加,“exact”的计算时间可能会增加,并且结果可能会损失一些精度。

变体{‘b’,‘c’},可选

定义返回的 Kendall’s tau 的变体。默认为“b”。

备选{‘two-sided’,‘less’,‘greater’},可选

定义备选假设。默认为“two-sided”。可用以下选项

  • “two-sided”:秩相关系数不为零

  • “less”:秩相关系数为负(小于零)

  • “greater”:秩相关系数为正(大于零)

返回:
resSignificanceResult

包含属性的对象

statisticfloat

tau 统计量。

pvaluefloat

原假设不存在关联(tau = 0)的假设检验的 p 值。

另请参见

spearmanr

计算 Spearman 等级相关系数。

theilslopes

计算一组点 (x, y) 的 Theil-Sen 估计量。

weightedtau

计算 Kendall 的 tau 的加权版本。

备注

使用的 Kendall 的 tau 的定义为 [2]

tau_b = (P - Q) / sqrt((P + Q + T) * (P + Q + U))

tau_c = 2 (P - Q) / (n**2 * (m - 1) / m)

其中 P 是协调对的数量,Q 是不协调对的数量,T 仅在 x 中的同系数的数量,U 仅在 y 中的同系数的数量。如果同系数发生在 xy 中的同一样本对中,则该同系数不会添加到 T 或 U 中。n 是样本总数,m 是 xy 中唯一值的数量(以较小者为准)。

参考

[1]

毛里斯·G·肯德尔, “秩相关系数的新测量”,生物测量学第 30 卷,第 1/2 期,第 81-93 页,1938 年。

[2]

毛里斯·G·肯德尔, “排名问题中的同系数处理”,生物测量学第 33 卷,第 3 期,第 239-251 页。1945 年。

[3]

戈特弗里德·E·诺瑟,“非参数统计学基本要素”,约翰·威利父子出版社,1967 年。

[4]

彼得·M·芬威克, “累积频数表的全新数据结构”,软件:实践和经验,第 24 卷,第 3 期,第 327-336 页,1994 年。

[5]

Maurice G. Kendall,“等级相关方法”(第四版),Charles Griffin & Co.,1970 年。

[6]

Kershenobich, D.、Fierro, F. J.、& Rojkind, M.(1970)。游离脯氨酸池与人类肝硬化中胶原含量之间的关系。临床调查杂志,49(12),2246-2249。

[7]

Hollander, M.、Wolfe, D. A.、& Chicken, E.(2013)。非参数统计方法。John Wiley & Sons。

[8]

B. Phipson 和 G. K. Smyth。“排列 P 值永远不应该是零:在随机抽取排列时计算精确 P 值。”统计应用于遗传学与分子生物学 9.1(2010)。

示例

考虑来自 [6] 的以下数据,该数据研究了不健康的​​人类肝脏中游离脯氨酸(一种氨基酸)与总胶原(常发现于结缔组织中的一种蛋白质)之间的关系。

下面的 xy 数组记录了这两种化合物的测量结果。观察是配对的:每个游离脯氨酸测量都与来自同一肝脏的相同索引处的总胶原测量一起进行。

>>> import numpy as np
>>> # total collagen (mg/g dry weight of liver)
>>> x = np.array([7.1, 7.1, 7.2, 8.3, 9.4, 10.5, 11.4])
>>> # free proline (μ mole/g dry weight of liver)
>>> y = np.array([2.8, 2.9, 2.8, 2.6, 3.5, 4.6, 5.0])

这些数据在 [7] 中使用 Spearman 的相关系数进行分析,这是一个类似于 Kendall 的 tau 的统计量,因为它也对样本之间的序数相关性敏感。让我们使用 Kendall 的 tau 进行一项类似的研究。

>>> from scipy import stats
>>> res = stats.kendalltau(x, y)
>>> res.statistic
0.5499999999999999

对于具有强正序数相关性的样本,此统计量往往很高(接近 1),对于具有强负序数相关性的样本,此统计量往往很低(接近 -1),对于具有弱序数相关性的样本,此统计量往往很小(接近于零)。

通过将统计量的观察值与零分布进行比较来执行检验:在总体胶原和游离脯氨酸测量是独立的零假设下得出的统计量值分布。

对于没有绑定的样本,该检验的零分布近似为方差为 (2*(2*n + 5))/(9*n*(n - 1)) 的正态分布,其中 n = len(x)

>>> import matplotlib.pyplot as plt
>>> n = len(x)  # len(x) == len(y)
>>> var = (2*(2*n + 5))/(9*n*(n - 1))
>>> dist = stats.norm(scale=np.sqrt(var))
>>> z_vals = np.linspace(-1.25, 1.25, 100)
>>> pdf = dist.pdf(z_vals)
>>> fig, ax = plt.subplots(figsize=(8, 5))
>>> def plot(ax):  # we'll reuse this
...     ax.plot(z_vals, pdf)
...     ax.set_title("Kendall Tau Test Null Distribution")
...     ax.set_xlabel("statistic")
...     ax.set_ylabel("probability density")
>>> plot(ax)
>>> plt.show()
../../_images/scipy-stats-kendalltau-1_00_00.png

比较通过 p 值进行量化:零分布中比统计量的观察值极端或者更加极端的元素的比例。在统计量为正的双侧检验中,大于转化后的统计量的零分布元素和小于观察统计量负数的零分布元素都被认为“更加极端”。

>>> fig, ax = plt.subplots(figsize=(8, 5))
>>> plot(ax)
>>> pvalue = dist.cdf(-res.statistic) + dist.sf(res.statistic)
>>> annotation = (f'p-value={pvalue:.4f}\n(shaded area)')
>>> props = dict(facecolor='black', width=1, headwidth=5, headlength=8)
>>> _ = ax.annotate(annotation, (0.65, 0.15), (0.8, 0.3), arrowprops=props)
>>> i = z_vals >= res.statistic
>>> ax.fill_between(z_vals[i], y1=0, y2=pdf[i], color='C0')
>>> i = z_vals <= -res.statistic
>>> ax.fill_between(z_vals[i], y1=0, y2=pdf[i], color='C0')
>>> ax.set_xlim(-1.25, 1.25)
>>> ax.set_ylim(0, 0.5)
>>> plt.show()
../../_images/scipy-stats-kendalltau-1_01_00.png
>>> res.pvalue
0.09108705741631495  # approximate p-value

请注意,曲线阴影面积和 kendalltau 返回的 p 值存在细微差别。这是因为我们的数据存在并列,但我们忽略了零分布方差的并列调整,而 kendalltau 则会执行该调整。对于不含并列的样本,我们作图的阴影面积和 kendalltau 返回的 p 值将完全相符。

如果 p 值“小”,即如果从独立分布中抽样数据的概率较低,进而产生了统计量的一个极端值,这可以被视为支持备择假设、驳斥零假设的证据:总胶原和游离脯氨酸的分布不是独立的。请注意

  • 逆否命题不成立;也就是说,该测试不会用于提供支持零假设的证据。

  • 将哪些值视为“小”的阈值应在数据分析前选择 [8],同时考虑假阳性(错误地驳斥零假设)和假阴性(未驳斥错误的零假设)风险。

  • 较小的 p 值不能作为大效应的证据;相反,它们只能提供“显着”效应的证据,这意味着在零假设下它们不大可能发生。

对于样本量适中的不含并列的样本,kendalltau 可以精确计算 p 值。但是,如果有并列,kendalltau 会采用渐近逼近。尽管如此,我们可以使用排列检验来精确计算零分布:在总胶原和游离脯氨酸独立的零假设下,每一个游离脯氨酸测量都可能与任何一个总胶原测量一起观察到。因此,我们可以通过计算 xy 之间每个可能元素配对情况下的统计量来形成确切的零分布。

>>> def statistic(x):  # explore all possible pairings by permuting `x`
...     return stats.kendalltau(x, y).statistic  # ignore pvalue
>>> ref = stats.permutation_test((x,), statistic,
...                              permutation_type='pairings')
>>> fig, ax = plt.subplots(figsize=(8, 5))
>>> plot(ax)
>>> bins = np.linspace(-1.25, 1.25, 25)
>>> ax.hist(ref.null_distribution, bins=bins, density=True)
>>> ax.legend(['aymptotic approximation\n(many observations)',
...            'exact null distribution'])
>>> plot(ax)
>>> plt.show()
../../_images/scipy-stats-kendalltau-1_02_00.png
>>> ref.pvalue
0.12222222222222222  # exact p-value

请注意,这里计算所得的精确 p 值和上文 kendalltau 返回的近似值存在显著的差异。对于含有并列的小样本,可以考虑执行排列检验来获得更准确的结果。