當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。