Analyse de survie en Python (estimation KM, modèle Cox-PH et AFT) | par Rahul Raoniar | The Researchers’ Guide

Analyse de survie en Python

L’analyse de survie est une branche des statistiques permettant d’analyser la durée prévue du temps jusqu’à ce qu’un ou plusieurs événements se produisent. Cette méthode est également connue sous le nom d’analyse de la durée ou de modélisation de la durée, d’analyse du temps par rapport à l’événement, d’analyse de la fiabilité et d’analyse de l’historique des événements.

L’analyse de survie est utilisée pour analyser les questions suivantes :

  • Une proportion de la population qui survit jusqu’à un temps donné
  • Vitesse à laquelle ils meurent
  • Comprendre l’impact des covariables sur la survie

L’analyse de survie est utilisée dans divers domaines de recherche :

  • Médecine: Comprendre la survie du patient lorsqu’il est diagnostiqué avec une maladie mortelle
  • Médical: Durée de réadmission à l’hôpital après une chirurgie cardiaque majeure
  • Industrie: Quand la batterie d’une voiture Tesla tombera-t-elle définitivement en panne ?
  • Transport: Temps d’attente d’un piéton après l’arrivée de la phase rouge (ne pas marcher) à une intersection.
  • Commerce électronique: Après avoir vu des publicités, quand une personne achète le produit.
  • Ressources humaines: Quand un employé quitte une entreprise (churn)

Il existe plusieurs méthodes utilisées par les chercheurs pour comprendre les données temporelles. Dans cet article, nous allons apprendre les types de modèles suivants et essayer de comprendre leur mécanisme dans l’analyse du temps écoulé.

  • Estimation de Kaplan-Maier (non-paramétrique)
  • Modèle de risque proportionnel de Cox (semi-paramétrique)
  • Modèle de temps de défaillance accéléré (paramétrique)

L’objectif de l’article est de comprendre la survie des patients atteints de cancer du poumon en utilisant l’analyse du temps jusqu’à l’événement.

Note : Si vous n’êtes pas familier avec l’analyse de survie, je vous recommande vivement de lire quelques articles et de regarder quelques vidéos YouTube sur l’analyse de survie. Voici quelques ressources de lecture et de vidéo pour apprendre l’analyse de survie :

Ressources de lecture
Blog 1 : Lien
Blog 2 : Lien

Ressources vidéo
1. Vidéos sur les concepts de l’analyse de survie (Chaîne: MarinStatsLectures-R Programmation et statistiques) : Lien
2. Chaîne Zedstatistics : Lien

**L’article actuel présente une mise en œuvre de l’analyse du temps par rapport aux événements en utilisant la bibliothèque Lifelines de Python.

  • Description des données sur le cancer du poumon
  • Imputation des valeurs manquantes
  • Estimation de la courbe de Kaplan Meier
  • Ajustement de la régression des risques proportionnels de Cox
  • Interprétation des résultats du modèle de Cox
  • Test de l’hypothèse de risque proportionnel
  • Ajustement du modèle de temps de défaillance accéléré (AFT)
  • Interprétation des résultats du modèle AFT

Commençons par ! !!!!!

Chargement des bibliothèques

Tout d’abord, nous devons installer et charger les bibliothèques suivantes pour commencer l’analyse de survie.

  • Numpy : manipulation de tableaux
  • Pandas : Manipulation de données
  • Lignes de vie : Analyse de survie
  • Matplotlib : pour tracer/générer des graphiques
import numpy as np
import pandas as pd
from lifelines import KaplanMeierFitter
import matplotlib.pyplot as plt

Données sur le cancer du poumon

Il s’agit maintenant de se faire une idée des données sur le cancer du poumon que nous allons utiliser pour l’analyse. Les données sont initialement disponibles dans le langage de programmation R (dans la bibliothèque survival). [1]. Je les ai donc téléchargées de R pour les utiliser à des fins d’apprentissage. La source de données est mentionnée ci-dessous.

Source de données : Loprinzi CL. Laurie JA. Wieand HS. Krook JE. Novotny PJ. Kugler JW. Bartel J. Law M. Bateman M. Klatt NE. et al. Prospective evaluation of prognostic variables from patient-completed questionnaires. Groupe de traitement du cancer du Centre-Nord. Journal of Clinical Oncology. 12(3):601-7, 1994.

Description des données

Les données consistent en 228 observations et 10 variables/colonnes. La description des variables est présentée comme suit :

  • inst: Code de l’institution
  • heure (d1): Temps de survie en jours
  • statut (d2): statut de censure 1 = censuré, 2 = mort
  • âge (i1): Âge en années
  • sexe (i2): Homme = 1 Femme = 2
  • ph.ecog (i3): Score de performance ECOG tel qu’évalué par le médecin. 0 = asymptomatique, 1 = symptomatique mais complètement ambulatoire, 2 = au lit <50% de la journée, 3 = au lit &gt ; 50% de la journée mais pas alité, 4 = alité.
  • ph.karno (i4): Score de performance de Karnofsky (mauvais = 0 ; bon = 100) évalué par le médecin.
  • pat.karno (i4): Score de performance de Karnofsky évalué par le patient.
  • repas.cal (i5) : Calories consommées lors des repas
  • perte de poids (i6): Perte de poids au cours des six derniers mois

Où : ‘i‘ indique les variables indépendantes (covariables), et ‘dindique les variables dépendantes. En fait, la variable dépendante ou réponse est le temps jusqu’à l’occurrence d’un événement (c’est-à-dire le décès du patient atteint d’un cancer du poumon).

Chargement des données

Tout d’abord, lisons le poumon.csv données de notre stockage local et les stocker dans données objet. Nous pouvons imprimer les cinq premières observations en utilisant la commande head( ) fonction.

data = pd.read_csv("lung.csv", index_col = 0)
data.head()
Cinq premières observations

Ensuite, vérifions la forme des données en utilisant .shape attribut. Les données se composent de 228 observations et de 10 variables/colonnes.

data.shape

(228, 10)

Fixation de l’étiquette de base

Le statut et le sexe sont des données catégorielles. Le statut se compose de 1 : censuré et 2 : mort ; tandis que le sexe se compose de 1 : homme et 2 : femme. Nous pouvons les garder ainsi, mais je préfère généralement que l’étiquette de base des variables catégorielles soit 0 (zéro). Ainsi, pour que l’étiquette de base soit 0, nous devons déduire 1 des variables.

data = data[['time', 'status', 'age', 'sex', 'ph.ecog', 'ph.karno','pat.karno', 'meal.cal', 'wt.loss']]data["status"] = data["status"] - 1
data["sex"] = data["sex"] - 1
data.head()
Observations après avoir changé les étiquettes de base

Maintenant, vérifions le type de données. Le temps, le statut, l’âge et le sexe sont de type integer64 tandis que ph.ecog, ph.karno, meal.cal et wt.loss sont de type float64.

data.dtypes
Types de données

Vérification et imputation des valeurs manquantes

L’étape importante suivante consiste à vérifier si les variables contiennent des valeurs manquantes. Nous pouvons le vérifier en utilisant .isnull( ) et en appliquant la méthode .sum( ) par-dessus. Le tableau résultant illustre ce qui suit :

ph.ecog : 1 valeur manquante
ph.karno : 1 valeur manquante
pat karno : 3 valeurs manquantes
meal.cal : 47 valeurs manquantes
perte.de.poids : 14 valeurs manquantes

data.isnull().sum()
Nombre de valeurs manquantes

Une façon de traiter les valeurs manquantes est de les supprimer entièrement, mais cela réduira l’échantillon lorsque vous avez déjà une petite taille d’échantillon. La méthode suivante serait d’imputer les valeurs manquantes avec la moyenne/médiane ou avec une valeur particulière.

Au lieu de supprimer les observations manquantes ici, je les ai imputées (c’est-à-dire ph.karno, pat.karno, meal.cal et wt.loss) avec la moyenne de la colonne telle qu’elle est pour la démonstration. Ensuite, j’ai supprimé la valeur NA de ph.ecog (une colonne catégorielle) en utilisant la méthode suivante .dropna( ) et l’a converti en int64.

data["ph.karno"].fillna(data["ph.karno"].mean(), inplace = True)
data["pat.karno"].fillna(data["pat.karno"].mean(), inplace = True)
data["meal.cal"].fillna(data["meal.cal"].mean(), inplace = True)
data["wt.loss"].fillna(data["wt.loss"].mean(), inplace = True)
data.dropna(inplace=True)
data["ph.ecog"] = data["ph.ecog"].astype("int64")

Si vous vérifiez à nouveau les variables, vous pouvez voir que les variables n’ont maintenant aucune valeur manquante. Donc, nos données sont maintenant prêtes pour une première analyse.

data.isnull().sum()
Vérification des valeurs manquantes

Maintenant, les données contiennent 227 observations et 9 variables (car nous n’avons pas sélectionné la variable institut).

data.shape

(227, 9)

Distribution des données

Tout d’abord, sauvegarder la variable temps dans `T `et la variable event/status dans « .E` que nous utiliserons pendant le processus d’ajustement du modèle.

Traçons un histogramme de la variable temps pour avoir une idée générale de la distribution. L’histogramme montre que la variable temps suit presque une distribution de Weibull ou Log-normale. Nous vérifierons cela pendant la partie d’estimation du modèle AFT.

T = data["time"]
E = data["status"]
plt.hist(T, bins = 50)
plt.show()
Histogramme de la variable temps

Pour commencer l’analyse de survie, la première étape consiste à tracer une courbe de survie de l’ensemble des données. Cela peut être fait en générant une courbe de Kaplan-Maier.

L’approche de Kaplan-Meier, également appelée approche produit-limite, est une approche populaire qui ré-estime la probabilité de survie chaque fois qu’un événement se produit. Il s’agit d’une méthode non-paramétrique La méthode on-paramétrique signifie qu’elle ne suppose pas la distribution de la variable de résultat (c’est-à-dire le temps).

Étapes pour générer une courbe KM :
étape1 : Instancier l’objet de classe KaplanMeierFitter( )
étape 2 : utilisation de .fit( ) méthode et durée d’approvisionnement = T et événement_observé = E
étape3 : utilisation fonction_survie( ) pour générer une courbe KM

La courbe illustre l’évolution des probabilités de survie sur l’horizon temporel. Au fur et à mesure que le temps passe, les probabilités de survie des brevets de cancer du poumon diminuent.

kmf = KaplanMeierFitter()
kmf.fit(durations = T, event_observed = E)
kmf.plot_survival_function()
Graphe KM avec IC 95

Nous pouvons générer le même tracé sans l’intervalle de confiance à 95 % en utilisant la méthode suivante .survival_function_.plot() méthode.

kmf.survival_function_.plot()
plt.title('Survival function')
Graphique KM sans IC 95%.

Nous pouvons également tracer une courbe d’échec. Il s’agit de l’inverse de la survie, c’est-à-dire des probabilités d’échec et de décès dans le temps.

kmf.plot_cumulative_density()
Courbe de survie cumulée

Temps de survie médian et intervalles de confiance

L’étape suivante consiste à estimer le temps de survie médian et les intervalles de confiance à 95%. Ceci peut être fait en utilisant la méthode .temps_de_survie_médian et Temps de survie médians( ). Ici, la durée médiane de survie est de 310 jours, ce qui indique que 50% de l’échantillon vit 310 jours et 50% meurt dans ce délai. La limite inférieure de l’IC 95 % est de 284 jours, tandis que la limite supérieure est de 361 jours.

from lifelines.utils import median_survival_times
median_ = kmf.median_survival_time_
median_confidence_interval_ = median_survival_times(kmf.confidence_interval_)print(median_)
print(median_confidence_interval_)

Graphe KM pour les catégories de genre/sexe

En utilisant l’estimation KM, nous pouvons vérifier la différence entre les groupes catégoriels. Cependant, cette méthode n’est viable que lorsque la variable comporte moins de catégories. Voici un exemple où nous traçons deux courbes de survie, une pour les hommes et une autre pour les femmes.

Les étapes de la génération du tracé sont les suivantes :

  • créer un objet axe
  • créer un masque (objet filtrant) « m » où les mâles sont vrais
  • Ajuster et tracer des courbes pour les observations des mâles et des femelles

La courbe illustre que les probabilités de survie des patients féminins sont globalement plus élevées que celles des patients masculins à tout moment.

ax = plt.subplot(111)
m = (data["sex"] == 0)
kmf.fit(durations = T[m], event_observed = E[m], label = "Male")
kmf.plot_survival_function(ax = ax)
kmf.fit(T[~m], event_observed = E[~m], label = "Female")
kmf.plot_survival_function(ax = ax, at_risk_counts = True)
plt.title("Survival of different gender group")
Courbe KM pour les catégories Genre/Sexe (Homme et Femme)

Graphe KM pour les catégories ph.ecog

Comme pour le sexe, nous pouvons aussi tracer des courbes de survie séparées pour d’autres variables catégorielles. Ici, j’ai utilisé une boucle for qui itère sur toutes les catégories ph.ecog et trace leur fonction de survie sur un seul graphique.

Le quatrième tracé (ligne 2, colonne 2) où l’ecog == 3, semble incomplet.

ecog_types = data.sort_values(by = ['ph.ecog'])["ph.ecog"].unique()for i, ecog_types in enumerate(ecog_types):
ax = plt.subplot(2, 2, i + 1)
ix = data['ph.ecog'] == ecog_types
kmf.fit(T[ix], E[ix], label = ecog_types)
kmf.plot_survival_function(ax = ax, legend = False)
plt.title(ecog_types)
plt.xlim(0, 1200)
plt.tight_layout()
Graphe KM pour les catégories ph.ecog

Nous pouvons étudier plus en détail le ph.ecog == 3 en utilisant valeur_counts( ) méthode. Cela montre que la catégorie 3 n’a qu’une seule observation qui ne contribue pas beaucoup si nous ajustons un modèle.

data['ph.ecog'].value_counts()
ph.ecog label count

Nous devons donc supprimer cette observation des données. Nous pouvons y parvenir en utilisant un processus de filtrage comme indiqué ci-dessous. Maintenant, l’ensemble de données contient 226 observations et 9 variables.

data = data[data["ph.ecog"] != 3]
data.shape

(226, 9)

Vérifions le nombre de valeurs pour le reconfirmer. Maintenant, ça semble bon, la 3ème catégorie a été supprimée.

data['ph.ecog'].value_counts()

Le modèle de Cox-PH est un modèle semi-paramétrique qui résout le problème de l’incorporation des covariables. Dans le modèle de risque proportionnel de Cox, le log-hazard est une fonction linéaire des covariables. et un risque de base au niveau de la population [2].

Equation de risque pour le modèle Cox-PH

Dans l’équation ci-dessus, le premier terme est le risque de base et le second terme est appelé risque partiel. Le risque partiel gonfle ou dégonfle le risque de base en fonction des covariables.

Hypothèses du modèle Cox-PH

Les hypothèses du modèle de régression des risques proportionnels de Cox comprennent :

  • Indépendance des temps de survie entre des individus distincts dans l’échantillon
  • Une relation multiplicative entre les prédicteurs et le hasard, et
  • Un rapport de risque constant dans le temps

Définition du risque et du rapport de risque

  • Le hasard est défini comme la pente de la courbe de survie. Il s’agit d’une mesure de la rapidité avec laquelle les sujets meurent.
  • Le rapport de risque compare deux groupes. Si le rapport de risque est de 2,0, alors le taux de décès dans un groupe est deux fois plus élevé que dans l’autre groupe.

Préparation des données

Pour l’ajustement du modèle Cox-PH, nous devons effectuer un certain prétraitement des variables catégorielles. En particulier le codage dummy. La variable sexe est binaire, nous n’avons donc pas besoin de la coder de façon factice, sauf si nous voulons modifier le schéma de codage, c’est-à-dire 0 pour femme et 1 pour homme. Dans le cas présent, nous devons coder de façon factice la variable « sexe ». ph.ecog variable seulement.

data.head()
Cinq premières observations

Codage fictif

Nous pouvons coder de façon factice le ph.ecog variable utilisant pandas pd.get_dummies( ) méthode. J’ai ajouté l’identifiant du préfixe pour les colonnes générées. Ici, nous allons considérer le ecog_0 comme catégorie de base, donc dans l’étape suivante nous allons la supprimer.

dummies_ecog = pd.get_dummies(data["ph.ecog"], prefix = 'ecog')
dummies_ecog.head(4)
Codage factice

Concaténation avec les données originales

Une fois le codage fictif effectué, nous allons concaténer les deux colonnes, c’est-à-dire, ecog_1 et ecog_2 dans notre ensemble de données d’origine. Ensuite, nous devons laisser tomber la variable catégorielle originale, c’est-à-dire, ph.ecog Utilisation de .drop( ) méthode.

dummies_ecog = dummies_ecog[["ecog_1", "ecog_2"]]
data = pd.concat([data, dummies_ecog], axis = 1)
data = data.drop("ph.ecog", axis = 1)
data.head()
Données finales pour le modèle PH de Cox

Ajustement du modèle Cox-PH

L’étape suivante consiste à ajuster le modèle de Cox-PH.

Les étapes de l’ajustement du modèle sont :

  • Instanciation de CoxPHFitter( ) objet de classe et le sauvegarder dans cph
  • Appeler .fit( ) méthode et données de fourniture, colonne durée et colonne événement
  • Imprimer le tableau récapitulatif des estimations du modèle

Le tableau récapitulatif fournit les coefficients, exp(coef) : aussi connu sous le nom de Hazard Ratio, les intervalles de confiance, z et p-values.

from lifelines import CoxPHFittercph = CoxPHFitter()
cph.fit(data, duration_col = 'time', event_col = 'status')
cph.print_summary()
Tableau récapitulatif du modèle PH de Cox

Interprétation des résultats/estimations du modèle Cox-PH

L’interprétation des estimations du modèle sera la suivante :

  • La perte de poids a un coefficient d’environ -0,01. Nous pouvons nous rappeler que dans le modèle de risque proportionnel de Cox, un risque plus élevé signifie un risque plus important de voir l’événement se produire. Ici, la valeur de exp(-0,01) est appelée le ratio de risque.
  • Il montre qu’une augmentation d’une unité de la perte de poids signifie que le risque de base augmentera d’un facteur exp(-0,01) = 0,99 ⇾ environ une diminution de 1 %.
  • De même, les valeurs de la colonne ph.ecog sont : [0 = asymptomatic, 1 = symptomatic but completely ambulatory and 2 = in bed <50% of the day]. La valeur du coefficient associé à ecog2, exp(1,20), est la valeur du rapport des risques (Hazard Ratio) associé au fait d’être « au lit <50% de la journée (codé 2) » par rapport à la catégorie asymptomatique (codée 0, catégorie de base). Cela indique que le risque (taux) de décès est 3,31 fois plus élevé pour les patients qui sont « au lit <50% de la journée » par rapport aux patients asymptomatiques.

Coefficients du tracé

Ensuite, nous pouvons tracer le classement des variables en fonction de leur log(HR) à l’aide de la fonction .plot( ) méthode.

plt.subplots(figsize = (10, 6))
cph.plot()
Tracé du classement des variables en fonction du log(HR)

Tracé des effets partiels sur le résultat (régression de Cox-PH)

Nous pouvons utiliser notre modèle ajusté pour voir comment la survie change lorsque nous changeons les valeurs des covariables. Ici, j’ai utilisé le modèle plot_partial_effects_on_outcome( ) pour voir comment la survie varie pour le groupe d’âge des brevets de 50, 60, 70 et 80 ans par rapport à leur fonction de base. Cela met clairement en évidence que les jeunes brevets ont des probabilités de survie plus élevées à un moment donné par rapport aux patients âgés.

cph.plot_partial_effects_on_outcome(covariates = 'age', values = [50, 60, 70, 80], cmap = 'coolwarm')
Fonction de survie pour différentes valeurs d’âge

Vérifier l’hypothèse du risque proportionnel

Une fois que nous avons ajusté le modèle, l’étape suivante consiste à vérifier l’hypothèse de risque proportionnel. Nous pouvons utiliser directement le check_assumptions( ) qui renvoie une statistique de test de log rank.

L’hypothèse nulle (H0) suppose que le critère de hasard proportionnel est satisfait, tandis que l’hypothèse alternative (H1) déduit que le critère de hasard proportionnel n’est pas satisfait (violé).

cph.check_assumptions(data, p_value_threshold = 0.05)
Statistiques du test de l’hypothèse PH

Nous pouvons également utiliser la méthode test_d’aléa_proportionnel( ) pour effectuer la même opération.

Le résultat a révélé qu’à un niveau de signification de 5%, seulement repas.cal a violé l’hypothèse. Il existe plusieurs approches pour traiter ce problème, par exemple, nous pouvons le convertir en une catégorie bined, ou nous pouvons utiliser un modèle paramétrique Cox-PH.

from lifelines.statistics import proportional_hazard_testresults = proportional_hazard_test(cph, data, time_transform='rank')
results.print_summary(decimals=3, model="untransformed variables")
Statistiques du test de l’hypothèse PH

Si le critère de l’hypothèse de risque proportionnel du modèle Cox-PH n’est pas satisfait, dans ce cas, une meilleure approche consiste à utiliser un modèle paramétrique. Le modèle AFT (Accelerated Failure Time) est l’un des modèles paramétriques les plus utilisés dans l’analyse de survie.

Ce modèle suppose que la fonction de survie suit une distribution paramétrique continue. Par exemple, on peut supposer une distribution de Weibull ou une distribution log-normale.

Le modèle AFT paramétrique suppose que la fonction de survie dérivée de deux populations (par exemple P et Q) est liée par un certain facteur d’accélération lambda (λ), qui peut être modélisé comme une fonction des covariables.

Facteur d’accélération/rapport de temps en fonction des covariables.

En fonction des covariables, le modèle AFT peut accélérer ou décélérer les temps de défaillance. Les coefficients du modèle AFT peuvent être interprétés facilement : une augmentation unitaire d’une covariable signifie que le temps de survie moyen/médian change d’un facteur de exp(b_i). [2].

Identifier la distribution la mieux ajustée

Il existe de nombreuses distributions que nous pouvons ajuster. La première étape consiste donc à identifier la distribution qui correspond le mieux aux données. Les distributions les plus courantes sont Weibull, Exponentielle, Log-Normale, Log-Logistique et Gamma généralisée.

Voici un guide étape par étape pour identifier la distribution la mieux adaptée :

  • Importez les distributions de la bibliothèque de lignes de vie
  • Instanciez l’objet de classe et enregistrez-le dans une variable. Par exemple, ici l’objet de classe Weibull a été enregistré dans « wb ».
  • Itération à travers tous les objets du modèle et ajustement avec les données temporelles et événementielles.
  • Imprimer la valeur AIC
  • La distribution avec la valeur AIC la plus basse présente la distribution la mieux ajustée.

Ici, la distribution de Weibull a fourni la valeur AIC la plus faible (2286.4) et peut donc être sélectionnée comme distribution la mieux ajustée pour notre modèle AFT.

from lifelines import WeibullFitter,\
ExponentialFitter,\
LogNormalFitter,\
LogLogisticFitter
# Instantiate each fitter
wb = WeibullFitter()
ex = ExponentialFitter()
log = LogNormalFitter()
loglogis = LogLogisticFitter()
# Fit to data
for model in [wb, ex, log, loglogis]:
model.fit(durations = data["time"], event_observed = data["status"])
# Print AIC
print("The AIC value for", model.__class__.__name__, "is", model.AIC_)
Résultat de la comparaison des modèles

Ajustement du modèle AFT de Weibull

L’étape suivante consiste à ajuster la classe de Weibull Fitter avec les données du cancer du poumon et à imprimer le résumé. L’estimation du modèle fournit les coefficients, exp(coef) également connu sous le nom de facteur d’accélération/rapport de temps, les intervalles de confiance, les statistiques z et les valeurs p.

from lifelines import WeibullAFTFitterweibull_aft = WeibullAFTFitter()
weibull_aft.fit(data, duration_col='time', event_col='status')
weibull_aft.print_summary(3)
Tableau des estimations du modèle AFT

Interprétation des résultats/estimations du modèle AFT

L’interprétation étape par étape du modèle AFT est décrite ci-dessous :

  • Une augmentation unitaire de la covariable indique que le temps de survie moyen/médian changera d’un facteur exp(coefficient).
  • Si le coefficient est positif, alors l’exp(coefficient) sera >1, ce qui ralentira le temps de l’incident/événement. De même, un coefficient négatif réduira le temps de survie moyen/médian.

Exemple:

  • Le sexe, qui contient [0: Male (base) and 1: Female]a un coefficient positif.
  • Cela signifie qu’être un sujet féminin par rapport à un sujet masculin modifie le temps de survie moyen/médian par exp(0,416) = 1,516, soit une augmentation d’environ 52 % du temps de survie moyen/médian.

Temps de survie médian et moyen

Nous pouvons estimer le temps de survie moyen et médian en utilisant temps_de_survie_moyen et temps_de_survie_médian attributs.

print(weibull_aft.median_survival_time_)
print(weibull_aft.mean_survival_time_)

419.097

495.969

Tracer les coefficients

Ensuite, nous pouvons tracer le classement des variables en fonction de leurs coefficients. log(taux d’échec accéléré) en utilisant le .plot( ) méthode.

plt.subplots(figsize=(10, 6))
weibull_aft.plot()
Tracé du classement des variables en fonction du log(taux de défaillance accéléré)

Tracé des effets partiels sur le résultat (régression de Weibull)

Nous pouvons utiliser notre modèle ajusté pour voir comment la survie change lorsque nous modifions les valeurs des covariables. Ici, j’ai utilisé le modèle plot_partial_effects_on_outcome( ) pour voir comment la survie varie chez les brevets de 50, 60, 70 et 80 ans par rapport à leur fonction de base. Cela met clairement en évidence que les jeunes brevets ont des probabilités de survie plus élevées à un moment donné par rapport aux patients âgés.

plt.subplots(figsize=(10, 6))weibull_aft.plot_partial_effects_on_outcome('age', range(50, 80, 10), cmap='coolwarm')
Fonction de survie pour différentes valeurs d’âge

L’analyse de survie est une technique puissante qui permet d’effectuer une analyse du temps écoulé jusqu’à l’événement. J’espère que cet article vous donnera suffisamment de motivation pour l’essayer avec vos données collectées.

Cliquez ici pour le données et code

Références

[1] Loprinzi CL. Laurie JA. Wieand HS. Krook JE. Novotny PJ. Kugler JW. Bartel J. Law M. Bateman M. Klatt NE. et al. Prospective evaluation of prognostic variables from patient-completed questionnaires. Groupe de traitement du cancer du Centre-Nord. Journal of Clinical Oncology. 12(3):601-7, 1994.

[2] Davidson-Pilon, (2019). Lignes de vie : analyse de survie. dans Python. Journal of Open Source Software, 4(40), 1317, https://doi.org/10.21105/joss.01317

J’espère que cet article vous a été utile !


Source de l’article

A découvrir