Analyse de survie apprise avec Python 2 - Estimation Kaplan-Meier

Cliquez ici pour l'article précédent Analyse du temps de survie apprise avec Python 1-Qu'est-ce que les données de temps de survie? https://qiita.com/Goriwaku/items/8d00696d853da73505bd

Pour les données utilisées cette fois, veuillez vous référer à l'article précédent ou télécharger (whas500.csv) depuis mon git (https://github.com/goriwaku/survival_analysis).

Qu'est-ce qu'une fonction de survie?

J'expliquerai la fonction de survie en utilisant WHAS500, qui a été discutée dans l'article précédent. Pour le temps t comme variable continue, nous définissons le temps de survie comme une variable stochastique comme T. A ce moment, la fonction de distribution cumulative de T indique que les sujets extraits aléatoirement sont inférieurs ou égaux à un certain temps t, et sont définis comme suit.

F(t)=Pr(T \leq t)

Ici, la fonction de survie peut être exprimée par la probabilité d'obtenir un temps de survie T supérieur à un certain temps t.

S(t)=Pr(T > t)

Ce sera. A ce moment, à tout moment t, en considérant la survie comme un événement résiduel de décès, l'équation suivante tient par l'axiome de probabilité.

S(t)=1-F(t)

Regardons maintenant cette estimation de la fonction de survie, en particulier l'estimation de Kaplan-Meier, qui est une estimation de la fonction de temps de survie en présence de troncatures du côté droit.

Estimation de la fonction de survie

Nous allons en fait estimer la fonction de survie. À titre d'exemple, envisagez d'estimer la fonction de survie à partir du temps de survie et du statut de survie de 5 personnes, comme indiqué ci-dessous.

Numéro du sujet temps Arrêt pour cause de décès
1 6 1
2 44 1
3 21 0
4 14 1
5 62 1

Au temps 0, les 5 sont vivants, donc $ \ hat {S} (t) = 1,0 $. Puisque le sujet numéro 1 meurt le 6e jour, la condition de décès dans cette petite section est considérée, en considérant la petite section $ (6- \ delta, 6] $ qui commence peu avant le 6e jour et se termine le 6e jour. La probabilité d'attachement estimée est de 1/5 $ et la probabilité de survie est de 4/5 $. Les sujets qui sont en vie à un moment donné sont des ** ensembles de risques ** à risque de décès. Le nombre de personnes est exprimé en nombre à risque. La durée de survie estimée peut être exprimée par ** (probabilité de vivre jusqu'à ce point) x (probabilité conditionnelle de survivre dans la section minute ci-dessus) **. L'intervalle $ I_i $ est divisé par le temps dans le tableau ci-dessus dans l'ordre croissant (ex: $ I_0 = [0, 6) $), $ n_i $ est le nombre à risque à ce moment, et $ d_i $ est à ce moment. Le nombre de personnes décédées. À ce stade, la probabilité de mortalité estimée peut être exprimée en $ d_1 / n_1 $ et la probabilité de survie peut être exprimée en $ (n_1 --d_1) / n_1 $ dans un petit intervalle proche du jour où un événement se produit. Par conséquent, lors de l'estimation de la probabilité de survie aux 6e et 14e jours,

\hat{S}(6)=1 \times \frac{4}{5}=\frac{4}{5}\\
\hat{S}(14)=1 \times \frac{4}{5} \times \frac{3}{4} = \frac{3}{5}

Ce sera. Dans le cas suivant, le sujet numéro 3 abandonnera le groupe à risque le jour 21 avec une résiliation non indépendante du décès. Dans cet intervalle de minutes, $ n_3 = 3 $ et $ d_3 = 0 $, donc la valeur estimée de la fonction de survie est

\hat{S}(21)=1 \times \frac{4}{5} \times \frac{3}{4} \times \frac{3}{3} = \frac{3}{5}

Sans surprise, les estimations de la fonction de survie ne changent pas car aucun décès n'est survenu dans l'intervalle $ I_3 $. L'intervalle suivant peut également être utilisé pour obtenir la valeur estimée de la fonction de survie. La valeur estimée de la fonction de survie obtenue par cette méthode est appelée ** valeur estimée de Kaplan-Meier **.

Tracons maintenant l'estimation de Kaplan-Meier comme une fonction d'étape.

test_data = [[6, 1],[44, 1],[21, 0],[14, 1],[62, 1]]
test_data = sorted(test_data, key=lambda x: x[0], reverse=False)

s = 1
n = 5
pre = 0
for t, censor in test_data:
    plt.plot((pre, t), (s, s), color='blue')
    if censor == 1:
        plt.plot((t, t), (s, s * (n - 1) / n), color='blue')
        s = s * (n - 1) / n
    n -= 1
    pre = t
plt.show()

J'ai stocké le tableau sous forme de tableau bidimensionnel et l'ai trié par ordre croissant de t pour en faciliter l'utilisation. Si vous souhaitez trier un tableau à deux dimensions, spécifiez les éléments à trier par argument de mot clé tel que key = lambda x: x [0]. Si vous souhaitez trier par censure, vous pouvez saisir x [1]. Après cela, la probabilité de survie est calculée avec l'instruction for, et le tracé de celle-ci est montré dans la figure ci-dessous. kaplan_meier_test.png Ainsi, la courbe Kaplan = Meier est sortie en tant que fonction échelonnée. Elle diminue lorsque la mortalité est observée et reste constante pendant cette période. A $ t = 62 $, il n'y a pas de survivants, donc la fin est $ \ hat {S} (62) = 0 $. Dans cet exemple, plusieurs décès ne se sont pas produits dans le même t (cela s'appelle ** égalité **), mais même en cas d'égalité, un nombre aléatoire est généré et l'ordre est attribué au hasard. Vous pouvez développer une discussion. De plus, même si les données d'égalité sont traitées uniformément dans l'estimation du KM, l'estimation finale est la même, il n'est donc fondamentalement pas nécessaire de faire des ajustements. En pratique, c'est rare, mais si vous avez un très grand nombre de liens, vous devriez envisager d'utiliser un modèle temporel discret au lieu d'une estimation KM. Il convient également de noter que si le temps d'observation final est coupé du côté droit, le temps de survie estimé après cela ne peut pas être défini.

Généralisation des estimations de Kaplan-Meier

Les estimations de Kaplan-Meier sont si couramment utilisées dans l'analyse de survie que nous en donnons ici une formulation générale. Lorsque t est fini, le tri ne perd pas sa généralité, donc triez t par ordre croissant et les variables binaires $ c_i $, à risque à $ t_i $, qu'il s'agisse ou non d'un capteur par décès à $ t_i $. Sous $ n_1 $, le nombre de décès observés $ d_i $, l'estimation de Kaplan-Meier de la fonction de survie au point temporel t est:

\hat{S}(t)=\prod_{t_i \leq t}\frac{n_i - d_i}{n_i}

Cependant, quand $ t \ leq t_1 $, $ \ hat {S} (t) = 1 $.

Diagramme de courbe de Kaplan-Meier

J'ai tracé la courbe de Kaplan-Meier par moi-même plus tôt, mais python dispose d'une bibliothèque pour l'analyse du temps de survie appelée lifelines sans avoir à l'implémenter moi-même. Dans cette section, nous utiliserons ces lignes de vie pour dessiner la courbe de Kaplan-Meier du WHAS500 précédent. Lifelines n'est pas inclus par défaut, donc si vous ne l'avez jamais utilisé, procédez d'abord comme suit dans un terminal ou une invite de commande:

pip install lifelines

Maintenant, voici le code python.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import lifelines as ll
from lifelines import KaplanMeierFitter


whas = pd.read_csv('whas500.csv')
kmf = KaplanMeierFitter()
kmf.fit(whas.LENFOL, event_observed=whas.FSTAT)
kmf.plot_survival_function()
print(kmf.survival_function_)
plt.show()

Mettez le temps t dans le premier argument d'ajustement de KaplanMeierFitter des lignes de vie, et mettez la variable binaire indiquant si l'événement (la mort) que vous voulez observer s'est produit dans l'argument mot-clé event_observed, et laissez-le s'adapter. Ensuite, vous pouvez facilement tracer la courbe KM avec la fonction .plot_survival_fuction () du modèle. Utilisez également survival_function_ pour obtenir la fonction de survie estimée. Il s'agit d'un type de pandas DataFrame et renvoie une paire de points temporels et une valeur estimée. Il est également possible d'obtenir la fonction de distribution cumulative $ F (t) $ mentionnée ci-dessus en remplaçant fonction_survie par densité_cumulative. Le tracé réel de la courbe KM est illustré ci-dessous. whas500_km.png La largeur du bleu clair sur la figure est l'intervalle de confiance.

Ceci conclut l'explication des estimations de Kaplan-Meier et leur mise en œuvre. La prochaine fois, j'aimerais interpréter l'estimation de Kaplan-Meier et comparer les deux groupes, j'espère donc que vous continuerez à lire.

Références / liens de référence

Introduction à l'analyse du temps de survie Hosmer DW, Lemeshow S, May S LIFELINES https://lifelines.readthedocs.io/en/latest/index.html Université de Kyoto OCW Cours d'audit de l'École supérieure de médecine de l'Université de Kyoto Biostatistique pour les chercheurs cliniques "Bases de l'analyse du temps de survie" https://www.youtube.com/watch?v=NmZaY2tDKSA&feature=emb_title

Recommended Posts

Analyse de survie apprise avec Python 2 - Estimation Kaplan-Meier
Python: analyse des séries chronologiques
Analyse d'association en Python
Analyse de régression avec Python
Refactoring appris avec Python (Basic)
Analyse des contraintes symétriques axiales avec Python
Classe Python pour apprendre avec la chimioinfomatique
Analyse de régression simple avec Python
Ce que j'ai appris en Python
Code de caractère appris en Python
Fonctions Python apprises avec la chimioinfomatique
[Comprendre au plus court] Principes de base de Python pour l'analyse des données
Commande Python dans "Analyse des réseaux sociaux apprise par l'open source"
Analyse des ondes cérébrales avec Python: tutoriel Python MNE
Première analyse de régression simple en Python
Python: analyse des séries chronologiques: prétraitement des données des séries chronologiques
Mesurer le temps d'exécution de la fonction en Python
J'ai essayé d'étudier le processus avec Python
Utilisation élémentaire d'ITK apprise avec Python
Analyse du squelette planaire dans Python (2) Hotfix
Tests de code dans le temps en Python
git / python> analyse git log (v0.1, v0.2)> calculer le temps de travail total en minutes à partir de git log
Il suffit d'imprimer le temps écoulé en Python en secondes
MongoDB avec Python pour la première fois
Analyse résiduelle en Python (Supplément: règles Cochrane)
Comparaison temporelle: calcul du coefficient de corrélation en Python
Introduction à l'analyse des séries temporelles ~ Modèle d'ajustement saisonnier ~ Implémenté en R et Python
Python: analyse des séries temporelles: création d'un modèle SARIMA
Obtenez des données de séries chronologiques de k-db.com avec Python
Analyse de la variation temporelle des trous noirs en utilisant Python
3 façons d'analyser les chaînes de temps avec python [Note]
Variables Python et types de données appris avec la chimio-automatique
Python: Analyse des séries temporelles: Constantity, modèle ARMA / ARIMA
Distribution de probabilité de niveau 2 du test statistique apprise en Python ②
Une manière intelligente de chronométrer le traitement avec Python
Effectuer une analyse d'entité à l'aide de spaCy / GiNZA en Python
Analyse de données en Python: une note sur line_profiler
[Construction de l'environnement] Analyse des dépendances à l'aide de CaboCha avec Python 2.7
100 traitements du langage frappent l'analyse morphologique apprise au chapitre 4
Distribution de probabilité de test statistique de niveau 2 apprise en Python
Environnement enregistré pour l'analyse des données avec Python
TensorFlow: exécuter des données apprises en Python sur Android
Pour représenter la date, l'heure, l'heure et les secondes en Python
Quadtree en Python --2
CURL en Python
Métaprogrammation avec Python
Premier Python
Python 3.3 avec Anaconda
Géocodage en python
SendKeys en Python
Méta-analyse en Python
Unittest en Python
[Introduction à la décomposition des éléments] Organisons les méthodes d'analyse des séries chronologiques en R et python ♬
Analyse de données python
Discord en Python
mesure du temps python
DCI en Python
tri rapide en python
nCr en python
N-Gram en Python