page_trend_test#
- scipy.stats.page_trend_test(data, ranked=False, predicted_ranks=None, method='auto')[源代码]#
执行 Page 趋势检验,这是一种衡量处理之间观测值趋势的方法。
当满足以下条件时,Page 检验(也称为 Page 的 \(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’}, 可选
选择用于计算 p 值的 方法。 以下选项可用。
‘auto’:在 ‘exact’ 和 ‘asymptotic’ 之间选择,以在合理的时间内获得合理准确的结果(默认)
‘asymptotic’:将标准化检验统计量与正态分布进行比较
‘exact’:通过将观察到的 \(L\) 统计量与所有可能的秩排列所实现的统计量进行比较来计算精确的 p 值(在每个排列等可能性的零假设下)
- 返回:
- resPageTrendTestResult
包含属性的对象
- statistic浮点数
Page 的 \(L\) 检验统计量。
- pvalue浮点数
相关的 p 值
- method{‘asymptotic’, ‘exact’}
用于计算 p 值的方法
另请参阅
注释
正如 [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 值 [2] 稍大(即更保守)。然而,'asymptotic'`
p 值往往比'exact'
p 值小(即不那么保守)。参考文献
[1] (1,2,3,4)Ellis Batten Page,“Ordered hypotheses for multiple treatments: a significant test for linear ranks”, Journal of the American Statistical Association 58(301), p. 216–230, 1963.
[2] (1,2)Markus Neuhauser, Nonparametric Statistical Test: A computational approach, CRC Press, p. 150–152, 2012.
[3] (1,2)Statext LLC, “Page’s L Trend Test - Easy Statistics”, Statext - Statistics Study, https://www.statext.com/practice/PageTrendTest03.php, 访问时间为 2020 年 7 月 12 日。
[4]“Page’s Trend Test”(佩奇趋势检验),维基百科,维基媒体基金会,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”(双向布局中佩奇 L 统计量的精确分布),Communications in Statistics - Simulation and Computation,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 值表示在原假设下,\(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
选择根据表格的维度和佩奇原始论文[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')