page_trend_test#
- scipy.stats.page_trend_test(data, ranked=False, predicted_ranks=None, method='auto')[source]#
執行 Page 趨勢檢定,一種衡量不同處理組之間觀察值趨勢的方法。
當符合以下條件時,Page 趨勢檢定(也稱為 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 \(\rho\) 考慮的是兩個變數的等級觀察值之間的相關性(例如,燕子的空速與其攜帶的椰子的重量),Page’s \(L\) 關注的是跨多個不同處理組(例如,攜帶五個不同重量的椰子中的每一個)的觀察值(例如,燕子的空速)的趨勢,即使觀察值在多個受試者中重複進行(例如,一隻歐洲燕子和一隻非洲燕子)。
- 參數:
- dataarray-like
一個 \(m \times n\) 陣列;第 \(i\) 列和第 \(j\) 行中的元素是與受試者 \(i\) 和處理組 \(j\) 相對應的觀察值。預設情況下,假設列按預測平均值遞增的順序排列。
- rankedboolean,選用
預設情況下,data 被假定為觀察值而不是等級;它將使用
scipy.stats.rankdata
沿著axis=1
進行排序。如果 data 以等級形式提供,請傳遞參數True
。- predicted_ranksarray-like,選用
列平均值的預測等級。如果未指定,則假設列按預測平均值遞增的順序排列,因此預設的 predicted_ranks 是 \([1, 2, \dots, n-1, n]\)。
- method{‘auto’, ‘asymptotic’, ‘exact’}, 選用
選擇用於計算 p 值的的方法。以下選項可用。
‘auto’:在 ‘exact’ 和 ‘asymptotic’ 之間選擇,以在合理的時間內獲得合理準確的結果(預設值)
‘asymptotic’:將標準化檢定統計量與常態分佈進行比較
‘exact’:通過將觀察到的 \(L\) 統計量與所有可能的等級排列實現的統計量進行比較來計算精確的 p 值(在每個排列同樣可能的虛無假設下)
- 回傳值:
- resPageTrendTestResult
包含屬性的物件
- statisticfloat
Page’s \(L\) 檢定統計量。
- pvaluefloat
相關聯的 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”,Wikipedia,WikimediaFoundation,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')