JoVE Logo

S'identifier

Un abonnement à JoVE est nécessaire pour voir ce contenu. Connectez-vous ou commencez votre essai gratuit.

Dans cet article

  • Résumé
  • Résumé
  • Introduction
  • Protocole
  • Résultats
  • Discussion
  • Déclarations de divulgation
  • Remerciements
  • matériels
  • Références
  • Réimpressions et Autorisations

Résumé

Cette étude évalue les systèmes pronostiques des patients atteints d’un carcinome colorectal à cellules en anneau à l’aide de modèles d’apprentissage automatique et d’analyses de risque concurrentes. Il identifie les probabilités logarithmiques de ganglions lymphatiques positifs comme un prédicteur supérieur par rapport à la stadification pN, démontrant une forte performance prédictive et aidant à la prise de décision clinique grâce à des outils de prédiction de survie robustes.

Résumé

L’état des ganglions lymphatiques est un prédicteur pronostique essentiel pour les patients ; cependant, le pronostic du carcinome colorectal à cellules en anneau (CCRS) a suscité peu d’attention. Cette étude examine la capacité prédictive pronostique des cotes logarithmiques de ganglions lymphatiques positifs (LODDS), du rapport des ganglions lymphatiques (LNR) et de la stadification pN chez les patients atteints de SRCC à l’aide de modèles d’apprentissage automatique (Random Forest, XGBoost et Neural Network) ainsi que de modèles de risque concurrents. Les données pertinentes ont été extraites de la base de données SEER (Surveillance, Epidemiology, and End Results). Pour les modèles d’apprentissage automatique, les facteurs pronostiques de survie spécifique au cancer (CSS) ont été identifiés à l’aide d’analyses de régression de Cox univariées et multivariées, suivies de l’application de trois méthodes d’apprentissage automatique - XGBoost, RF et NN - pour déterminer le système optimal de stadification des ganglions lymphatiques. Dans le modèle de risque concurrent, des analyses de risque concurrentes univariées et multivariées ont été utilisées pour identifier les facteurs pronostiques, et un nomogramme a été construit pour prédire le pronostic des patients atteints de SRCC. L’aire sous la courbe caractéristique de fonctionnement du récepteur (AUC-ROC) et les courbes d’étalonnage ont été utilisées pour évaluer les performances du modèle. Au total, 2 409 patients atteints de CCRS ont été inclus dans cette étude. Pour valider l’efficacité du modèle, une cohorte supplémentaire de 15 122 patients atteints de cancer colorectal, à l’exclusion des cas de SRCC, a été incluse pour une validation externe. Les modèles d’apprentissage automatique et le nomogramme de risque concurrent ont montré de solides performances dans la prédiction des résultats de survie. Par rapport à la stadification pN, les systèmes de stadification LODDS ont démontré une capacité de pronostic supérieure. Après évaluation, les modèles d’apprentissage automatique et les modèles de risque concurrents ont atteint d’excellentes performances prédictives caractérisées par une bonne discrimination, un bon étalonnage et une bonne interprétabilité. Nos résultats peuvent aider à éclairer la prise de décision clinique pour les patients.

Introduction

Le cancer colorectal (CCR) se classe au troisième rang des tumeurs malignes les plus répandues dans le monde 1,2,3. Le carcinome à cellules en anneau (SRCC), un sous-type rare de CCR, représente environ 1 % des cas et se caractérise par une mucine intracellulaire abondante déplaçant le noyau cellulaire 1,2,4. Le SRCC est souvent associé à des patients plus jeunes, a une prévalence plus élevée chez les femmes et a des stades tumoraux avancés au moment du diagnostic. Comparé à l’adénocarcinome colorectal, le SRCC présente une différenciation plus faible, un risque plus élevé de métastases à distance et un taux de survie à 5 ans de seulement 12 % à 20 %5,6. L’élaboration d’un modèle pronostique précis et efficace pour le SRCC est cruciale pour optimiser les stratégies de traitement et améliorer les résultats cliniques.

Cette étude vise à construire un modèle pronostique robuste pour les patients atteints de SRCC en utilisant des approches statistiques avancées, y compris l’apprentissage automatique (ML) et des modèles de risque concurrents. Ces méthodologies peuvent s’adapter à des relations complexes dans les données cliniques, en offrant des évaluations des risques individualisées et en surpassant les méthodes traditionnelles en termes de précision prédictive. Les modèles d’apprentissage automatique, tels que Random Forest, XGBoost et Neural Networks, excellent dans le traitement de données de grande dimension et l’identification de modèles complexes. Des études ont montré que les modèles d’IA prédisent efficacement les résultats de survie dans le cancer colorectal, mettant l’accent sur le potentiel de l’apprentissage automatique dans les applications cliniques 7,8. En complément de l’AA, les modèles de risque concurrents abordent plusieurs types d’événements, tels que la mortalité spécifique au cancer par rapport à d’autres causes de décès, afin d’affiner l’analyse de survie. Contrairement aux méthodes traditionnelles comme l’estimateur de Kaplan-Meier, les modèles de risque concurrents estiment avec précision la probabilité marginale des événements en présence de risques concurrents, fournissant des évaluations de survie plus précises8. L’intégration du ML et de l’analyse des risques concurrents améliore les performances prédictives, offrant un cadre puissant pour les outils de pronostic personnalisés dans SRCC 9,10,11.

Les métastases ganglionnaires influencent significativement le pronostic et la récidive chez les patients atteints de CCR. Bien que l’évaluation du stade N dans la classification TNM soit critique, un examen inadéquat des ganglions lymphatiques - signalé dans 48 % à 63 % des cas - peut conduire à une sous-estimation de la maladie. Pour résoudre ce problème, d’autres approches telles que le rapport des ganglions lymphatiques (LNR) et les log-odds des ganglions lymphatiques positifs (LODDS) ont été introduites. La LNR, c’est-à-dire le rapport entre les ganglions lymphatiques positifs (PLN) et les ganglions lymphatiques totaux (TLN), est moins affectée par le nombre de TLN et sert de facteur pronostique dans le CCR. LODDS, le rapport logarithmique des PLN aux ganglions lymphatiques négatifs (NLN), a montré une capacité prédictive supérieure dans le SRCC gastrique et le cancer colorectal10,11. L’apprentissage automatique est de plus en plus appliqué en oncologie, avec des modèles améliorant la stratification des risques et les prédictions pronostiques pour divers cancers, notamment les cancers du sein, de la prostate et du poumon 12,13,14. Cependant, son application dans le CCRS colorectal reste limitée.

Cette étude vise à combler cette lacune en intégrant LODDS au ML et aux modèles de risque concurrents afin de créer un outil de pronostic complet. En évaluant la valeur pronostique de LODDS et en tirant parti de techniques prédictives avancées, cette recherche vise à améliorer la prise de décision clinique et à améliorer les résultats pour les patients atteints de CCSR.

Access restricted. Please log in or start a trial to view this content.

Protocole

Cette étude ne fait pas référence à l’approbation éthique et au consentement à participer. Les données utilisées dans cette étude ont été obtenues à partir de bases de données. Nous avons inclus des patients diagnostiqués avec un carcinome colorectal à cellules en anneau de 2004 à 2015, ainsi que d’autres types de cancer colorectal. Les critères d’exclusion comprenaient les patients dont la durée de survie était inférieure à un mois, ceux dont les informations clinicopathologiques étaient incomplètes et les cas dont la cause du décès n’était pas claire ou précisée.

1. Acquisition de données

  1. Télécharger SEER. Obtenir le logiciel de statistiques 8.4.3 à partir du site Web de la base de données SEER (http://seer.cancer.gov/about/overview.html). Après vous être connecté au logiciel, cliquez sur Session de liste de cas > Données et sélectionnez la base de données Incidence SEER Research Plus, 17 registres, Nov 2021 Sub (2000-2019).
  2. Cliquez sur Sélection > Modifier et choisissez {Race, Sexe, Année Dx. Année de diagnostic} = '2004', '2005', '2006', '2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015' ET {Site et morphologie. Recodage du site CIM-O-3/OMS 2008} = « 8490/3 ».
  3. Cliquez ensuite sur Tableau, et dans l’interface des variables disponibles, sélectionnez Recodage de l’âge avec âges uniques et 100+, Sexe, Mariage, Recodage du site ICD-O-3/OMS 2008, Taille de la tumeur CS, nodes_examined régional (1988+), nodes_positive régional (1988+), Groupe de stade AJCC dérivé, 6e édition (2004-2015), AJCC T dérivé, 6e édition (2004-2015), AJCC N, 6e édition (2004-2015), AJCC M dérivé, 6e éd. (2004-2015), CEA, recodage des radiations, recodage de la chimiothérapie (oui, non/unk), classification des décès spécifiques à la cause SEER, recodage de l’état vital (seuil de l’étude utilisé), mois de survie, année du diagnostic.
  4. Enfin, cliquez sur Sortie, nommez les données, puis cliquez sur Exécuter pour afficher et enregistrer les données. Le processus d’inclusion détaillé est illustré à la figure 1.
  5. Téléchargez les données des patients atteints de cancer colorectal, à l’exclusion des cas de SRCC, pour une validation externe ultérieure. Cliquez sur Sélection > Modifier et choisissez {Race, Sexe, Année Dx. Année du diagnostic} = '2004', '2005', '2006', '2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015' ET {Site principal - étiqueté} = 'C18-C20'. Répétez les étapes 1.3 et 1.4 pour obtenir des informations pathologiques cliniques et exclure les échantillons avec {Site et morphologie. Recodage du site ICD-O-3/OMS 2008} = « 8490/3 » à partir du fichier téléchargé.
  6. À des fins de comparaison, traitez plusieurs variables. Classez l’état des ganglions lymphatiques à l’aide du rapport des ganglions lymphatiques (LNR) et du logarithme des probabilités d’être positifs pour les ganglions lymphatiques (LODDS).
    1. Définir la LNR comme le rapport entre les ganglions lymphatiques positifs (PLN) et les ganglions lymphatiques totaux (TLN). Calculez la valeur LODDS à l’aide de la formule :
      loge(nombre de NLP + 0,5) / (nombre de ganglions lymphatiques négatifs (NLN) + 0,5)
      où 0,5 a été ajouté pour éviter un résultat infini. Les valeurs seuils pour le LNR, le LODDS et la taille de la tumeur ont été déterminées à l’aide du logiciel X-tile (version 3.6.1) sur la base de la méthode de la valeur P minimale.
  7. Ouvrez le logiciel X-tile, cliquez sur Fichier > Ouvrir, puis sélectionnez le fichier de données pour l’importer dans le logiciel. Une fois les données chargées, mappez les variables : Censor correspond au statut de survie, Temps de survie correspond au temps de survie et marqueur1 est la variable à analyser, en veillant à ce que les données correspondent correctement.
  8. Ensuite, cliquez sur Do > Kaplan-Meier > Marker1 pour effectuer l’analyse de survie de Kaplan-Meier et générer la courbe de survie. Sur la base de la séparation des courbes de survie de Kaplan-Meier, de la signification statistique (par exemple, la valeur p) et de la pertinence clinique, déterminez la valeur seuil optimale et, enfin, enregistrez ou exportez les résultats de l’analyse.
    1. Divisez le LNR en trois groupes : LNR 1 (≤0,16), LNR 2 (0,16 - 0,78) et LNR 3 (≥ 0,78). Catégorisez les patients en trois groupes en fonction de LODDS : LODDS 1 (≤ -1,44), LODDS 2 (-1,44 - 0,86) et LODDS 3 (≥ 0,86).
    2. Classez la taille de la tumeur en trois catégories : ≤ 3,5 cm, 3,5 à 5,5 cm et ≥ 5,5 cm. Convertissez l’âge d’une variable continue en une variable catégorielle. Classez l’âge des patients au moment du diagnostic initial en deux catégories : ≥60 ans et <60 ans. Classez l’emplacement de la tumeur en fonction de la distribution des tumeurs du carcinome à cellules en anneau (SRCC) comme côlon droit, côlon gauche et rectum. Le côlon droit comprend le cæcum, le côlon ascendant, la flexion hépatique et le côlon transverse, tandis que le côlon gauche comprend la flexion splénique, le côlon descendant, le côlon sigmoïde et la jonction rectosigmoïde.
  9. Pour cette étude, attribuez au hasard un total de 2409 données de patients éligibles avec SRCC à une cohorte d’entraînement (N = 1686) et à une cohorte de validation (N = 723) dans un rapport de 7:3. Utilisez le code suivant pour le fractionnement aléatoire et les data.csv sources à partir de la base de données SEER. Les fichiers générés après le fractionnement aléatoire seront utilisés pour une analyse plus approfondie.
    Bibliothèque (CARET)
    Données <- read.csv (« data.csv »)
    set.seed(123)
    train_indices <- createDataPartition(data$variable, p = 0.7, list = FALSE)
    train_data <- Données[train_indices, ]
    test_data <- données[-train_indices, ]
    write.csv(train_data, « traindata.csv », row.names = FAUX)
    write.csv(test_data, « testdata.csv », row.names = FAUX)

2. Développement et vérification de modèles ML

  1. Téléchargez les logiciels RStudio (2024.04.2+764) et R (4.4.1). Ouvrez RStudio pour exécuter le logiciel R. Cliquez sur Nouveau fichier et sélectionnez Script R pour créer une nouvelle interface de programmation R. Entrez le code approprié dans l’éditeur de code et cliquez sur Exécuter pour exécuter le code.
  2. Utilisez le code suivant pour filtrer les variables incluses dans les modèles ML par l’analyse de régression de Cox. De plus, explorez l’impact du LODDS, du LNR et de la stadification pN sur la survie spécifique au cancer (CSS) chez les patients atteints de SRCC. La traindata.csv est constituée de données obtenues à partir de la base de données SEER.
    Bibliothèque (« Survie »)
    Bibliothèque (« Survminer »)
    Bibliothèque (« RMS »)
    Bibliothèque (« dplyr »)
    Données <- read.csv (« traindata.csv »)
    data$time=as.numeric(data$time)
    data$status=as.numeric(data$status)
    variables <- c(« Sexe », « Âge », « Race », « Mariage », « Stade », « T », « N », « M »,"Tumor_size », « LNR », « LODDS », « CEA »,"Radiothérapie », « Chimiothérapie », « Site »)
    données <- données %> %
    mutate(across(all_of(variables), as.factor))
    cox=coxph(Surv(temps, état) ~ données$T, données = données)
    cox$coefficients
    pval=anova(cox)$Pr[2]
    clean_data=données[,c(1:12, 14:18)]
    get_coxVariable=Fonction(your_data,Index){cox_list=C() k=1
    for (i dans 1 :index) {mod=coxph(Surv(temps, état) ~ your_data[,i],data=your_data) pval=anova(mod)$Pr[2] print(pval) print(colnames(your_data)[i]) if (pval<0.05) {cox_list[k]=colnames(your_data)[i] k=k+1}}return(cox_list)}
    variable_select=get_coxVariable(clean_data,15)
    for(i en 1:15){print(variable_select[i])}
    for (var dans variable_select) {formula <- as.formula(paste(« Surv(temps, état) ~ », var))cox_model <- coxph(formule, données = données) print(summary(cox_model))
    ggforest(cox)
    variables <- c(« Sexe », « Âge », « Race », « Mariage », « Stade », « T », « N », « M », « Tumor_size », « LNR », « LODDS », « Chimiothérapie »)
    données <- données %> %
    mutate(across(all_of(variables), as.factor))
    cox=coxph(Surv(temps, statut) ~ Sexe+Âge+Race+Marital+T+N+M+Tumor_size+LNR+
    LODDS+Chimiothérapie,données = données)
    ggforest(cox,données = données)
    ggplot_forest <- ggforest(cox, données = données)
  3. Utilisez le code suivant pour comparer les capacités de prédiction pronostique de trois systèmes LN (LODDS, LNR et pN staging) dans les cohortes d’entraînement, de validation et de validation externe.
    Bibliothèque (RMS)
    Bibliothèque(Survie)
    Bibliothèque(Survminer)
    bibliothèque(risqueRégression)
    Bibliothèque(gt)
    train_data <- read.csv(« train_data123.csv »)
    validation_data <- read.csv(« test_data123.csv »)
    dd <- datadist(train_data)
    options(datadist = « jj »)
    model_LNR <- cph(Surv(temps, état) ~ LNR, données = train_data, x = VRAI, y = VRAI)
    model_LODDS <- cph(Surv(temps, état) ~ LODDS, données = train_data, x = VRAI, y = VRAI)
    model_pN <- cph(Surv(temps, état) ~ N, données = train_data, x = VRAI, y = VRAI)
    calculate_performance <- function(model, data) {pred <- predict(model, newdata = data) c_index_result <- concordance(Surv(data$time, data$status) ~ pred) c_index <- c_index_result$concordance aic <- AIC(model) bic <- BIC(model) return(c(C_index = round(c_index, 3), AIC = round(aic, 2), BIC = round(bic, 2)))}
    calculate_performance <- function(model, data) {pred <- predict(model, newdata = data, type = « lp ») concordance_result <- concordancefit(Surv(data$time, data$status), x = pred) c_index <- concordance_result$concordance ci_lower <- c_index - 1.96 * sqrt(concordance_result$var) ci_upper <- c_index + 1.96 * sqrt(concordance_result$var) aic <- AIC(model) bic <- BIC(model) return(c(C_Index = round(c_index, 3), CI_Lower = rond(ci_lower, 3), CI_Upper = rond(ci_upper, 3), AIC = rond(aic, 2), BIC = rond(bic, 2)))}
    train_LNR <- calculate_performance(model_LNR, train_data)
    train_LODDS <- calculate_performance(model_LODDS, train_data)
    train_pN <- calculate_performance(model_pN, train_data)
    model_LNR_val <- cph(Surv(temps, état) ~ LNR, données = validation_data, x = VRAI, y = VRAI)
    model_LODDS_val <- cph(Surv(temps, état) ~ LODDS, données = validation_data, x = VRAI, y = VRAI)
    model_pN_val <- cph(Surv(temps, état) ~ N, données = validation_data, x = VRAI, y = VRAI)
    val_LNR <- calculate_performance(model_LNR_val, validation_data)
    val_LODDS <- calculate_performance(model_LODDS_val, validation_data)
    val_pN <- calculate_performance(model_pN_val, validation_data)
    results <- data.frame(Variable = c(« LNR », « LODDS », « pN »), Training_C_Index = c(paste(train_LNR["C_Index"], « (« , train_LNR["CI_Lower"], « , train_LNR["CI_Upper"], « ) », sep = «  »), paste(train_LODDS["C_Index"], « (« , train_LODDS["CI_Lower"], « , train_LODDS["CI_Upper"], « ) », sep = «  »), paste(train_pN["C_Index"], « (« , train_pN["CI_Lower"], « , « , train_pN["CI_Upper"], « ) », sep = «  »)), Training_AIC = c(train_LNR["AIC"], train_LODDS["AIC"], train_pN["AIC"]), Training_BIC = c(train_LNR["BIC"], train_LODDS["BIC"], train_pN["BIC"]), Validation_C_Index = c(paste(val_LNR["C_Index"], « (« , val_LNR["CI_Lower"], « , « , val_LNR["CI_Upper"], « ) », sep = «  »), paste(val_LODDS["C_Index"], « (« , val_LODDS["CI_Lower"], « , « , val_LODDS["CI_Upper"], « ) », sep = «  »), paste(val_pN["C_Index"], « (« , val_pN["CI_Lower"], « , « , val_pN["CI_Upper"], « ) », sep = «  »)), Validation_AIC = c(val_LNR["AIC"], val_LODDS["AIC"], val_pN["AIC"]), Validation_BIC = c(val_LNR["BIC"], val_LODDS["BIC"], val_pN["BIC"]))
    results_table <- gt(résultats) %> %
    tab_header(titre = « Performance de prédiction des trois systèmes de stadification ganglionnaire ») %> %
    cols_label(Variable = « Variable »,Training_C_Index = « Indice C (IC à 95 %) (Formation) », Training_AIC = « AIC (Formation) », Training_BIC = « BIC (Formation) », Validation_C_Index = « Indice C (IC à 95 %) (Validation) », Validation_AIC = « AIC (Validation) », Validation_BIC = « BIC (Validation) »)
    write.csv(résultats, « prediction_performance.csv », row.names = FAUX)
  4. Utilisez le code suivant pour créer un modèle XGBoost et générer des graphiques à barres de l’importance relative des variables, afin de comparer l’importance des trois systèmes LN. De même, générez des courbes ROC et des courbes d’étalonnage. Les données sont obtenues à partir de la base de données SEER.
    Bibliothèque(xgboost)
    Bibliothèque (CARET)
    bibliothèque(pROC)
    train_data <- read.csv(« train_data.csv »)
    test_data <- read.csv(« test_data.csv »)
    train_matrix <- xgb. DMatrix(data = as.matrix(train_data[, c('Âge', 'T', 'N', 'M', 'LODDS', 'Chimiothérapie')]), label = train_data$status)
    test_matrix <- xgb. DMatrix(data = as.matrix(test_data[, c('Age', 'T', 'N', 'M', 'LODDS', 'Chimiothérapie')]), label = test_data$status)
    params <- list(booster = « gbtree », objective = « binary :logistic », eval_metric = « AUC », eta = 0.1, max_depth = 6, sous-échantillon = 0.8, colsample_bytree = 0.8)
    xgb_model <- xgb.train(paramètres = paramètres, données = train_matrix, nrounds = 100, watchlist= list(train = train_matrix), verbeux = 1)
    pred_probs <- predict(xgb_model, newdata = test_matrix)
    pred_labels <- ifelse(pred_probs > 0.5, 1, 0)
    conf_matrix <- confusionMatrix(as.factor(pred_labels), as.factor(test_data$status))
    roc_curve <- roc(test_data$status, pred_probs)
    auc_value <- AUC(roc_curve)
    ci_auc <- ci.auc(roc_curve)
    sensibilité <- conf_matrix$byClass["Sensibilité"]
    spécificité <- conf_matrix$byClass["Spécificité"]
    précision <- conf_matrix$global["Accuracy"]
    ppv <- conf_matrix$byClass["Valeur du Pos Pred"]
    npv <- conf_matrix$byClass["Valeur de Pred Nég»]
    result_table <- data.frame(Modèle = « XGBoost », AUC = sprintf(« %.3f ( %.3f- %.3f) », auc_value, ci_auc[1], ci_auc[3]), Sensibilité = sprintf(« %.3f », sensibilité), Spécificité = sprintf(« %.3f », spécificité), Précision = sprintf(« %.3f », précision), PPV = sprintf(« %.3f », ppv), NPV = sprintf(« %.3f », npv))
    write.csv(result_table, « xgboost_model_performance.csv », row.names = FAUX)
    roc_df <- data.frame(FPR = 1 - roc_curve$spécificités, TPR = roc_curve$sensibilités)
    roc_plot <- ggplot(roc_df, aes(x = FPR, y = TPR)) +geom_line(color = « steelblue », size = 1.2) + geom_abline(intercept = 0, slope = 1, linetype = « dashed », color = « gray ») + annotate(« text », x = 0.9, y = 0.2, label = paste(« AUC = », round(auc_value, 3)), size = 5, color = « black ») + labs(title = « Courbe ROC pour le modèle XGBoost », x = « Taux de faux positifs », y = « Taux de vrais positifs ») + theme_minimal() + theme(panel.border = element_rect(color = « noir », fill = NA, taille = 1))
    calibration_data <- data.frame(Statut = as.factor(test_data$status), pred_probs = pred_probs)
    calib_model <- calibration(Statut ~ pred_probs, données = calibration_data, classe = « 1 », coupes = 5)
    ggplot(calib_model$data, aes(x = point médian, y = Pourcentage)) + geom_line(couleur = « bleu acier », taille = 1) + geom_point(couleur = « rouge », taille = 2) + geom_abline(ordonnée à l’origine = 0, pente = 1, linetype = « pointillé », couleur = « noir ») +labs(title = « Courbe d’étalonnage pour le modèle XGBoost », x = « Probabilité prédite », y = « Proportion observée ») + theme_minimal() + theme(panel.border = element_rect(color = « black », fill = NA, size = 0.5))
  5. Utilisez le code suivant pour construire un modèle RF et générer des graphiques à barres de l’importance relative des variables, comparant ainsi l’importance des trois systèmes LN. De même, générez des courbes ROC et des courbes d’étalonnage. Les données sont obtenues à partir de la base de données SEER.library(randomForest)
    Bibliothèque(dplyr)
    Bibliothèque(ggplot2)
    bibliothèque(pROC)
    Bibliothèque (CARET)
    Bibliothèque (RMS)
    rame <- read.csv(« train_data.csv »)
    testé <- read.csv (« test_data.csv »)
    trainset$status=facteur(trainset$status)
    variables1 <- c(« Âge », « T », « N », « M », « LODDS », « Chimiothérapie »)
    rame <- rame %> %
    mutate(across(all_of(variables1), as.numeric))
    testsed$status=facteur(tested$status)
    Testé <- Testé %> %
    mutate(across(all_of(variables1), as.numeric))
    RF=randomForest(trainset$status ~ Age + T + N + M + LODDS + Chimiothérapie, data=trainset,ntree=100,importance=TRUE,proximity=TRUE)
    imp=importance(RF)
    varImpPlot(RF)
    impvar=rownames(imp)[order(imp[,4],décroissant = TRUE)]
    importance_df <- as.data.frame(imp)
    importance_df$Variables <- rownames(importance_df)
    importance_plot <- ggplot(importance_df, aes(x = reorder(Variables, MeanDecreaseAccuracy), y = MeanDecreaseAccuracy)) +geom_bar(stat = « identité », fill = « steelblue ») +coord_flip() + labs(title = « Importance des variables », x = « Variables », y = « Précision de diminution moyenne ») + theme_minimal()
    pred_probs <- predict(RF, testset, type = « prob »)[,2]
    roc_obj <- roc(testset$status, pred_probs)
    auc_value <- AUC(roc_obj)
    roc_plot <- ggplot() +geom_line(aes(x = 1 - roc_obj$spécificités, y = roc_obj$sensibilités), color = « bleu acier », taille = 1.2) +geom_abline(intercept = 0, slope = 1, linetype = « pointillé », couleur = « gris ») + annotate(« text », x = 0.8, y = 0.2, label = paste(« AUC = », round(auc_value, 3)), color = « black », size = 5, hjust = 0) + labs(title = « Courbe ROC pour modèle de forêt aléatoire », x = « Taux de faux positifs », y = « Taux de vrais positifs ») +theme_minimal() + theme(panel.border = element_rect(color = « noir », remplissage = NA, taille = 1))
    calibration_data <- data.frame(pred_probs = pred_probs, status = testsed$status)
    calib_model <- étalonnage (état ~ pred_probs, données = calibration_data, classe = « 1 », coupes = 5)
    calib_df <- as.data.frame(calib_model[["data"]])
    calib_df$moyen <- calib_df$point médian
    calib_df$Percent <- calib_df$Percent
    calibration_plot <- ggplot(calib_df, aes(x = moyen, y = Pourcentage)) + geom_line(couleur = « bleu acier », taille = 1,2) + geom_point(couleur = « bleu acier », taille = 3) + geom_abline(ordonnée à l’origine = 0, pente = 1, type de ligne = « pointillé », couleur = « noir », taille = 0,8) + labs(titre = « Courbe d’étalonnage pour forêt aléatoire », x = « Probabilité prédite », y = « Probabilité réelle ») + theme_minimal() + theme(panel.border = element_rect(couleur = « noir », fill = NA, taille = 1), plot.title = element_text(hjust = -0.05, vjust = -1.5, face = « bold », size = 12) )
    rf_probs <- predict(RF, newdata=tested, type="prob »)[, 2]
    rf_auc <- roc(tested$status, rf_probs)
    auc_value <- AUC(rf_auc)
    ci_auc <- ci.auc(rf_auc)
    rf_predictions <- predict(RF, newdata=tested)
    conf_matrix <- confusionMatrix(rf_predictions, tested$status)
    sensibilité <- conf_matrix$byClass["Sensibilité"]
    spécificité <- conf_matrix$byClass["Spécificité"]
    précision <- conf_matrix$global["Accuracy"]
    ppv <- conf_matrix$byClass["Valeur du Pos Pred"]
    npv <- conf_matrix$byClass["Valeur de Pred Nég»]
    result_table <- data.frame(Modèle = « RF », AUC = sprintf(« %.3f ( %.3f- %.3f) », auc_value, ci_auc[1], ci_auc[3]), Sensibilité = sprintf(« %.3f », sensibilité), Spécificité = sprintf(« %.3f », spécificité), Précision = sprintf(« %.3f », précision), PPV = sprintf(« %.3f », ppv), NPV = sprintf(« %.3f », npv))
    write.csv(result_table, « RF_model_performance.csv », row.names = FAUX)
  6. Utilisez le code suivant pour créer un modèle NN et générer des graphiques à barres de l’importance relative des variables, comparant ainsi l’importance des trois systèmes LN. De même, générez des courbes ROC et des courbes d’étalonnage. Les données sont obtenues à partir de la base de données SEER.library(nnet)
    Bibliothèque (CARET)
    bibliothèque(pROC)
    Bibliothèque(ggplot2)
    train_data <- read.csv(« train_data.csv »)
    test_data <- read.csv(« test_data.csv »)
    train_data$status <- as.factor(train_data$status)
    test_data$status <- as.factor(test_data$status)
    caractéristiques <- c(« Âge », « T », « N », « M », « LODDS », « Chimiothérapie »)
    x_train <- train_data[, fonctionnalités]
    y_train <- train_data$status
    x_test <- test_data[, fonctionnalités]
    y_test <- test_data$status
    nn_model <- nnet(statut ~ Âge + T + N + M + LODDS + Chimiothérapie, données = train_data, taille = 5, décomposition = 0,01, maxit = 200)
    pred_probs <- predict(nn_model, newdata = x_test, type = « brut »)
    pred_labels <- ifelse(pred_probs > 0.5, 1, 0)
    roc_curve <- roc(as.numeric(y_test), pred_probs)
    auc_value <- AUC(roc_curve)
    auc_ci <- ci.auc(roc_curve)
    auc_text <- paste0(round(auc_value, 3), " (« , round(auc_ci[1], 3), « -« , round(auc_ci[3], 3), « ) »)
    conf_matrix <- confusionMatrix(as.factor(pred_labels), y_test)
    précision <- conf_matrix$global["Accuracy"]
    sensibilité <- conf_matrix$byClass["Sensibilité"]
    spécificité <- conf_matrix$byClass["Spécificité"]
    ppv <- conf_matrix$byClass["Valeur du Pos Pred"]
    npv <- conf_matrix$byClass["Valeur de Pred Nég»]
    performance_table <- data.frame(Métrique = c(« AUC (IC à 95 %) », « Précision », « Sensibilité », « Spécificité », « PPV », « NPV »),Valeur = c(auc_text, round(accuracy, 3), round(sensibilité, 3), round(spécificité, 3), round(ppv, 3), round(npv, 3)))
    write.csv(performance_table, « NN_performance_table.csv », row.names = FAUX)
    roc_curve <- Roc(y_test, pred_probs)
    auc_value <- AUC(roc_curve)
    roc_plot <- ggplot() + geom_line(aes(x = 1 - roc_curve$spécificités, y = roc_curve$sensibilités), color = « bleu acier », taille = 1.2) +geom_abline(intercept = 0, pente = 1, linetype = « pointillé », couleur = « gris ») + annotate(« text », x = 0.8, y = 0.2, label = paste(« AUC = », round(auc_value, 3)), color = « black », size = 5, hjust = 0) + labs(title = « Courbe ROC pour le modèle de réseau neuronal », x = « Taux de faux positifs », y = « Taux de vrais positifs ») + theme_minimal() + theme(panel.border = element_rect(color = « noir », remplissage = NA, taille = 1))
    calibration_data <- data.frame(pred_probs = pred_probs, status = as.numeric(y_test) - 1)
    calibration_data$pred_probs <- as.numeric(calibration_data$pred_probs)
    calibration_data$calibration_bin <- cut(calibration_data$pred_probs, breaks = seq(0, 1, by = 0.2), include.lowest = TRUE)
    calibration_summary <- agrégé(statut ~ calibration_bin, données = calibration_data, FUN = moyenne)
    calibration_summary$pred_mean <- aggregate(pred_probs ~ calibration_bin, data = calibration_data, FUN = moyenne)$pred_probs
    calibration_plot <- ggplot(calibration_summary, aes(x = pred_mean, y = status)) + geom_line(color = « steelblue », size = 1.2) + geom_point(color = « red », size = 3) + geom_abline(intercept = 0, slope = 1, linetype = « pointillé », color = « black », size = 0.8) + labs(title = « Courbe d’étalonnage pour le réseau neuronal », x = « Probabilité prédite », y = « Probabilité réelle ») + theme_minimal() + theme(panel.border = element_rect(color = « noir », fill = NA, taille = 1))
    nn_var_importance <- varImp(nn_model)
    importance_df <- data.frame(Caractéristique = noms de lignes(nn_var_importance), Importance = nn_var_importance$Overall )
    importance_plot <- ggplot(importance_df, aes(x = reorder(Feature, Importance), y = Importance)) + geom_bar(stat = « identity », fill = « steelblue ») + coord_flip() + labs(title = « Importance variable pour le réseau neuronal », x = « Features », y = « Importance ») + theme_minimal()

3. Élaboration et vérification de modèles de risque concurrents

  1. Utilisez le code suivant pour effectuer une analyse univariée et tracer la courbe de la fonction d’incidence cumulative (CIF). La data.csv est constituée de données obtenues à partir de la base de données SEER. La méthode d’enregistrement des images suivantes sera la même que dans cette étape. Remplacez Site dans le code un par un par d’autres facteurs pour effectuer une analyse univariée de tous les facteurs.
    Bibliothèque(tidycmprsk)
    Bibliothèque(gtsummary)
    Bibliothèque(ggplot2)
    Bibliothèque(ggsurvfit)
    Bibliothèque(ggprism)
    AA <- read.csv (« data.csv »)
    cif2 <- tidycmprsk ::cuminc(Surv(time, Status1) ~Site, data = aa)
    tidy(cif2,fois = c(12,24,36,48,60))
    tbl_cuminc(cif2, times =c(12,24,36,48,60), outcomes = c(« CSS », « OSS »),estimate_fun = NULL, label_header = « **{time/12}-year cuminc** ») %> %
    add_p() %> %
    add_n(emplacement = « niveau »)
    cuminc_plot <- ggcuminc(cif2, résultat = c(« CSS », « OSS »), taille = 1.5) + labs(x = « temps ») +add_quantile(y_value = 0.20, taille = 1) + scale_x_continuous(pauses = seq(0, 84, par = 12), limites = c(0, 84)) +scale_y_continuous(étiquette = échelles ::p ercent, pauses = seq(0, 1, par = 0.2), limites = c(0, 1)) + theme_prism() + theme(legend.position = c(0.2, 0.8), panel.grid = element_blank(),panel.grid.major.y = element_line(couleur = « grey80 »)) + theme(legend.spacing.x = unit(0.1, « cm »), legend.spacing.y = unit(0.01, « cm »)) + theme(axis.ticks.length.x = unit(-0.2, « cm »), axis.ticks.x = element_line(color = « black », size = 1, lineend = 1)) + theme(axis.ticks.length.y = unit(-0.2, « cm »), axis.ticks.y = element_line(color = « black », size = 1, lineend = 1))
  2. Utilisez le code suivant pour effectuer une analyse et une visualisation multivariées. La data1.csv provient des résultats du code précédent. Après avoir exécuté le code, cliquez sur Exporter, puis sur Enregistrer au format PDF, et enfin sur Enregistrer pour enregistrer l’image.
    Bibliothèque(tidycmprsk)
    Bibliothèque(gtsummary)
    AA <-read.csv('data1.csv')
    for (i in names(aa)[c(1:16, 19)]){aa[,i] <- as.factor(aa[,i])}
    mul1Tableau 2 <- mul1 %> %
    gtsummary ::tbl_regression(exponentiate = TRUE) %> %
    add_n(emplacement = « niveau ») ; Tableau 2
    table_df <- as_tibble(tableau2)
    Onglet <- Table2$table_body
    tab1 <- tab[,c(12,19,20,22:29)]
  3. Utilisez le code suivant pour tracer le nomogramme, la courbe ROC et la courbe d’étalonnage. Après avoir entraîné le modèle à l’aide des données de la cohorte d’entraînement, utilisez les données de validation et des cohortes de validation externe pour valider model.library (QHScrnomo). Les données de la cohorte externe sont constituées d’échantillons de cancer colorectal autres que le carcinome à cellules annulaires, qui ont été sélectionnés à l’étape 1.4.
    Bibliothèque (RMS)
    bibliothèque(timeROC)
    Bibliothèque(Survie)
    AA <-read.csv('data3.csv')
    for (i in names(aa)[c(1:16, 19)]){aa[,i] <- as.factor(aa[,i])}
    DD <- datadist(aa)
    options(datadist = « jj »)
    mul <- cph(Surv(temps, Statut1 == 1) ~ T + N + M + LODDS + Site, data = aa, x = TRUE, y = TRUE, surv = TRUE)
    m3 <- crr.fit(mul, failcode = 1, cencode = 0)
    nomo <-Newlabels(fit = m3, labels =c(T="T », N= « N », M = « M », LODDS = « LODDS », Site = « Site »))
    nomoc(« N0 »,"N1 »,"N2 »),M=c(« M0 »,"M1 »),LODDS=c
    (« LODDS1 »,"LODDS2 »,"LODDS3 »),Site=
    c(« RSC »,"LSC »,"Rectum »)))
    nomogram.crr(fit =nomo , lp = F, xfrac = 0.3, fun.at =seq(from=0, to=1, by= 0.1) , failtime =c(12,36,60), funlabel = c(« Incidence cumulative CSS 1 an »,"Incidence cumulative CSS 3 ans »,"Incidence cumulative CSS 5 ans »))
    time_points <- c(12, 36, 60)
    pred_risks_list <- lapply(time_points, function(time_point) {predict(m3, newdata = aa, type = « risk », time = time_point)})
    pred_risks_df <- data.frame(do.call(cbind, pred_risks_list))
    colnames(pred_risks_df) <- paste(« risk_at », time_points, « months », sep = « _ »)
    roc_1year <- timeROC(T = aa$time, delta = ifelse(aa$Status1 == « CSS », 1, 0), marker = pred_risks_df$risk_at_12_months, cause = 1, times = 12, iid = TRUE)
    roc_3year <- timeROC(T = aa$time, delta = ifelse(aa$Status1 == « CSS », 1, 0), marker = pred_risks_df$risk_at_36_months, cause = 1, times = 36, iid = TRUE)
    roc_5year <- timeROC(T = aa$time, delta = ifelse(aa$Status1 == « CSS », 1, 0), marker = pred_risks_df$risk_at_60_months, cause = 1,times = 60, iid = TRUE)
    legend(« en bas à droite »,legend = c(« CSS de 1 an », « CSS de 3 ans », « CSS de 5 ans »), col = c(« #BF1D2D », « #262626 », « #397FC7 »), lwd = 2)
    sas.cmprsk(m3,temps = 36)
    set.seed(123)
    aa$pro <- tenf.crr(m3,temps = 36)
    cindex(prob = aa$pro, fstatus = aa$Status1, ftime = aa$time, type = « crr », failcode = 1, cencode = 0, tol = 1e-20)
    groupci(x=aa$pro, ftime = aa$time, fstatus = aa$Status1, failcode = 1, cencode = 0, ci = TRUE, g = 5, m = 1000, u = 36, xlab = « Probabilité prédite », ylab = « Probabilité réelle », lty=1, lwd=2, col="#262626 »,xlim=c(0,1.0), ylim=c(0,1.0), add =TRUE)

Access restricted. Please log in or start a trial to view this content.

Résultats

Caractéristiques des patients
Cette étude s’est concentrée sur les patients diagnostiqués avec un CSRC colorectal, en utilisant les données de la base de données SEER couvrant la période de 2004 à 2015. Les critères d’exclusion comprenaient les patients dont la durée de survie était inférieure à un mois, ceux dont les informations clinicopathologiques étaient incomplètes et les cas dont la cause du décès n’était pas claire ou précisée. Au tot...

Access restricted. Please log in or start a trial to view this content.

Discussion

Cancer colorectal (CCR) Le SRCC est un sous-type rare et spécial de cancer colorectal de mauvais pronostic. Par conséquent, une plus grande attention doit être accordée au pronostic des patients atteints de SRCC. Une prédiction précise de la survie des patients atteints de SRCC est cruciale pour déterminer leur pronostic et prendre des décisions de traitement individualisées. Dans cette étude, nous avons exploré la relation entre les caractéristiques cliniques et le pronostic...

Access restricted. Please log in or start a trial to view this content.

Déclarations de divulgation

Les auteurs n’ont aucun conflit d’intérêts financier à divulguer.

Remerciements

Aucun

Access restricted. Please log in or start a trial to view this content.

matériels

NameCompanyCatalog NumberComments
SEER databaseNational Cancer institiute at NIH
X-tile softwareYale school of medicine
R-studioPosit

Références

  1. Siegel, R. L., Giaquinto, A. N., Jemal, A. Cancer statistics, 2024. CA Cancer J Clin. 74 (1), 12-49 (2024).
  2. Korphaisarn, K., et al. Signet ring cell colorectal cancer: Genomic insights into a rare subpopulation of colorectal adenocarcinoma. Br J Cancer. 121 (6), 505-510 (2019).
  3. Willauer, A. N., et al. Clinical and molecular characterization of early-onset colorectal cancer. Cancer. 125 (12), 2002-2010 (2019).
  4. Watanabe, A., et al. A case of primary colonic signet ring cell carcinoma in a young man which preoperatively mimicked Phlebosclerotic colitis. Acta Med Okayama. 73 (4), 361-365 (2019).
  5. Kim, H., Kim, B. H., Lee, D., Shin, E. Genomic alterations in signet ring and mucinous patterned colorectal carcinoma. Pathol Res Pract. 215 (10), 152566(2019).
  6. Deng, X., et al. Neoadjuvant radiotherapy versus surgery alone for stage II/III mid-low rectal cancer with or without high-risk factors: A prospective multicenter stratified randomized trial. Ann Surg. 272 (6), 1060-1069 (2020).
  7. Buk Cardoso, L., et al. Machine learning for predicting survival of colorectal cancer patients. Sci Rep. 13 (1), 8874(2023).
  8. Monterrubio-Gómez, K., Constantine-Cooke, N., Vallejos, C. A. A review on statistical and machine learning competing risks methods. Biom J. 66 (2), e2300060(2024).
  9. Kim, H. J., Choi, G. S. Clinical implications of lymph node metastasis in colorectal cancer: Current status and future perspectives. Ann Coloproctol. 35 (3), 109-117 (2019).
  10. Xu, T., et al. Log odds of positive lymph nodes is an excellent prognostic factor for patients with rectal cancer after neoadjuvant chemoradiotherapy. Ann Transl Med. 9 (8), 637(2021).
  11. Chen, Y. R., et al. Prognostic performance of different lymph node classification systems in young gastric cancer. J Gastrointest Oncol. 12 (4), 285-1300 (2021).
  12. Bouvier, A. M., et al. How many nodes must be examined to accurately stage gastric carcinomas? Results from a population based study. Cancer. 94 (11), 2862-2866 (2002).
  13. Coburn, N. G., Swallow, C. J., Kiss, A., Law, C. Significant regional variation in adequacy of lymph node assessment and survival in gastric cancer. Cancer. 107 (9), 2143-2151 (2006).
  14. Li Destri, G., Di Carlo, I., Scilletta, R., Scilletta, B., Puleo, S. Colorectal cancer and lymph nodes: the obsession with the number 12. World J Gastroenterol. 20 (8), 1951-1960 (2014).
  15. Dinaux, A. M., et al. Outcomes of persistent lymph node involvement after neoadjuvant therapy for stage III rectal cancer. Surgery. 163 (4), 784-788 (2018).
  16. Sun, Y., Zhang, Y., Huang, Z., Chi, P. Prognostic implication of negative lymph node count in ypN+ rectal cancer after neoadjuvant chemoradiotherapy and construction of a prediction nomogram. J Gastrointest Surg. 23 (5), 1006-1014 (2019).
  17. Xu, Z., Jing, J., Ma, G. Development and validation of prognostic nomogram based on log odds of positive lymph nodes for patients with gastric signet ring cell carcinoma. Chin J Cancer Res. 32 (6), 778-793 (2020).
  18. Scarinci, A., et al. The impact of log odds of positive lymph nodes (LODDS) in colon and rectal cancer patient stratification: a single-center analysis of 323 patients. Updates Surg. 70 (1), 23-31 (2018).
  19. Nitsche, U., et al. Prognosis of mucinous and signet-ring cell colorectal cancer in a population-based cohort. J Cancer Res Clin Oncol. 142 (11), 2357-2366 (2016).
  20. Kang, H., O'Connell, J. B., Maggard, M. A., Sack, J., Ko, C. Y. A 10-year outcomes evaluation of mucinous and signet-ring cell carcinoma of the colon and rectum. Dis Colon Rectum. 48 (6), 1161-1168 (2005).
  21. Sung, C. O., et al. Clinical significance of signet ring cells in colorectal mucinous adenocarcinoma. Mod Pathol. 21 (12), 1533-1541 (2008).
  22. Alvi, M. A., et al. Molecular profiling of signet ring cell colorectal cancer provides a strong rationale for genomic targeted and immune checkpoint inhibitor therapies. Br J Cancer. 117 (2), 203-209 (2017).
  23. Brownlee, S., et al. Evidence for overuse of medical services around the world. Lancet. 390 (10090), 156-168 (2017).

Access restricted. Please log in or start a trial to view this content.

Réimpressions et Autorisations

Demande d’autorisation pour utiliser le texte ou les figures de cet article JoVE

Demande d’autorisation

Explorer plus d’articles

M decinenum ro 218apprentissage automatiquecarcinome colorectal cellules en anneaulogarithme des chances de pr sence de ganglions lymphatiquesstade ganglionnaire

This article has been published

Video Coming Soon

JoVE Logo

Confidentialité

Conditions d'utilisation

Politiques

Recherche

Enseignement

À PROPOS DE JoVE

Copyright © 2025 MyJoVE Corporation. Tous droits réservés.