JoVE Logo

Accedi

È necessario avere un abbonamento a JoVE per visualizzare questo. Accedi o inizia la tua prova gratuita.

In questo articolo

  • Riepilogo
  • Abstract
  • Introduzione
  • Protocollo
  • Risultati
  • Discussione
  • Divulgazioni
  • Riconoscimenti
  • Materiali
  • Riferimenti
  • Ristampe e Autorizzazioni

Riepilogo

Questo studio valuta i sistemi prognostici per i pazienti con carcinoma a cellule con anello con castone del colon-retto utilizzando modelli di apprendimento automatico e analisi del rischio concorrenti. Identifica le probabilità logaritmiche di linfonodi positivi come un predittore superiore rispetto alla stadiazione pN, dimostrando forti prestazioni predittive e aiutando il processo decisionale clinico attraverso solidi strumenti di previsione della sopravvivenza.

Abstract

Lo stato dei linfonodi è un predittore prognostico critico per i pazienti; tuttavia, la prognosi del carcinoma a cellule con anello con castone del colon-retto (SRCC) ha raccolto un'attenzione limitata. Questo studio indaga la capacità predittiva prognostica delle probabilità logaritmiche dei linfonodi positivi (LODDS), del rapporto linfonodale (LNR) e della stadiazione pN nei pazienti con SRCC utilizzando modelli di apprendimento automatico (Random Forest, XGBoost e Neural Network) insieme a modelli di rischio concorrenti. I dati rilevanti sono stati estratti dal database Surveillance, Epidemiology, and End Results (SEER). Per i modelli di apprendimento automatico, i fattori prognostici per la sopravvivenza specifica per il cancro (CSS) sono stati identificati attraverso analisi di regressione di Cox univariate e multivariate, seguite dall'applicazione di tre metodi di apprendimento automatico - XGBoost, RF e NN - per accertare il sistema di stadiazione linfonodale ottimale. Nel modello di rischio concorrente, sono state impiegate analisi di rischio concorrenti univariate e multivariate per identificare i fattori prognostici ed è stato costruito un nomogramma per prevedere la prognosi dei pazienti con SRCC. L'area sotto la curva caratteristica operativa del ricevitore (AUC-ROC) e le curve di calibrazione sono state utilizzate per valutare le prestazioni del modello. In questo studio sono stati inclusi un totale di 2.409 pazienti con SRCC. Per convalidare l'efficacia del modello, è stata inclusa un'ulteriore coorte di 15.122 pazienti con cancro del colon-retto, esclusi i casi di SRCC, per la convalida esterna. Sia i modelli di apprendimento automatico che il nomogramma di rischio concorrente hanno mostrato ottime prestazioni nel prevedere gli esiti di sopravvivenza. Rispetto alla stadiazione pN, i sistemi di stadiazione LODDS hanno dimostrato una capacità prognostica superiore. Dopo la valutazione, i modelli di apprendimento automatico e i modelli di rischio concorrenti hanno ottenuto eccellenti prestazioni predittive caratterizzate da una buona discriminazione, calibrazione e interpretabilità. I nostri risultati possono aiutare a informare il processo decisionale clinico per i pazienti.

Introduzione

Il cancro del colon-retto (CRC) è il terzo tumore maligno più diffuso a livello globale 1,2,3. Il carcinoma a cellule ad anello con sigillo (SRCC), un raro sottotipo di CRC, comprende circa l'1% dei casi ed è caratterizzato da un'abbondante mucina intracellulare che sposta il nucleo cellulare 1,2,4. La SRCC è spesso associata a pazienti più giovani, ha una prevalenza più elevata nelle femmine e ha stadi tumorali avanzati alla diagnosi. Rispetto all'adenocarcinoma colorettale, l'SRCC mostra una differenziazione più scarsa, un rischio più elevato di metastasi a distanza e un tasso di sopravvivenza a 5 anni di solo il 12%-20%5,6. Lo sviluppo di un modello prognostico accurato ed efficace per la SRCC è fondamentale per ottimizzare le strategie di trattamento e migliorare i risultati clinici.

Questo studio mira a costruire un solido modello prognostico per i pazienti con SRCC utilizzando approcci statistici avanzati, tra cui l'apprendimento automatico (ML) e modelli di rischio concorrenti. Queste metodologie possono gestire relazioni complesse nei dati clinici, offrendo valutazioni del rischio personalizzate e superando i metodi tradizionali in termini di accuratezza predittiva. I modelli di apprendimento automatico, come Random Forest, XGBoost e Neural Networks, eccellono nell'elaborazione di dati ad alta dimensione e nell'identificazione di modelli complessi. Gli studi hanno dimostrato che i modelli di intelligenza artificiale predicono efficacemente gli esiti di sopravvivenza nel cancro del colon-retto, sottolineando il potenziale del ML nelle applicazioni cliniche 7,8. A complemento del ML, i modelli di rischio concorrenti affrontano più tipi di eventi, come la mortalità specifica per cancro rispetto ad altre cause di morte, per perfezionare l'analisi della sopravvivenza. A differenza dei metodi tradizionali come lo stimatore di Kaplan-Meier, i modelli di rischio concorrenti stimano accuratamente la probabilità marginale di eventi in presenza di rischi concorrenti, fornendo valutazioni di sopravvivenza più precise8. L'integrazione del ML e dell'analisi del rischio concorrente migliora le prestazioni predittive, offrendo un potente framework per strumenti prognostici personalizzati in SRCC 9,10,11.

Le metastasi linfonodali influenzano significativamente la prognosi e la recidiva nei pazienti con CRC. Mentre la valutazione dello stadio N nella classificazione TNM è fondamentale, un esame linfonodale inadeguato, riportato nel 48%-63% dei casi, può portare a una sottostima della malattia. Per affrontare questo problema, sono stati introdotti approcci alternativi come il rapporto linfonodale (LNR) e le probabilità logaritmiche di linfonodi positivi (LODDS). L'LNR, il rapporto tra i linfonodi positivi (PLN) e i linfonodi totali (TLN), è meno influenzato dalla conta dei TLN e funge da fattore prognostico nel CRC. LODDS, il rapporto logaritmico tra PLN e linfonodi negativi (NLN), ha mostrato una capacità predittiva superiore sia nel carcinoma gastrotrico che nel cancro del colon-retto 10,11. L'apprendimento automatico è stato sempre più applicato in oncologia, con modelli che migliorano la stratificazione del rischio e le previsioni prognostiche in vari tumori, tra cui i tumori al seno, alla prostata e ai polmoni 12,13,14. Tuttavia, la sua applicazione nell'SRCC colorettale rimane limitata.

Questo studio cerca di colmare questa lacuna integrando LODDS con ML e modelli di rischio concorrenti per creare uno strumento prognostico completo. Valutando il valore prognostico di LODDS e sfruttando tecniche predittive avanzate, questa ricerca mira a migliorare il processo decisionale clinico e migliorare i risultati per i pazienti con SRCC.

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

Protocollo

Questo studio non si riferisce all'approvazione etica e al consenso a partecipare. I dati utilizzati in questo studio sono stati ottenuti da database. Sono stati inclusi pazienti con diagnosi di carcinoma a cellule con anello con castetto del colon-retto dal 2004 al 2015, nonché altri tipi di cancro del colon-retto. I criteri di esclusione includevano i pazienti con un tempo di sopravvivenza inferiore a un mese, quelli con informazioni clinicopatologiche incomplete e i casi in cui la causa della morte non era chiara o non specificata.

1. Acquisizione dati

  1. Scarica SEER. Ottenere il software statistics 8.4.3 dal sito web del database SEER (http://seer.cancer.gov/about/overview.html). Dopo aver effettuato l'accesso al software, fare clic su Sessione elenco casi > Dati e selezionare il database Incidence SEER Research Plus Data, 17 Registri, novembre 2021 Sub (2000-2019).
  2. Fai clic su Selezione > Modifica e scegli {Razza, Sesso, Anno Dx. Anno della diagnosi} = '2004', '2005', '2006', '2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015' E {Sito e morfologia. Ricodifica del sito ICD-O-3/WHO 2008} = '8490/3'.
  3. Quindi fare clic su Tabella e, nell'interfaccia delle variabili disponibili, selezionare Ricodifica età con età singole e 100+, Sesso, Coniugale, Ricodifica sito ICD-O-3/WHO 2008, Dimensione del tumore CS, nodes_examined regionale (1988+), nodes_positive regionale (1988+), Gruppo di stadi AJCC derivato, 6a ed. (2004-2015), AJCC T derivato, 6a ed. (2004-2015), AJCC N, 6a ed. (2004-2015), AJCC M derivato, 6a ed. (2004-2015), CEA, Radioterapia recode, Chemioterapia recode (sì, no/unk), SEER cause-specific death classification, Vital status recode (studio cutoff utilizzato), Mesi di sopravvivenza, Anno della diagnosi.
  4. Infine, fai clic su Output, assegna un nome ai dati e fai clic su Esegui per generare e salvare i dati. Il processo di inclusione dettagliato è illustrato nella Figura 1.
  5. Scarica i dati dei pazienti con cancro del colon-retto, esclusi i casi di SRCC, per la successiva convalida esterna. Fai clic su Selezione > Modifica e scegli {Razza, Sesso, Anno Dx. Anno della diagnosi} = '2004', '2005', '2006', '2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015' E {Sito primario - etichettato} = 'C18-C20'. Ripetere i passaggi 1.3 e 1.4 per ottenere informazioni cliniche patologiche ed escludere i campioni con {Sito e morfologia. Ricodifica del sito ICD-O-3/WHO 2008} = '8490/3' dal file scaricato.
  6. A scopo comparativo, elaborare diverse variabili. Classificare lo stato dei linfonodi utilizzando sia il rapporto linfonodale (LNR) che il logaritmo delle probabilità di linfonodi positivi (LODDS).
    1. Definire LNR come il rapporto tra i linfonodi positivi (PLN) e i linfonodi totali (TLN). Calcola il valore LODDS utilizzando la formula:
      loge(numero di PLN + 0,5) / (numero di linfonodi negativi (NLNs) + 0,5)
      dove è stato aggiunto 0,5 per evitare un risultato infinito. I valori di cut-off per LNR, LODDS e dimensioni del tumore sono stati determinati utilizzando il software X-tile (versione 3.6.1) sulla base del metodo del valore P minimo.
  7. Apri il software X-tile, fai clic su File > Apri e seleziona il file di dati per importarlo nel software. Una volta caricati i dati, mappare le variabili: Censor corrisponde allo stato di sopravvivenza, Tempo di sopravvivenza corrisponde al tempo di sopravvivenza e marker1 è la variabile da analizzare, assicurandosi che i dati corrispondano correttamente.
  8. Quindi, fai clic su Fai > Kaplan-Meier > Marker1 per eseguire l'analisi di sopravvivenza Kaplan-Meier e generare la curva di sopravvivenza. Sulla base della separazione delle curve di sopravvivenza di Kaplan-Meier, della significatività statistica (ad esempio, p-value) e della rilevanza clinica, determinare il valore di cut-off ottimale e infine registrare o esportare i risultati dell'analisi.
    1. Dividi LNR in tre gruppi: LNR 1 (≤0,16), LNR 2 (0,16 - 0,78) e LNR 3 (≥ 0,78). Classificare i pazienti in tre gruppi in base a LODDS: LODDS 1 (≤ -1,44), LODDS 2 (-1,44 - 0,86) e LODDS 3 (≥ 0,86).
    2. Classificare le dimensioni del tumore in tre categorie: ≤ 3,5 cm, 3,5 - 5,5 cm e ≥ 5,5 cm. Converte l'età da una variabile continua a una variabile categoriale. Classificare l'età dei pazienti al momento della diagnosi iniziale come ≥60 anni e <60 anni. Classificare la posizione del tumore in base alla distribuzione dei tumori del carcinoma a cellule con anello con castone (SRCC) come colon destro, colon sinistro e retto. Il colon destro comprende il cieco, il colon ascendente, la flessura epatica e il colon trasverso, mentre il colon sinistro comprende la flessura splenica, il colon discendente, il colon sigmoideo e la giunzione rettosigmoidea.
  9. Per questo studio, assegnare in modo casuale un totale di 2409 dati di pazienti idonei con SRCC a una coorte di formazione (N = 1686) e a una coorte di convalida (N = 723) in un rapporto 7:3. Utilizzare il codice seguente per la suddivisione casuale e data.csv di origine dal database SEER. I file generati dopo la suddivisione casuale verranno utilizzati per ulteriori analisi.
    biblioteca (punto di inserimento)
    Dati <- read.csv ("data.csv")
    set.seed(123)
    train_indices <- createDataPartition(data$variable, p = 0.7, list = FALSE)
    train_data <- dati[train_indices, ]
    test_data <- dati[-train_indices, ]
    write.csv(train_data, "traindata.csv", nome.riga = FALSO)
    write.csv(test_data, "testdata.csv", nome.riga = FALSO)

2. Sviluppo e verifica di modelli ML

  1. Scarica RStudio (2024.04.2+764) e il software R (4.4.1). Aprire RStudio per eseguire il software R. Fare clic su Nuovo file e selezionare Script R per creare una nuova interfaccia di programmazione R. Immettere il codice pertinente nell'editor di codice e fare clic su Esegui per eseguire il codice.
  2. Utilizzare il codice seguente per esaminare le variabili incluse nei modelli ML mediante l'analisi di regressione di Cox. Inoltre, esplorare l'impatto della stadiazione LODDS, LNR e pN sulla sopravvivenza specifica per cancro (CSS) nei pazienti con SRCC. Il traindata.csv sono i dati ottenuti dal database SEER.
    biblioteca("sopravvivenza")
    libreria("survminer")
    Libreria ("RMS")
    Biblioteca ("DPLYR")
    Dati <- read.csv("traindata.csv")
    data$time=as.numeric(data$time)
    data$status=as.numeric(data$status)
    variabili <- c("Sesso", "Età", "Razza", "Coniugale", "Fase", "T", "N", "M","Tumor_size", "LNR", "LODDS", "CEA","Radiazioni", "Chemioterapia", "Sito")
    Dati < - Dati %>%
    mute(across(all_of(variabili), as.factor))
    cox=coxph(Surv(ora, stato) ~ dati$T, dati = dati)
    cox$coefficienti
    pval=anova(cox)$Pr[2]
    clean_data=dati[,c(1:12, 14:18)]
    get_coxVariable=funzione(your_data,indice){cox_list=c() k=1
    for (i in 1:index) {mod=coxph(Surv(ora, stato) ~ 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 in 1:15){print(variable_select[i])}
    for (var in variable_select) {formula <- as.formula(paste("Surv(ora, stato) ~", var))cox_model <- coxph(formula, dati = dati) print(summary(cox_model))
    ggforest(Cox)
    variabili <- c("Sesso", "Età", "Razza", "Coniugale", "Fase", "T", "N", "M", "Tumor_size", "LNR", "LODDS", "Chemioterapia")
    Dati < - Dati %>%
    mute(across(all_of(variabili), as.factor))
    cox=coxph(Surv(tempo, stato) ~ Sesso+Età+Razza+Coniugale+T+N+M+Tumor_size+LNR+
    LODDS+Chemioterapia,dati = dati)
    ggforest(cox,dati = dati)
    ggplot_forest <- ggforest(Cox, dati = dati)
  3. Utilizza il codice seguente per confrontare le capacità di previsione prognostica di tre sistemi LN (LODDS, LNR e staging pN) tra le coorti di addestramento, convalida e convalida esterna.
    Libreria (RMS)
    Biblioteca(Sopravvivenza)
    Libreria (Survminer)
    libreria(riskRegression)
    biblioteca(gt)
    train_data <- read.csv ("train_data123.csv")
    validation_data <- read.csv ("test_data123.csv")
    dd <- datadist(train_data)
    opzioni(distrib. dati = "gg")
    model_LNR <- cph(Surv(ora, stato) ~ LNR, dati = train_data, x = VERO, y = VERO)
    model_LODDS <- cph(Surv(ora, stato) ~ LODDS, dati = train_data, x = VERO, y = VERO)
    model_pN <- cph(Surv(ora, stato) ~ N, dati = train_data, x = VERO, y = VERO)
    calculate_performance <- function(modello, dati) {pred <- predict(modello, newdata = dati) c_index_result <- concordanza(Surv(data$tempo, dati$stato) ~ pred) c_index <- c_index_result$concordanza aic <- AIC(modello) bic <- BIC(modello) return(c(C_index = round(c_index, 3), AIC = round(aic, 2), BIC = round(bic, 2)))}
    calculate_performance <- function(modello, dati) {pred <- predict(modello, newdata = dati, 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 = round(ci_lower, 3), CI_Upper = round(ci_upper, 3), AIC = round(aic, 2), BIC = round(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(ora, stato) ~ LNR, dati = validation_data, x = VERO, y = VERO)
    model_LODDS_val <- cph(Surv(ora, stato) ~ LODDS, dati = validation_data, x = VERO, y = VERO)
    model_pN_val <- cph(Surv(ora, stato) ~ N, dati = validation_data, x = VERO, y = VERO)
    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)
    risultati <- data.frame(Variabile = 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(risultati) %>%
    tab_header(title = "Prestazioni predittive dei tre sistemi di stadiazione linfonodale") %>%
    cols_label(Variabile = "Variabile",Training_C_Index = "C-index (IC 95%) (Formazione)", Training_AIC = "AIC (Formazione)", Training_BIC = "BIC (Formazione)", Validation_C_Index = "C-index (IC 95%) (Convalida)", Validation_AIC = "AIC (Convalida)", Validation_BIC = "BIC (Convalida)")
    write.csv(risultati, "prediction_performance.csv", nome.riga = FALSO)
  4. Utilizzare il codice seguente per creare un modello XGBoost e generare grafici a barre dell'importanza relativa delle variabili, in modo da confrontare l'importanza dei tre sistemi LN. Allo stesso modo, generare curve ROC e curve di calibrazione. I dati sono ottenuti dal database SEER.
    Libreria(xgboost)
    biblioteca (punto di inserimento)
    biblioteca (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('Età', 'T', 'N', 'M', 'LODDS', 'Chemioterapia')]), etichetta = train_data$stato)
    test_matrix <- xgb. DMatrix(data = as.matrix(test_data[, c('Età', 'T', 'N', 'M', 'LODDS', 'Chemioterapia')]), etichetta = test_data$stato)
    Parametri <- list(booster = "gbtree", objective = "binary:logistic", eval_metric = "AUC", ETA = 0.1, max_depth = 6, sottocampione = 0.8, colsample_bytree = 0.8)
    xgb_model <- xgb.train(params = params, data = train_matrix, nrounds = 100, watchlist= list(train = train_matrix), verbose = 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$stato, pred_probs)
    auc_value <- auc(roc_curve)
    ci_auc <- ci.auc(roc_curve)
    sensitivity <- conf_matrix$byClass["Sensibilità"]
    specificità <- conf_matrix$byClass["Specificità"]
    precisione <- conf_matrix$complessivo["Accuratezza"]
    ppv <- conf_matrix$byClass["Valore Pos Pred"]
    npv <- conf_matrix$byClass["Valore Pred Neg"]
    result_table <- data.frame(Modello = "XGBoost", AUC = sprintf("%.3f (%.3f-%.3f)", auc_value, ci_auc[1], ci_auc[3]), Sensibilità = sprintf("%.3f", sensibilità), Specificità = sprintf("%.3f", specificità), Precisione = sprintf("%.3f", precisione), PPV = sprintf("%.3f", ppv), NPV = sprintf("%.3f", npv))
    write.csv(result_table, "xgboost_model_performance.csv", nome.riga = FALSO)
    roc_df <- data.frame(FPR = 1 - roc_curve$specificità, TPR = roc_curve$sensibilità)
    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 = "Curva ROC per il modello XGBoost", x = "Tasso di falsi positivi", y = "Tasso di veri positivi") + theme_minimal() + theme(panel.border = element_rect(color = "black", riempimento = NA, dimensione = 1))
    calibration_data <- data.frame(Stato = as.factor(test_data$stato), pred_probs = pred_probs)
    calib_model <- calibrazione(Stato ~ pred_probs, dati = calibration_data, classe = "1", tagli = 5)
    ggplot(calib_model$dati, aes(x = punto medio, y = percentuale)) + geom_line(colore = "blu acciaio", dimensione = 1) + geom_point(colore = "rosso", dimensione = 2) + geom_abline(intercetta = 0, pendenza = 1, tipo di linea = "tratteggiato", colore = "nero") +labs(titolo = "Curva di calibrazione per il modello XGBoost", x = "Probabilità prevista", y = "Proporzione osservata") + theme_minimal() + theme(panel.border = element_rect(colore = "nero", riempimento = NA, dimensione = 0.5))
  5. Utilizzare il codice seguente per creare un modello RF e generare grafici a barre dell'importanza relativa delle variabili, confrontando così l'importanza dei tre sistemi LN. Allo stesso modo, generare curve ROC e curve di calibrazione. I dati sono ottenuti dal database SEER.library(randomForest)
    biblioteca(dplyr)
    Libreria(ggplot2)
    biblioteca (pROC)
    biblioteca (punto di inserimento)
    Libreria (RMS)
    convoglio <- read.csv ("train_data.csv")
    testato <- read.csv("test_data.csv")
    trainset$status=factor(trainset$status)
    variabili1 <- c("Età", "T", "N", "M", "LODDS", "Chemioterapia")
    convogli < - convogli %>%
    mute(across(all_of(variabili1), as.numeric))
    Tested$Status=Fattore(Tested$status)
    testato < - testato %>%
    mute(across(all_of(variabili1), as.numeric))
    RF=randomForest(trainset$status ~ Età + T + N + M + LODDS + Chemioterapia, data=trainset,ntree=100,importance=TRUE,proximity=TRUE)
    imp=importanza(RF)
    varImpPlot(RF)
    impvar=rownames(imp)[order(imp[,4],decrescente = TRUE)]
    importance_df <- as.data.frame(imp)
    importance_df$Variabili <- rownames(importance_df)
    importance_plot <- ggplot(importance_df, aes(x = reorder(Variabili, MeanDecreaseAccuracy), y = MeanDecreaseAccuracy)) +geom_bar(stat = "identità", fill = "steelblue") +coord_flip() + labs(title = "Importanza variabile", x = "Variabili", y = "Precisione di diminuzione media") + theme_minimal()
    pred_probs <- predict(RF, testset, tipo = "prob")[,2]
    roc_obj <- roc(testset$stato, pred_probs)
    auc_value <- auc(roc_obj)
    roc_plot <- ggplot() +geom_line(aes(x = 1 - roc_obj$specificità, y = roc_obj$sensibilità), color = "steelblue", size = 1.2) +geom_abline(intercept = 0, slope = 1, linetype = "dashed", color = "gray") + annotate("text", x = 0.8, y = 0.2, label = paste("AUC =", round(auc_value, 3)), color = "black", size = 5, hjust = 0) + labs(title = "Curva ROC per modello di foresta casuale", x = "Tasso di falsi positivi", y = "Tasso di veri positivi") +theme_minimal() + theme(panel.border = element_rect(color = "black", fill = NA, size = 1))
    calibration_data <- data.frame(pred_probs = pred_probs, status = testsed$status)
    calib_model <- calibrazione(stato ~ pred_probs, dati = calibration_data, classe = "1", tagli = 5)
    calib_df <- as.data.frame(calib_model[["dati"]])
    calib_df$ medio <- calib_df $ punto medio
    calib_df$Percentuale <- calib_df$Percentuale
    calibration_plot <- ggplot(calib_df, aes(x = mid, y = Percentuale)) + geom_line(color = "steelblue", size = 1.2) + geom_point(color = "steelblue", size = 3) + geom_abline(intercept = 0, slope = 1, linetype = "dashed", color = "black", size = 0.8) + labs(title = "Curva di calibrazione per foresta casuale", x = "Probabilità prevista", y = "Probabilità effettiva") + theme_minimal() + theme(panel.border = element_rect(color = "black", fill = NA, size = 1), plot.title = element_text(hjust = -0.05, vjust = -1.5, face = "bold", size = 12) )
    rf_probs <- predict(RF, newdata=testsed, type="prob")[, 2]
    rf_auc <- roc(tested$stato, rf_probs)
    auc_value <- auc(rf_auc)
    ci_auc <- ci.auc(rf_auc)
    rf_predictions <- predire(RF, newdata=testato)
    conf_matrix <- confusionMatrix(rf_predictions, tested$status)
    sensitivity <- conf_matrix$byClass["Sensibilità"]
    specificità <- conf_matrix$byClass["Specificità"]
    precisione <- conf_matrix$complessivo["Accuratezza"]
    ppv <- conf_matrix$byClass["Valore Pos Pred"]
    npv <- conf_matrix$byClass["Valore Pred Neg"]
    result_table <- data.frame(Modello = "RF", AUC = sprintf("%.3f (%.3f-%.3f)", auc_value, ci_auc[1], ci_auc[3]), Sensibilità = sprintf("%.3f", sensibilità), Specificità = sprintf("%.3f", specificità), Precisione = sprintf("%.3f", precisione), PPV = sprintf("%.3f", ppv), NPV = sprintf("%.3f", npv))
    write.csv(result_table, "RF_model_performance.csv", nome.riga = FALSO)
  6. Utilizzare il codice seguente per creare un modello NN e generare grafici a barre dell'importanza relativa delle variabili, confrontando così l'importanza dei tre sistemi LN. Allo stesso modo, generare curve ROC e curve di calibrazione. I dati sono ottenuti dal database SEER.library(nnet)
    biblioteca (punto di inserimento)
    biblioteca (pROC)
    Libreria(ggplot2)
    train_data <- read.csv ("train_data.csv")
    test_data <- read.csv ("test_data.csv")
    train_data$stato <- as.factor(train_data$stato)
    test_data$stato <- as.factor(test_data$stato)
    caratteristiche <- c("Età", "T", "N", "M", "LODDS", "Chemioterapia")
    x_train <- train_data[, caratteristiche]
    y_train <- train_data$stato
    x_test <- test_data[, caratteristiche]
    y_test <- test_data$stato
    nn_model <- nnet(stato ~ Età + T + N + M + LODDS + Chemioterapia, dati = train_data, dimensione = 5, decadimento = 0,01, maxit = 200)
    pred_probs <- predict(nn_model, newdata = x_test, type = "raw")
    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)
    precisione <- conf_matrix$complessivo["Accuratezza"]
    sensitivity <- conf_matrix$byClass["Sensibilità"]
    specificità <- conf_matrix$byClass["Specificità"]
    ppv <- conf_matrix$byClass["Valore Pos Pred"]
    npv <- conf_matrix$byClass["Valore Pred Neg"]
    performance_table <- data.frame(Metrica = c("AUC (IC 95%)", "Precisione", "Sensibilità", "Specificità", "PPV", "NPV"),Valore = c(auc_text, round(precisione, 3), round(sensibilità, 3), round(specificità, 3), round(ppv, 3), round(npv, 3)))
    write.csv(performance_table, "NN_performance_table.csv", nome.riga = FALSO)
    roc_curve <- roc(y_test, pred_probs)
    auc_value <- auc(roc_curve)
    roc_plot <- ggplot() + geom_line(aes(x = 1 - roc_curve$specificità, y = roc_curve$sensibilità), color = "steelblue", size = 1.2) +geom_abline(intercept = 0, slope = 1, linetype = "dashed", color = "gray") + annotate("text", x = 0.8, y = 0.2, label = paste("AUC =", round(auc_value, 3)), color = "black", size = 5, hjust = 0) + labs(title = "Curva ROC per modello di rete neurale", x = "Tasso di falsi positivi", y = "Tasso di veri positivi") + theme_minimal() + theme(panel.border = element_rect(color = "black", fill = NA, size = 1))
    calibration_data <- data.frame(pred_probs = pred_probs, stato = as.numeric(y_test) - 1)
    calibration_data$pred_probs <- as.numeric(calibration_data$pred_probs)
    calibration_data$calibration_bin <- taglio(calibration_data$pred_probs, interruzioni = seq(0, 1, per = 0.2), include.lowest = TRUE)
    calibration_summary <- aggregato(stato ~ calibration_bin, dati = calibration_data, DIVERTIMENTO = media)
    calibration_summary$pred_mean <- aggregato(pred_probs ~ calibration_bin, dati = calibration_data, DIVERTIMENTO = media)$pred_probs
    calibration_plot <- ggplot(calibration_summary, aes(x = pred_mean, y = stato)) + geom_line(colore = "blu acciaio", dimensione = 1.2) + geom_point(colore = "rosso", dimensione = 3) + geom_abline(intercetta = 0, pendenza = 1, tipo di linea = "tratteggiato", colore = "nero", dimensione = 0.8) + labs(titolo = "Curva di calibrazione per rete neurale", x = "Probabilità prevista", y = "Probabilità effettiva") + theme_minimal() + theme(panel.border = element_rect(colore = "nero", riempimento = NA, dimensione = 1))
    nn_var_importance <- varImp(nn_model)
    importance_df <- data.frame(Feature = rownames(nn_var_importance), Importanza = nn_var_importance$Overall )
    importance_plot <- ggplot(importance_df, aes(x = reorder(Caratteristica, Importanza), y = Importanza)) + geom_bar(stat = "identità", fill = "steelblue") + coord_flip() + labs(title = "Importanza variabile per la rete neurale", x = "Caratteristiche", y = "Importanza") + theme_minimal()

3. Sviluppo e verifica del modello di rischio concorrente

  1. Utilizzare il codice seguente per eseguire l'analisi univariata e tracciare la curva della funzione di incidenza cumulativa (CIF). Il data.csv sono i dati ottenuti dal database SEER. Il metodo per salvare le immagini successive sarà lo stesso di questo passaggio. Sostituisci il sito nel codice uno per uno con altri fattori per eseguire un'analisi univariata per tutti i fattori.
    biblioteca(tidycmprsk)
    libreria(gtsummary)
    Libreria(ggplot2)
    Biblioteca(ggSurvfit)
    Libreria (ggprisma)
    AA <- read.csv ("data.csv")
    cif2 <- tidycmprsk::cuminc(Surv(ora, Stato1) ~Sito, dati = aa)
    ordinato(cif2,volte = c(12,24,36,48,60))
    tbl_cuminc(cif2, times =c(12,24,36,48,60), risultati = c("CSS", "OSS"),estimate_fun = NULL, label_header = "**{tempo/12} anno cuminc**") %>%
    add_p() %>%
    add_n(location = "livello")
    cuminc_plot <- ggcuminc(cif2, risultato = c("CSS", "OSS"), dimensione = 1.5) + labs(x = "tempo") +add_quantile(y_value = 0.20, dimensione = 1) + scale_x_continuous(pause = seq(0, 84, by = 12), limits = c(0, 84)) +scale_y_continuous(label = scales::p ercent, breaks = seq(0, 1, by = 0.2), limits = c(0, 1)) + theme_prism() + theme(legend.position = c(0.2, 0.8), panel.grid = element_blank(),panel.grid.major.y = element_line(colore = "grigio80")) + tema(legend.spaziatura.x = unità(0.1, "cm"), legenda.spaziatura.y = unità(0.01, "cm")) + tema(axis.ticks.length.x = unità(-0.2, "cm"), axis.ticks.x = element_line(colore = "nero", dimensione = 1, fine linea = 1)) + tema(axis.ticks.length.y = unità(-0.2, "cm"), axis.ticks.y = element_line(colore = "nero", dimensione = 1, fine linea = 1))
  2. Utilizzare il codice seguente per eseguire analisi e visualizzazioni multivariate. Il data1.csv deriva dai risultati del codice precedente. Dopo aver eseguito il codice, fai clic su Esporta, quindi fai clic su Salva come PDF e infine fai clic su Salva per salvare l'immagine.
    biblioteca(tidycmprsk)
    libreria(gtsummary)
    AA <-read.csv('data1.csv')
    for (i in names(aa)[c(1:16, 19)]){aa[,i] <- as.factor(aa[,i])}
    mul1Tabella2 <- mul1 %>%
    gtsummary::tbl_regression(esponenziale = VERO) %>%
    add_n(posizione = "livello"); Tabella 2
    table_df <- as_tibble(Tabella 2)
    Scheda <- Tavolo2$table_body
    tab1 <- tab[,c(12,19,20,22:29)]
  3. Utilizzare il codice seguente per tracciare il nomogramma, la curva ROC e la curva di calibrazione. Dopo aver addestrato il modello utilizzando i dati della coorte di addestramento, utilizzare i dati delle coorti di convalida e di convalida esterna per convalidare model.library(QHScrnomo). I dati della coorte esterna sono costituiti da campioni di cancro del colon-retto diverso dal carcinoma a cellule ad anello, che sono stati selezionati nella fase 1.4.
    Libreria (RMS)
    biblioteca (timeROC)
    Biblioteca(Sopravvivenza)
    AA <-read.csv(«data3.csv»)
    for (i in names(aa)[c(1:16, 19)]){aa[,i] <- as.factor(aa[,i])}
    dd <- datadist(aa)
    opzioni(distrib. dati = "gg")
    mul <- cph(Surv(tempo, Stato1 == 1) ~ T + N + M + LODDS + Sito, dati = aa, x = VERO, y = VERO, surv = VERO)
    m3 <- crr.fit(mul, codice errore = 1, codice cenCen(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"),Sito=
    c("RSC","LSC","Retto")))
    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("Incidenza cumulativa CSS a 1 anno","Incidenza cumulativa CSS a 3 anni","Incidenza cumulativa CSS a 5 anni"))
    time_points <- c(12, 36, 60)
    pred_risks_list <- lapply(time_points, function(time_point) {predict(m3, newdata = aa, type = "rischio", tempo = time_point)})
    pred_risks_df <- data.frame(do.call(cbind, pred_risks_list))
    colnames(pred_risks_df) <- paste("risk_at", time_points, "mesi", sep = "_")
    roc_1year <- timeROC(T = aa$time, delta = ifelse(aa$Status1 == "CSS", 1, 0), marcatore = pred_risks_df$risk_at_12_months, causa = 1, volte = 12, iid = TRUE)
    roc_3year <- timeROC(T = aa$time, delta = ifelse(aa$Status1 == "CSS", 1, 0), marcatore = pred_risks_df$risk_at_36_months, causa = 1, volte = 36, iid = TRUE)
    roc_5year <- timeROC(T = aa$time, delta = ifelse(aa$Status1 == "CSS", 1, 0), marcatore = pred_risks_df$risk_at_60_months, causa = 1, volte = 60, iid = TRUE)
    legend("bottomright",legend = c("CSS di 1 anno", "CSS di 3 anni", "CSS di 5 anni"), col = c("#BF1D2D", "#262626", "#397FC7"), lwd = 2)
    sas.cmprsk(m3,tempo = 36)
    set.seed(123)
    aa$pro <- tenf.crr(m3,tempo = 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à prevista", ylab = "Probabilità effettiva", 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.

Risultati

Caratteristiche dei pazienti
Questo studio si è concentrato su pazienti con diagnosi di SRCC colorettale, utilizzando i dati del database SEER dal 2004 al 2015. I criteri di esclusione includevano i pazienti con un tempo di sopravvivenza inferiore a un mese, quelli con informazioni clinicopatologiche incomplete e i casi in cui la causa della morte non era chiara o non specificata. Un totale di 2409 pazienti con SRCC colorettale che soddisfacevano i criteri di inclusi...

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

Discussione

Cancro del colon-retto (CRC) L'SRCC è un sottotipo raro e speciale di cancro del colon-retto con una prognosi infausta. Pertanto, è necessario prestare maggiore attenzione alla prognosi dei pazienti con SRCC. Una previsione accurata della sopravvivenza per i pazienti con SRCC è fondamentale per determinare la loro prognosi e prendere decisioni terapeutiche personalizzate. In questo studio, abbiamo esplorato la relazione tra caratteristiche cliniche e prognosi nei pazienti con SRCC e i...

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

Divulgazioni

Gli autori non hanno conflitti di interesse finanziari da rivelare.

Riconoscimenti

Nessuno

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

Materiali

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

Riferimenti

  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.

Ristampe e Autorizzazioni

Richiedi autorizzazione per utilizzare il testo o le figure di questo articolo JoVE

Richiedi Autorizzazione

Esplora altri articoli

MedicinaNumero 218apprendimento automaticocarcinoma colorettale a cellule con castetto anelloprobabilit logaritmiche di linfonodi positivistadio linfonodale

This article has been published

Video Coming Soon

JoVE Logo

Riservatezza

Condizioni di utilizzo

Politiche

Ricerca

Didattica

CHI SIAMO

Copyright © 2025 MyJoVE Corporation. Tutti i diritti riservati