page_trend_test#
- scipy.stats.page_trend_test(data, ranked=False, predicted_ranks=None, method='auto')[源代码][源代码]#
执行 Page’s 检验,这是一种衡量处理之间观察趋势的指标。
Page’s 检验(也称为 Page’s \(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’s \(L\) 检验在针对趋势差异的替代假设时,比 Friedman 检验具有更大的统计功效,因为 Friedman 检验仅考虑观测值均值的差异,而不考虑它们的顺序。而 Spearman :math:` ho` 考虑的是两个变量(例如,燕子的飞行速度与它携带的椰子重量)的排序观测值之间的相关性,Page’s \(L\) 则关注于观测值(例如,燕子的飞行速度)在多个不同处理(例如,携带每种不同重量的五个椰子)中的趋势,即使观测值在多个受试者(例如,一只欧洲燕子和一只非洲燕子)中重复进行。
- 参数:
- 数据类似数组
一个 \(m imes n\) 的数组;第 \(i\) 行和第 \(j\) 列的元素是与主体 \(i\) 和处理 \(j\) 相对应的观测值。默认情况下,列按预测均值的递增顺序排列。
- 排名布尔值,可选
默认情况下,假设 data 是观测值而不是排名;它将沿着
axis=1
使用scipy.stats.rankdata
进行排名。如果 data 以排名的形式提供,请传递参数True
。- predicted_ranks类似数组,可选
列均值的预测排名。如果未指定,则假设列按预测均值的递增顺序排列,因此默认的 predicted_ranks 是 \([1, 2, \dots, n-1, n]\)。
- 方法{‘auto’, ‘asymptotic’, ‘exact’}, 可选
选择用于计算 p 值的方法。以下选项可供选择。
‘auto’: 在 ‘exact’ 和 ‘asymptotic’ 之间选择,以在合理的时间内获得合理准确的结果(默认)
‘asymptotic’: 将标准化检验统计量与正态分布进行比较
‘exact’: 通过将观察到的 \(L\) 统计量与所有可能的秩排列(在零假设下,每个排列的可能性相等)实现的统计量进行比较,计算出精确的 p 值。
- 返回:
- resPageTrendTestResult
一个包含属性的对象:
- 统计浮动
页面的 \(L\) 测试统计量。
- p值浮动
相关的 p-值
- 方法{‘渐近’, ‘精确’}
用于计算 p 值的方法
注释
如[Rb7ca5e705efa-1]_所述,“\(n\) ‘处理’同样可以代表 \(n\) 个对象、事件、表现、人物或排序的试验。” 同样,\(m\) ‘受试者’也可以代表 \(m\) 个“按能力或其他控制变量分组,或进行排序的评委,或其他类型的随机重复。”
计算 \(L\) 统计量的步骤,改编自 [1] ,如下:
用严谨的逻辑预先确定关于实验结果预测顺序的适当假设。如果没有任何已知的合理依据来排序任何处理方法,则 \(L\) 检验是不合适的。
与其他实验一样,确定在何种置信水平上你会拒绝原假设,即实验结果与单调假设没有一致性。
将实验材料整理成一个 \(n\) 列(处理、排序对象、条件)和 \(m\) 行(受试者、重复组、控制变量的水平)的二维表格。
“当记录实验观察结果时,在每一行中对其进行排序”, 例如
ranks = scipy.stats.rankdata(data, axis=1)
.“在每一列中添加排名”,例如
colsums = np.sum(ranks, axis=0)
。将每个秩和乘以该列的预测秩,例如
products = predicted_ranks * colsums
。“求所有此类乘积的和”,例如
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 值稍大(即更保守)[Rb7ca5e705efa-2]_。然而,'asymptotic'
p 值往往比'exact'
p 值小(即更不保守)。参考文献
[2]Markus Neuhauser, 非参数统计检验:一种计算方法, CRC Press, 第150–152页, 2012年。
[3] (1,2)Statext LLC, “Page’s L 趋势检验 - 简易统计学”, Statext - 统计学研究, https://www.statext.com/practice/PageTrendTest03.php, 访问于 2020年7月12日。
[4]“Page’s Trend Test”,Wikipedia,Wikimedia Foundation,https://en.wikipedia.org/wiki/Page%27s_trend_test,访问于2020年7月12日。
[5]Robert E. Odeh, “The exact distribution of Page’s L-statistic in the two-way layout”, Communications in Statistics - Simulation and Computation, 6(1), p. 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-值表明,在零假设下,\(L\) 统计量达到如此极端值的概率为 0.1819%。因为 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
根据表格的维度和 Page 原始论文 [1] 中的建议,选择了使用method='exact'
。要覆盖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')