scipy.stats.

page_trend_test#

scipy.stats.page_trend_test(data, ranked=False, predicted_ranks=None, method='auto')[源代码]#

执行佩奇检验,对治疗之间观察结果的趋势进行度量。

佩奇检验(也称为佩奇 \(L\) 检验)在以下情况下很有用:

  • \(n \geq 3\) 项治疗;

  • 每项治疗观察到 \(m \geq 2\) 位受试者;并且

  • 假设观察结果具有特定顺序。

具体来说,检验考虑零假设为

\[m_1 = m_2 = m_3 \cdots = m_n,\]

其中 \(m_j\) 是治疗 \(j\) 下观察到的量的平均值,相对于备择假设

\[m_1 \leq m_2 \leq m_3 \leq \cdots \leq m_n,\]

其中至少一项不等式严格成立。

正如 [4] 所述,Page 的 \(L\) 检验在检验趋势差异的替代假设时具有比 Friedman 检验更大的统计效力,因为 Friedman 检验仅考虑观测值均值的差异而未考虑它们的顺序。而 Spearman \(\rho\) 检验的是两个变量的排位观测值之间的相关性(例如,燕子的飞行速度与它所携带的椰子的重量),Page 的 \(L\) 检验则涉及几个不同处理(例如,依次携带五个不同重量的椰子)中观测值(例如,燕子的飞行速度)的趋势,即使观测值重复出现在多个个体中(例如,一只欧洲燕子和一只非洲燕子)。

参数:
data类似数组

一个 \(m \times n\) 数组;行 \(i\) 和列 \(j\) 中的元素是与个体 \(i\) 和处理 \(j\) 对应的观测值。默认情况下,假定列按预测均值递增的顺序排列。

ranked布尔值,可选

默认情况下,假定 data 是观测值而非秩值;它将使用 scipy.stats.rankdata 沿 axis=1 排序。如果以秩值的形式提供 data,则传递参数 True

predicted_ranks类似数组,可选

列均值的预测秩。如果未指定,则假定列按预测均值递增的顺序排列,因此默认的 predicted_ranks\([1, 2, \dots, n-1, n]\)

method{‘auto’, ‘asymptotic’, ‘exact’}, optional

选择用于计算 p 值的方法。可用以下选项。

  • ‘auto’:在 ‘exact’ 和 ‘asymptotic’ 之间选择以在合理的时间内获得合理的准确结果(默认)

  • ‘asymptotic’:将标准化检验统计量与正态分布进行比较

  • ‘exact’:通过将观测到的 \(L\) 统计量与通过秩的所有可能排列(在每个排列均等可能的原假设下)实现的统计量进行比较,计算精确的 p

返回:
resPageTrendTestResult

包含属性的对象

统计值浮点数

Page 的 \(L\) test 统计值。

p 值浮点数

关联的 p

方法{‘渐进的’, ‘精确的’}

用于计算 p 值的方法

备注

正如 [1] 中指出的,“\(n\) 个‘处理’同样也可以表示 \(n\) 个对象、事件或性能或人或实验评级”。同样,\(m\) 个‘受试者’也可以表示 \(m\) 个“按照能力或其他控制值分组,或执行评级的人,或其他类型的随机复制”。

[1] 改进了的 \(L\) 统计值计算步骤如下:

  1. “用审慎的逻辑预先确定关于实验结果预期排序的适当假设。如果没有合理的依据对任何处理进行排序,\(L\) 检验就不合适。”

  2. “与其他实验一样,确定在置信水平中拒绝以下无效假设:实验结果与单调假设不一致。”

  3. “将实验材料转换成一个由 \(n\) 列(处理、评级的对象、条件)和 \(m\) 行(受试者、复制组、控制变量级别)组成的双程表。”

  4. “当记录实验观察值时,对每一行进行评定”,例如 ranks = scipy.stats.rankdata(data, axis=1)

  5. “对每一列中的评级求和”,例如 colsums = np.sum(ranks, axis=0)

  6. “对评级和同一列的预期评级进行相乘”,例如 products = predicted_ranks * colsums

  7. “对所有此类乘积求和”,例如 L = products.sum()

[1] 提出了用标准统计值代替

\[\chi_L^2 = \frac{\left[12L-3mn(n+1)^2\right]^2}{mn^2(n^2-1)(n+1)}\]

“其近似化为自由度为 1 的卡方分布。普通使用 \(\chi^2\) 表格相当于双边一致性检验。如果需要单边检验,几乎总是这种情况,从卡方表中查得的概率应当除以二。”

然而,此标准化统计量不会区分观测值与预测等级相关良好与相关。相反,我们遵照 [2] 并计算标准化统计量

\[\Lambda = \frac{L - E_0}{\sqrt{V_0}},\]

其中 \(E_0 = \frac{1}{4} mn(n+1)^2\)\(V_0 = \frac{1}{144} mn^2(n+1)(n^2-1)\),“在零假设下渐进正态分布”。

method='exact'p值通过比较 \(L\) 的观测值和为 \((n!)^m\) 个等级所有可能排列生成的所有 \(L\) 值来生成。该计算使用 [5] 的递归方法执行。

p值未针对系数值的可能性进行调整。当存在系数值时,报告的 'exact' p值可能比真实p值略大(即更保守)[2]。但是,'asymptotic'` p值往往比 'exact' p值小(即更不保守)。

参考

[1] (1,2,3,4)

Ellis Batten Page,“针对多种处理的有序假设:线性等级的重要检验”,美国统计协会杂志 58(301),第 216–230 页,1963 年。

[2] (1,2)

马库斯·诺伊豪泽,非参数统计检验:一种计算方法,CRC Press,第 150-152 页,2012 年。

[3] (1,2)

Statext LLC,“Page 的 L 趋势检验 - 简单统计”,Statext - 统计研究https://www.statext.com/practice/PageTrendTest03.php,2020 年 7 月 12 日访问。

[4]

“Page 的趋势检验”,维基百科,WikimediaFoundation,https://en.wikipedia.org/wiki/Page%27s_trend_test,2020 年 7 月 12 日访问。

[5]

罗伯特·E·奥德,“双向布局中 Page 的 L 统计量的精确分布”,统计交流 - 模拟与计算,6(1),第 49-61 页,1977 年。

示例

我们使用 [3] 中的示例:要求 10 名学生根据 1-5 的等级对三种教学方法(辅导、讲座和研讨会)进行评分,其中 1 为最低分,5 为最高分。我们已确定需要 99% 的置信水平才能拒绝原假设,支持我们的备择假设:研讨会的评分最高,辅导的评分最低。最初,数据已经按表格列出,其中每一行表示一名学生对这三种方法的评分,排序如下:辅导、讲座、研讨会。

>>> table = [[3, 4, 3],
...          [2, 2, 4],
...          [3, 3, 5],
...          [1, 3, 2],
...          [2, 3, 2],
...          [2, 4, 5],
...          [1, 2, 4],
...          [3, 4, 4],
...          [2, 4, 5],
...          [1, 3, 4]]

由于假设辅导的评分最低,因此对应辅导排名的列应放在第一个;假设研讨会的评分最高,因此其列应放在最后。由于各列已按预测平均值的递增顺序排列,因此我们可以将表格直接传递到 page_trend_test 中。

>>> from scipy.stats import page_trend_test
>>> res = page_trend_test(table)
>>> res
PageTrendTestResult(statistic=133.5, pvalue=0.0018191161948127822,
                    method='exact')

p 值表示存在 0.1819% 的可能性,即在原假设下 \(L\) 统计量会达到如此极端的值。由于 0.1819% 小于 1%,因此我们有证据可以拒绝原假设,支持在 99% 的置信水平下提出的备择假设。

\(L\) 统计量的值为 133.5。要手动检查此值,我们需要对数据进行排名,使高分对应于高排名,以平均排名解决平局

>>> from scipy.stats import rankdata
>>> ranks = rankdata(table, axis=1)
>>> ranks
array([[1.5, 3. , 1.5],
       [1.5, 1.5, 3. ],
       [1.5, 1.5, 3. ],
       [1. , 3. , 2. ],
       [1.5, 3. , 1.5],
       [1. , 2. , 3. ],
       [1. , 2. , 3. ],
       [1. , 2.5, 2.5],
       [1. , 2. , 3. ],
       [1. , 2. , 3. ]])

我们将每列中的排名相加,将和乘以预测排名,然后对乘积求和。

>>> import numpy as np
>>> m, n = ranks.shape
>>> predicted_ranks = np.arange(1, n+1)
>>> L = (predicted_ranks * np.sum(ranks, axis=0)).sum()
>>> res.statistic == L
True

[3] 中所示,p 值的渐近近似值是正态分布的生存函数,在标准化检验统计量处求出

>>> from scipy.stats import norm
>>> E0 = (m*n*(n+1)**2)/4
>>> V0 = (m*n**2*(n+1)*(n**2-1))/144
>>> Lambda = (L-E0)/np.sqrt(V0)
>>> p = norm.sf(Lambda)
>>> p
0.0012693433690751756

这与 page_trend_test 上面报告的p 值不完全匹配。对于 \(m \leq 12\)\(n \leq 8\) 而言,渐近分布并不是很准确,也不是很保守,因此 page_trend_test 选择使用 method='exact',该值基于表格的维度以及 Page 原论文 [1] 中的建议。要覆盖 page_trend_test 的选择,请提供 method 参数。

>>> res = page_trend_test(table, method="asymptotic")
>>> res
PageTrendTestResult(statistic=133.5, pvalue=0.0012693433690751756,
                    method='asymptotic')

如果数据已排过序,我们可以传入 ranks 来替代 table 以节省计算时间。

>>> res = page_trend_test(ranks,             # ranks of data
...                       ranked=True,       # data is already ranked
...                       )
>>> res
PageTrendTestResult(statistic=133.5, pvalue=0.0018191161948127822,
                    method='exact')

设原始数据已用与预测均值顺序不同的顺序制成表格,例如讲座、研讨会、辅导。

>>> table = np.asarray(table)[:, [1, 2, 0]]

由于此表格的排列与假设的顺序不一致,我们可重新排列表格或提供 predicted_ranks。记住讲座被预测为中间排名、研讨会最高、辅导最低,我们传入

>>> res = page_trend_test(table,             # data as originally tabulated
...                       predicted_ranks=[2, 3, 1],  # our predicted order
...                       )
>>> res
PageTrendTestResult(statistic=133.5, pvalue=0.0018191161948127822,
                    method='exact')