scipy.stats.

logrank#

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

Vergleichen Sie die Überlebensverteilungen von zwei Stichproben mithilfe des Logrank-Tests.

Parameter:
x, yarray_like oder CensoredData

Zu vergleichende Stichproben basierend auf ihren empirischen Überlebensfunktionen.

alternative{‘zweiseitig’, ‘kleiner’, ‘größer’}, optional

Definiert die alternative Hypothese.

Die Nullhypothese ist, dass die Überlebensverteilungen der beiden Gruppen, sagen wir X und Y, identisch sind.

Die folgenden alternativen Hypothesen [4] sind verfügbar (Standard ist 'two-sided')

  • 'two-sided': die Überlebensverteilungen der beiden Gruppen sind nicht identisch.

  • 'less': Das Überleben der Gruppe X wird bevorzugt: die Ausfallratenfunktion der Gruppe X ist zu bestimmten Zeiten geringer als die der Gruppe Y.

  • 'greater': Das Überleben der Gruppe Y wird bevorzugt: die Ausfallratenfunktion der Gruppe X ist zu bestimmten Zeiten größer als die der Gruppe Y.

Rückgabe:
resLogRankResult

Ein Objekt, das Attribute enthält

statisticfloat ndarray

Die berechnete Statistik (unten definiert). Ihr Betrag ist die Quadratwurzel des Betrags, der von den meisten anderen Logrank-Testimplementierungen zurückgegeben wird.

pvaluefloat ndarray

Der berechnete p-Wert des Tests.

Siehe auch

scipy.stats.ecdf

Hinweise

Der Logrank-Test [1] vergleicht die beobachtete Anzahl von Ereignissen mit der erwarteten Anzahl von Ereignissen unter der Nullhypothese, dass die beiden Stichproben aus derselben Verteilung gezogen wurden. Die Statistik lautet

\[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)\]

wo

\[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\) bezeichnet die Gruppe (d.h. sie kann Werte \(x\) oder \(y\) annehmen, oder sie kann weggelassen werden, um sich auf die kombinierte Stichprobe zu beziehen) \(j\) bezeichnet die Zeit (zu der ein Ereignis auftrat), \(N\) ist die Anzahl der zu Beginn eines Ereignisses noch gefährdeten Subjekte und \(O\) ist die beobachtete Anzahl von Ereignissen zu diesem Zeitpunkt.

Die von logrank zurückgegebene statistic \(Z_x\) ist die (vorzeichenbehaftete) Quadratwurzel der Statistik, die von vielen anderen Implementierungen zurückgegeben wird. Unter der Nullhypothese ist \(Z_x**2\) asymptotisch nach der Chi-Quadrat-Verteilung mit einem Freiheitsgrad verteilt. Folglich ist \(Z_x\) asymptotisch nach der Standardnormalverteilung verteilt. Der Vorteil der Verwendung von \(Z_x\) ist, dass die Vorzeicheninformation (d.h. ob die beobachtete Anzahl von Ereignissen tendenziell geringer oder größer ist als die unter der Nullhypothese erwartete Anzahl) erhalten bleibt, was es scipy.stats.logrank ermöglicht, einseitige alternative Hypothesen anzubieten.

Referenzen

[1]

Mantel N. „Evaluation of survival data and two new rank order statistics arising in its consideration.“ Cancer Chemotherapy Reports, 50(3):163-170, PMID: 5910392, 1966

[2]

Bland, Altman, „The logrank test“, BMJ, 328:1073, DOI:10.1136/bmj.328.7447.1073, 2004

[3]

„Logrank test“, Wikipedia, https://en.wikipedia.org/wiki/Logrank_test

[4]

Brown, Mark. „On the choice of variance for the log rank test.“ Biometrika 71.1 (1984): 65-74.

[5]

Klein, John P., und Melvin L. Moeschberger. Survival analysis: techniques for censored and truncated data. Vol. 1230. New York: Springer, 2003.

Beispiele

Referenz [2] verglich die Überlebenszeiten von Patienten mit zwei verschiedenen Arten von rezidivierenden malignen Gliomen. Die nachfolgenden Stichproben zeichnen die Zeit (Anzahl der Wochen) auf, die jeder Patient an der Studie teilgenommen hat. Die Klasse scipy.stats.CensoredData wird verwendet, da die Daten rechtszensiert sind: die unzensierten Beobachtungen entsprechen beobachteten Todesfällen, während die zensierten Beobachtungen dem Grund entsprechen, warum der Patient die Studie aus anderen Gründen verlassen hat.

>>> 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]
... )

Wir können die empirischen Überlebensfunktionen beider Gruppen wie folgt berechnen und visualisieren.

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

Die visuelle Inspektion der empirischen Überlebensfunktionen legt nahe, dass die Überlebenszeiten zwischen den beiden Gruppen tendenziell unterschiedlich sind. Um formal zu prüfen, ob der Unterschied auf dem 1%-Niveau signifikant ist, verwenden wir den Logrank-Test.

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

Der p-Wert ist kleiner als 1%, daher können wir die Daten als Beweis gegen die Nullhypothese werten, zugunsten der Alternative, dass es einen Unterschied zwischen den beiden Überlebensfunktionen gibt.