Mis a jour le 2025-04-14, 12:10

Analyse de survie

On peut utiliser pour cela le package scikit-survival
Estimation de Kaplan-Meier :
  • on part de données avec censoring (right censoring) :
    • statuses : array 1d avec True si l'événement a été observé, False si l'événement n'a pas été observé (c'est à dire avec censoring).
    • eventTimes : array 1d avec les valeurs numériques des temps des événements (dans l'unité choisie)
  • from sksurv.nonparametric import kaplan_meier_estimator	
    times, survivalProb, confInt = kaplan_meier_estimator(statuses, eventTimes, conf_type = 'log-log', conf_level = 0.95)
    plt.step(times, survivalProb, where = "post")
    plt.fill_between(times, confInt[0], confInt[1], alpha = 0.25, step = "post")
        
  • times sont les temps des événements pour tracer la courbe.
  • survivalProb sont les probabilités de survie aux temps correspondants, pour tracer la courbe de survie.
  • confInt sont les intervalles de confiance : array 2d 2 x nombre de temps.
  • alpha : juste pour la transparence, rien à voir avec les stats.
log rank test :
  • on part de données avec censoring :
    • myStatusTimes : une structured array avec pour chaque élément une paire (booléen, numérique) pour les champs censoring et temps, respectivement.
    • construction de la structured array à partir de 2 listes séparées pour le censoring status (booléen) et les temps times : data2 = numpy.array([(status[i], times[i]) for i in range(len(status))], dtype = [('status', '?'), ('time', '<f8')])
  • myGroups est une array 1d de même taille que myStatusTimes qui contient les groupes à comparer (2 groupes ou plus)
    from sksurv.compare import compare_survival
    chisq, pvalue, stats, covariance = compare_survival(myStatusTimes, myGroups, return_stats = True)
        
  • pvalue est la p-value de l'hypothèse nulle : pas de différence entre les groupes.
  • stats est un résumé des statistiques par groupe.
Modèle de Cox Proportional Hazard :
  • on a plusieurs groupes (variables qualitatives) et/ou des variables quantitatives et on suppose que les ratios des risques (hazard) entre conditions et/ou variables sont indépendants du temps.
  • si myStatusTimes est la structured array avec les statuts de censoring et les temps (cf comme avec le log rank test ci-dessus) et df est un dataframe avec autant de lignes que d'éléments dans myStatusTimes et autant de colonnes numériques que de valeurs prédictives :
    from sksurv.linear_model import CoxPHSurvivalAnalysis
    estimator = CoxPHSurvivalAnalysis()
    estimator.fit(df, myStatusTimes)
        
  • estimator.coef_ : les coefficients du modèle.
  • on peut avoir leur nom en même temps en créant une series : mySeries = pandas.Series(estimator.coef_, index = df.columns)
  • estimator.baseline_survival_ : la courbe de survie de base.

Copyright python-simple.com
programmer en python, tutoriel python, graphes en python, Aymeric Duclert