scipy.stats.

logrank#

scipy.stats.logrank(x, y, alternative='two-sided')[原始碼]#

透過對數秩檢定比較兩個樣本的存活分佈。

參數:
x, yarray_like 或 CensoredData

根據經驗存活函數比較的樣本。

alternative{‘two-sided’, ‘less’, ‘greater’}, optional

定義對立假設。

虛無假設是兩組(例如 XY)的存活分佈相同。

以下對立假設 [4] 可用(預設為 ‘two-sided’)

  • ‘two-sided’:兩組的存活分佈不相同。

  • ‘less’:組別 X 的存活率較高:在某些時間點,組別 X 的失敗率函數小於組別 Y 的失敗率函數。

  • ‘greater’:組別 Y 的存活率較高:在某些時間點,組別 X 的失敗率函數大於組別 Y 的失敗率函數。

返回:
resLogRankResult

包含屬性的物件

statisticfloat ndarray

計算出的統計量(定義如下)。其量值是大多數其他對數秩檢定實作返回的量值的平方根。

pvaluefloat ndarray

檢定的計算 p 值。

另請參閱

scipy.stats.ecdf

註解

對數秩檢定 [1] 將觀察到的事件數與虛無假設下的預期事件數進行比較,虛無假設是兩個樣本來自相同的分佈。統計量為

\[Z_i = \frac{\sum_{j=1}^J(O_{i,j}-E_{i,j})}{\sqrt{\sum_{j=1}^J V_{i,j}}} \rightarrow \mathcal{N}(0,1)\]

其中

\[E_{i,j} = O_j \frac{N_{i,j}}{N_j}, \qquad V_{i,j} = E_{i,j} \left(\frac{N_j-O_j}{N_j}\right) \left(\frac{N_j-N_{i,j}}{N_j-1}\right),\]

\(i\) 表示組別(即,它可以假設值 \(x\)\(y\),或者可以省略以指代組合樣本),\(j\) 表示時間(事件發生的時間),\(N\) 是事件發生前處於風險中的受試者人數,而 \(O\) 是該時間點觀察到的事件數。

logrank 返回的 statistic \(Z_x\) 是許多其他實作返回的統計量的(帶符號)平方根。在虛無假設下,\(Z_x**2\) 根據自由度為 1 的卡方分佈漸近分佈。因此,\(Z_x\) 根據標準常態分佈漸近分佈。使用 \(Z_x\) 的優點是保留了符號資訊(即,觀察到的事件數是否傾向於小於或大於虛無假設下的預期數量),從而允許 scipy.stats.logrank 提供單側對立假設。

參考文獻

[1]

Mantel N. “生存資料的評估及其考量中出現的兩個新秩次統計量。” Cancer Chemotherapy Reports, 50(3):163-170, PMID: 5910392, 1966

[2]

Bland, Altman, “對數秩檢定”, BMJ, 328:1073, DOI:10.1136/bmj.328.7447.1073, 2004

[3]

“對數秩檢定”, 維基百科, https://en.wikipedia.org/wiki/Logrank_test

[4]

Brown, Mark. “關於對數秩檢定變異數的選擇。” Biometrika 71.1 (1984): 65-74.

[5]

Klein, John P., 和 Melvin L. Moeschberger。 生存分析:截尾和截斷資料的技術。 卷。 1230. 紐約:Springer,2003。

範例

參考文獻 [2] 比較了兩種不同類型復發性惡性神經膠質瘤患者的存活時間。 下面的樣本記錄了每位患者參與研究的時間(週數)。 scipy.stats.CensoredData 類別被使用,因為資料是右截尾的:未截尾的觀察值對應於觀察到的死亡,而截尾的觀察值對應於患者因其他原因離開研究。

>>> from scipy import stats
>>> x = stats.CensoredData(
...     uncensored=[6, 13, 21, 30, 37, 38, 49, 50,
...                 63, 79, 86, 98, 202, 219],
...     right=[31, 47, 80, 82, 82, 149]
... )
>>> y = stats.CensoredData(
...     uncensored=[10, 10, 12, 13, 14, 15, 16, 17, 18, 20, 24, 24,
...                 25, 28,30, 33, 35, 37, 40, 40, 46, 48, 76, 81,
...                 82, 91, 112, 181],
...     right=[34, 40, 70]
... )

我們可以如下計算和視覺化兩組的經驗存活函數。

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> ax = plt.subplot()
>>> ecdf_x = stats.ecdf(x)
>>> ecdf_x.sf.plot(ax, label='Astrocytoma')
>>> ecdf_y = stats.ecdf(y)
>>> ecdf_y.sf.plot(ax, label='Glioblastoma')
>>> ax.set_xlabel('Time to death (weeks)')
>>> ax.set_ylabel('Empirical SF')
>>> plt.legend()
>>> plt.show()
../../_images/scipy-stats-logrank-1_00_00.png

經驗存活函數的視覺檢查表明,兩組之間的存活時間趨勢不同。 為了正式評估差異是否在 1% 水準上顯著,我們使用對數秩檢定。

>>> res = stats.logrank(x=x, y=y)
>>> res.statistic
-2.73799
>>> res.pvalue
0.00618

p 值小於 1%,因此我們可以認為資料是反對虛無假設的證據,而支持兩組存活函數之間存在差異的對立假設。