L’analyse de survie est un domaine important de la modélisation et il existe de nombreux packages R disponibles qui implémentent divers modèles, des modèles paramétriques « classiques » aux arbres boostés. Bien qu’ils couvrent une grande variété de types de modèles, ils présentent également une hétérogénéité considérable dans la syntaxe et les niveaux de documentation. Les
modèles de rangement framework est une collection de packages R pour la modélisation et l’apprentissage automatique utilisant les principes de tidyverse. Il fournit une interface cohérente à une variété de fonctions de modélisation ainsi que des outils de rééchantillonnage, d’évaluation des performances et de réglage des hyperparamètres.

En termes d’analyse de survie, cependant, jusqu’à présent, les modèles de rangement n’ont pas été aussi riches en fonctionnalités que nous le souhaiterions, par exemple, les modèles disponibles ne couvraient que les modèles de survie paramétriques. Avec cet article, nous aimerions faire le point sur les travaux récents visant à étendre les outils d’analyse de survie dans les modèles de rangement et à recueillir des commentaires sur les plans futurs.

Faire de l’analyse de survie un citoyen de première classe dans les modèles de rangement nécessite de toucher plusieurs aspects à travers la collection de packages :

  • Pré-traitement pour s’adapter à la structure des données censurées.
  • Une plus grande sélection de modèles qui peuvent être spécifiés, ajustés et utilisés pour la prédiction.
  • Mesures de performance supplémentaires adaptées aux données de survie.

Le nouveau
censuré paquet avec
panais propose plusieurs nouveaux modèles, moteurs et types de prédiction. Le package censuré n’est pas encore sur CRAN, mais nous recherchons des utilisateurs précoces pour l’essayer et nous faire part de leurs commentaires ! Vous pouvez l’installer via

Un nouveau mode pour le panais


Certains types de modèles peuvent être utilisés à des fins multiples avec le même moteur de calcul, par ex. une
decision_tree() le modèle peut être utilisé pour la classification ou la régression avec le rpart moteur. Cette distinction est faite dans le panais par
spécifier le mode d’un modèle. Nous avons maintenant introduit un nouveau "censored regression" mode dans panais pour les modèles qui peuvent être utilisés pour l’analyse de survie. Le susdit
decision_tree() avec le rpart Le moteur peut également être utilisé pour ajuster un arbre de décision de survie :

Ajustement du modèle


Pour adapter un modèle, panais prend généralement en charge une formule et une interface matricielle, quelle que soit l’interface du moteur. Pour les modèles de régression censurés, nous ne prenons actuellement en charge qu’une interface de formule. La plupart des moteurs supportent déjà ce type d’interface, et une formule permet de préciser le résultat via la norme
survival::Surv() fonction, liant ensemble l’heure et le statut de l’événement.

Une formule permet également de spécifier la stratification pour un modèle à risques proportionnels. Pour le
survival::coxph() fonction, qui alimente le survival moteur pour
proportional_hazards(), cela peut ressembler

Surv(time, event) ~ x + z + strata(s)

Certains autres packages peuvent s’adapter à ce modèle, utilisons le package glmnet. Cependant,
glmnet::glmnet(), n’a pas d’interface de formule et il nous oblige à spécifier les strates en stratifiant la réponse via stratifySurv(y, s). La réponse est généralement un Surv objet, vous pourriez donc vous retrouver avec une formule comme celle-ci :

stratifySurv(Surv(time, event), strata) ~ x + z

Cela fonctionne pour ajuster le modèle mais la syntaxe est plutôt alambiquée sur le côté gauche de la formule. La spécification de la stratification est incompatible avec l’approche adoptée par le package de survie. De plus, sans autre modification, la prédiction échoue car les variables du côté gauche de la formule sont traitées comme des variables de réponse par panais et ne sont pas disponibles au moment de la prédiction.

Nous avons déjà besoin de traduire de l’interface de formule à l’interface de matrice pour ce moteur, et nous aimons que les interfaces soient aussi cohérentes que possible ici dans les modèles de rangement, nous avons donc décidé d’utiliser la spécification de la stratification à travers un
strata() terme à droite de la formule des modèles à risques proportionnels, quel que soit le moteur.

Prédiction


Nous avons introduit plusieurs nouveaux types de prédiction : time to event (time), prédicteur linéaire (linear_pred), probabilité de survie (survival) et le danger (hazard). Certains de ces types dépendent du temps, par exemple, la probabilité de survie est la probabilité de survivre au-delà d’un certain moment. Conformément au principe de conception de tidymodels selon lequel chaque ligne de l’ensemble de données sur lequel vous effectuez la prédiction devrait vous donner exactement une ligne dans l’ensemble de données des prédictions, predict(type = "survival", time) renvoie un tibble imbriqué si time contient plusieurs points dans le temps. Cela peut être utilisé pour approximer les courbes de survie.

f_pred <- predict(f_fit, new_data = bladder_test,
                  type = "survival", time = seq(0, 20, 1))

f_pred <- f_pred %>% 
  mutate(id = factor(1:3)) %>% 
  unnest(cols = .pred)

f_pred %>% 
  ggplot(aes(x = .time, y = .pred_survival, col = id)) +
  geom_step()

Habituellement, le prédicteur linéaire est la combinaison linéaire des prédicteurs, pondérés par les coefficients, souvent notés $x^{T} beta$. C’est ce qui est retourné par le glmnet moteur pour
proportional_hazards() modèles et par le mboost moteur pour
boost_tree() modèles (par exemple, avec le mode "censored regression"). Pour les modèles à risques proportionnels, le prédicteur linéaire décrit relatif risque, c’est-à-dire qu’il fait référence à une paire d’observations : l’observation $x$ et une observation de référence de prédicteurs de valeur 0.

Le package de survie met en œuvre différents choix pour l’observation de référence. Par défaut, il utilise le prédicteur moyen, c’est-à-dire que l’observation $x$ est centrée sur le prédicteur moyen avant que la combinaison linéaire pondérée habituelle ne soit calculée. Ce qui fait une observation de référence utile dépend du contexte et peut être plus complexe que juste 0 ou la moyenne. Dans un cadre médical avec des prédicteurs âge et concentration de médicament, on pourrait être intéressé par l’effet par rapport à l’âge moyen mais une concentration de médicament de 0 (le groupe témoin). Alors que nous réfléchissons à une approche plus générale pour spécifier une telle observation de référence ou un risque de base, nous nous assurons que tous les moteurs censurés utilisent la même approche : une observation de référence de 0.

Illustrons la différence entre les prédictions (par défaut) dérivées des packages de survie et censurés et leur relation avec le prédicteur linéaire. Le package prodlim nous permet de simuler des données de survie avec deux prédicteurs X1 (binaire) et X2 (numérique) qui ont tous deux un effet de $exp(1)$ sur le hasard du temps de l’événement non observé.

Nous pouvons comparer la valeur du prédicteur linéaire en utilisant les vrais coefficients de 1 avec les prédictions du package de survie. Les tracer l’un contre l’autre montre le décalage de la moyenne de X2.

fit_survival <- coxph(Surv(time, status) ~ X1 + X2, data = train_dat)
pred_survival <- predict(fit_survival, newdata = test_pred)

pred <- bind_cols(
  test_pred %>% mutate(linear_pred = X1 * 1 + X2 * 1),
  tibble(pred_survival = pred_survival)
)

mean(train_dat$X2)
#> [1] 0.4683339

La mesure des performances est un élément clé de la modélisation prédictive. Notre philosophie de conception dans tidymodels est que le calcul des métriques de performance doit être indépendant des informations auxiliaires telles que le type de modèle ou l’ensemble d’apprentissage. Essentiellement, tout ce dont vous avez besoin sont les observations et les prédictions. Pour les modèles à risques proportionnels, l’observation et la prédiction décrivent en fait différents aspects de la survie : l’observation est le temps de survie tandis que la prédiction décrit le risque ; les deux ont une relation inverse. Pour nous aider à standardiser les modules d’évaluation, nous modifions le signe du prédicteur linéaire. Cela peut être opposé au signe des prédictions obtenues en utilisant directement le moteur sous-jacent. Vous pouvez désactiver cette option en définissant le increasing argument de
predict() à FALSE.

Types de modèles et de prédictions disponibles en version censurée


Actuellement, censuré contient les modèles, moteurs et types de prédiction suivants avec ✔ indiquant « disponible », indiquant « indisponible » et indiquant « à faire ».

maquette moteur temps survie linear_pred cru quantile risquer
arbre_sac partie ?? ?? ?? ?? ?? ??
boost_tree mboost ?? ?? ?? ?? ?? ??
arbre de décision fête ?? ?? ?? ?? ?? ??
arbre de décision partie ?? ?? ?? ?? ?? ??
risques_proportionnels glmnet ?? ?? ?? ?? ?? ??
risques_proportionnels survie ?? ?? ?? ?? ?? ??
rand_forêt fête ?? ?? ?? ?? ?? ??
rand_forêt aléatoireForêtSRC ?? ?? ?? ?? ?? ??
rand_forêt ranger ?? ?? ?? ?? ?? ??
survie_reg flexsurv ?? ?? ?? ?? ?? ??
survie_reg survie ?? ?? ?? ?? ?? ??

Et après?


Nous voulons que l’analyse de survie soit un citoyen de première classe dans les modèles ordonnés, ce qui signifie avoir accès au prétraitement, au rééchantillonnage, aux modèles, aux métriques et au réglage. Les prochaines étapes sur ce chemin sont :

  • Un rôle de censure des colonnes indicatrices et une étape step_surv() dans les recettes.
  • Une nouvelle métrique ROC pour les modèles de survie à l’aune.
  • Une adaptation des flux de travail et du réglage suivra ensuite.

De plus, nous sommes en train de déterminer comment différents types d’effets de censure et dépendant du temps s’intègrent dans notre API.

Nous aimerions recevoir de vos nouvelles! Certaines des questions que nous avons comprennent : Trouveriez-vous cela utile ? Y a-t-il des modèles/méthodes particuliers que vous aimeriez voir ? Utilisez-vous des effets dépendants du temps ? Utilisez-vous des interactions ? Quels types de censure utilisez-vous ?

Nous apprécierions grandement vos commentaires, idéalement dans les réponses aux
poste correspondant sur la communauté RStudio!


Source de l’article