当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python SciPy stats.page_trend_test用法及代码示例


本文简要介绍 python 语言中 scipy.stats.page_trend_test 的用法。

用法:

scipy.stats.page_trend_test(data, ranked=False, predicted_ranks=None, method='auto')#

执行 Page 检验,衡量治疗之间的观察趋势。

Page 的测试(也称为 Page 的 测试)在以下情况下很有用:

  • 治疗,

  • 受试者对每种治疗进行观察,并且

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

具体来说,该检验考虑了原假设

其中 是在处理 下观察到的数量的平均值,与备择假设相反

其中至少有一个不等式是严格的。

正如 [4] 所指出的,Page 的 检验比弗里德曼检验具有更大的统计能力,因为弗里德曼检验只考虑了观察均值的差异而不考虑它们的顺序。 Spearman 考虑两个变量的排名观测值之间的相关性(例如燕子的空速速度与它携带的椰子的重量),而 Page 的 关注观测值的趋势(例如空速即使在对多个受试者(例如,一只欧洲燕子和一只非洲燕子)重复观察的情况下,在几种不同的处理(例如,携带五个不同重量的椰子中的每一个)中的燕子速度)。

参数

data 类数组

一个 数组; 行和 列中的元素是与主题 和处理 对应的观察值。默认情况下,假设列按预测均值递增的顺序排列。

ranked 布尔值,可选

默认,数据假设是观察而不是等级;它将与scipy.stats.rankdata沿着axis=1.如果数据以排名的形式提供,传递参数True.

predicted_ranks 类似数组,可选

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

method {‘auto’, ‘asymptotic’, ‘exact’},可选

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

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

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

  • ‘exact’:计算准确的p-通过比较观察到的值\(L\) 针对所有可能排列的排列实现的统计量(在每个排列均等可能的零假设下)

返回

res PageTrendTestResult

包含属性的对象:

统计 浮点数

Page 的 测试统计量。

p值 浮点数

相关 p 值

方法 {‘asymptotic’, ‘exact’}

用于计算 p 值的方法

注意

如 [1] 中所述,“ ‘treatments’ 也可以代表 对象或事件或表演或人员或试验排名。”类似地, ‘subjects’ 可以同样代表 “按能力或其他控制变量分组,或进行排名的法官,或其他类型的随机复制。”

改编自 [1] 的 统计量的计算过程是:

  1. “用仔细的逻辑预先确定有关实验结果的预测排序的适当假设。如果不知道排序任何治疗的合理依据,则 测试不合适。”

  2. “与其他实验一样,确定在何种置信水平下你会拒绝零假设,即实验结果与单调假设不一致。”

  3. “将实验材料放入 列(治疗、排名对象、条件)和 行(受试者、复制组、控制变量水平)的双向表中。”

  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] 继续建议使用标准化统计数据

“它大约分布为自由度为 1 的卡方。的普通使用\(\chi^2\) 表格相当于双方的一致性检验。如果需要进行单方面测试,几乎总是如此,在卡方表中发现的概率应该是减半。”

然而,这个标准化的统计量并不能区分与预测等级相关的观察值和与预测等级的反相关。相反,我们遵循 [2] 并计算标准化统计量

其中 ,“在原假设下是渐近正态的”。

p-值method='exact'通过比较观察值生成\(L\) 反对这\(L\) 为所有人生成的值\((n!)^m\) 可能的等级排列。使用[5]的递归方法进行计算。

p- 值未针对平局的可能性进行调整。当存在联系时,报告的'exact' p- 值可能比真实值稍大(即更保守)p-值[2].这'asymptotic'` p然而, - 值往往小于(即不那么保守)'exact' p-值。

参考

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

Ellis Batten Page,“多重治疗的有序假设:线性秩的显著检验”,美国统计协会杂志 58(301),p。 216-230,1963。

[2] (1,2)

马库斯·纽豪泽,非参数统计检验:一种计算方法, CRC 出版社, p. 150-152,2012。

[3] (1,2)

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

[4]

“页面趋势测试”,维基百科, 维基媒体基金会,https://en.wikipedia.org/wiki/Page%27s_trend_test, 于 2020 年 7 月 12 日访问。

[5]

Robert E. Odeh,“双向布局中 Page’s L-statistic 的精确分布”,统计通讯 - 模拟与计算,6(1),第 11 页。 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% 的置信水平上拒绝零假设,支持我们的替代方案。

统计数据的值为 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-value 是在标准化检验统计量下评估的正态分布的生存函数:

>>> 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

这并不完全符合p- 报告的值page_trend_test更多。渐近分布不是很准确,也不是保守的,因为\(m \leq 12\) \(n \leq 8\) , 所以page_trend_test选择使用method='exact'基于表格的尺寸和佩奇原始论文中的建议[1].覆盖page_trend_test的选择,提供方法争论。

>>> 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')

相关用法


注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.stats.page_trend_test。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。