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], 佩奇的 \(L\) 对于趋势存在差异的另一种选择,检验比弗里德曼检验具有更大的统计能力,因为弗里德曼检验只考虑观察均值的差异,而不考虑它们的顺序。而斯皮尔曼 \(\rho\) 考虑两个变量(例如,燕子的空速与其携带的椰子的重量)的排序观测之间的相关性,Page的 \(L\) 它关注的是几种不同处理(例如,携带五个不同重量的椰子中的每一个)的观察中的趋势(例如,燕子的空速),即使在对多个受试者(例如,一只欧洲燕子和一只非洲燕子)重复观察的情况下也是如此。
- 参数
- data类似阵列的
A \(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’,‘渐近’,‘精确’},可选
选择用于计算 p -价值。以下选项可用。
“auto”:在“精确”和“渐近”之间选择,以便在合理的时间内获得相当准确的结果(默认)
“渐近”:将标准化测试统计数据与正态分布进行比较
‘Exact’:计算精确的 p -通过比较观察到的 \(L\) 针对所有可能的排名排列实现的统计(在每个排列可能性相等的零假设下)
- 退货
- resPageTrendTestResult
包含属性的对象:
- 统计数据浮动
佩奇的 \(L\) 测试统计。
- p值浮动
关联的 p -值
- 方法{‘渐近’,‘精确’}
用于计算 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)\) “在零假设下是渐近正态的”。
这个 p -的值
method='exact'
的观测值进行比较,从而生成 \(L\) 针对的是 \(L\) 为所有对象生成的值 \((n!)^m\) 可能的等级排列。计算是使用以下递归方法执行的 [5] 。The p-values are not adjusted for the possibility of ties. When ties are present, the reported
'exact'
p-values may be somewhat larger (i.e. more conservative) than the true p-value [2]. The'asymptotic'`
p-values, however, tend to be smaller (i.e. less conservative) than the'exact'
p-values.参考文献
- 1(1,2,3,4)
Ellis Batten Page,“多重治疗的有序假设:线性等级的显著性检验”, 美国统计协会杂志 58(301),第216-230页,1963年。
- 2(1,2)
马库斯·纽豪瑟 非参数统计检验:一种计算方法 “CRC出版社”,第150--152页,2012年。
- 3(1,2)
Statext LLC,“Page‘s L趋势测试-简易统计”, Statext - Statistics Study ,https://www.statext.com/practice/PageTrendTest03.php,于2020年7月12日访问。
- 4
“佩奇趋势测试”, 维基百科 ,维基媒体基金会,https://en.wikipedia.org/wiki/Page%27s_trend_test,于2020年7月12日访问。
- 5
罗伯特·E·奥德,“双向布局中佩奇的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 -值表示有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 -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
的选择,则提供 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')