Een abonnement op JoVE is vereist om deze inhoud te bekijken. Log in of start vandaag met uw gratis proefperiode.

Methodenartikel

Vergelijking van voorspellende prestaties van drie lymfeklierstadiëringssystemen bij colorectaal zegelringcelcarcinoom op basis van een machine learning-model

1.2K weergaven

DOI:

10.3791/67941

18 april 2025

* These authors contributed equally

In dit artikel

Samenvatting

Deze studie evalueert prognostische systemen voor patiënten met colorectaal zegelringcelcarcinoom met behulp van machine learning-modellen en concurrerende risicoanalyses. Het identificeert log-kansen van positieve lymfeklieren als een superieure voorspeller in vergelijking met pN-stadiëring, toont sterke voorspellende prestaties aan en helpt bij klinische besluitvorming door middel van robuuste overlevingsvoorspellingstools.

Samenvatting

De status van de lymfeklieren is een cruciale prognostische voorspeller voor patiënten; de prognose van colorectaal zegelringcelcarcinoom (SRCC) heeft echter beperkte aandacht gekregen. Deze studie onderzoekt het prognostische voorspellende vermogen van de log-kansen van positieve lymfeklieren (LODDS), lymfeklierratio (LNR) en pN-stadiëring bij SRCC-patiënten met behulp van machine learning-modellen (Random Forest, XGBoost en Neural Network) naast concurrerende risicomodellen. Relevante gegevens werden geëxtraheerd uit de database Surveillance, Epidemiology and End Results (SEER). Voor de machine learning-modellen werden prognostische factoren voor kankerspecifieke overleving (CSS) geïdentificeerd door middel van univariate en multivariate Cox-regressieanalyses, gevolgd door de toepassing van drie machine learning-methoden - XGBoost, RF en NN - om het optimale lymfeklierstadiëringssysteem vast te stellen. In het concurrerende risicomodel werden univariate en multivariate concurrerende risicoanalyses gebruikt om prognostische factoren te identificeren, en werd een nomogram gemaakt om de prognose van SRCC-patiënten te voorspellen. Het gebied onder de operationele karakteristiekcurve van de ontvanger (AUC-ROC) en kalibratiecurves werden gebruikt om de prestaties van het model te beoordelen. In totaal werden 2.409 SRCC-patiënten in deze studie opgenomen. Om de effectiviteit van het model te valideren, werd een extra cohort van 15.122 patiënten met colorectale kanker, exclusief SRCC-gevallen, opgenomen voor externe validatie. Zowel de machine learning-modellen als het concurrerende risiconomogram presteerden sterk bij het voorspellen van overlevingsresultaten. Vergeleken met pN-stadiëring vertoonden de LODDS-stadiëringssystemen een superieur prognostisch vermogen. Bij evaluatie bereikten machine learning-modellen en concurrerende risicomodellen uitstekende voorspellende prestaties die werden gekenmerkt door goede discriminatie, kalibratie en interpreteerbaarheid. Onze bevindingen kunnen helpen bij het informeren van klinische besluitvorming voor patiënten.

Inleiding

Colorectale kanker (CRC) is wereldwijd de derde meest voorkomende kwaadaardige tumor 1,2,3. Zegelringcelcarcinoom (SRCC), een zeldzaam subtype van CRC, omvat ongeveer 1% van de gevallen en wordt gekenmerkt door overvloedig intracellulair mucine dat de celkern verplaatst 1,2,4. SRCC wordt vaak geassocieerd met jongere patiënten, heeft een hogere prevalentie bij vrouwen en heeft gevorderde tumorstadia bij diagnose. In vergelijking met colorectaal adenocarcinoom vertoont SRCC een slechtere differentiatie, een hoger risico op metastase op afstand en een 5-jaarsoverleving van slechts 12%-20%5,6. Het ontwikkelen van een nauwkeurig en effectief prognostisch model voor SRCC is cruciaal voor het optimaliseren van behandelstrategieën en het verbeteren van klinische resultaten.

Deze studie heeft tot doel een robuust prognostisch model voor SRCC-patiënten op te bouwen met behulp van geavanceerde statistische benaderingen, waaronder machine learning (ML) en concurrerende risicomodellen. Deze methodologieën kunnen complexe relaties in klinische gegevens accommoderen, geïndividualiseerde risicobeoordelingen bieden en traditionele methoden overtreffen in voorspellende nauwkeurigheid. Machine learning-modellen, zoals Random Forest, XGBoost en Neural Networks, blinken uit in het verwerken van hoogdimensionale gegevens en het identificeren van ingewikkelde patronen. Studies hebben aangetoond dat AI-modellen effectief overlevingsresultaten voorspellen bij colorectale kanker, waarbij het potentieel van ML in klinische toepassingen wordt benadrukt 7,8. Als aanvulling op ML richten concurrerende risicomodellen zich op meerdere soorten gebeurtenissen, zoals kankerspecifieke mortaliteit versus andere doodsoorzaken, om de overlevingsanalyse te verfijnen. In tegenstelling tot traditionele methoden zoals de Kaplan-Meier-schatter, schatten concurrerende risicomodellen nauwkeurig de marginale waarschijnlijkheid van gebeurtenissen in de aanwezigheid van concurrerende risico's, waardoor nauwkeurigere overlevingsbeoordelingen worden geboden8. De integratie van ML en concurrerende risicoanalyse verbetert de voorspellende prestaties en biedt een krachtig raamwerk voor gepersonaliseerde prognostische tools in SRCC 9,10,11.

Lymfekliermetastasen hebben een significante invloed op de prognose en het recidief bij CRC-patiënten. Hoewel beoordeling in het N-stadium in de TNM-classificatie van cruciaal belang is, kan ontoereikend lymfeklieronderzoek - gerapporteerd in 48%-63% van de gevallen - leiden tot onderschatting van de ziekte. Om dit aan te pakken, zijn alternatieve benaderingen geïntroduceerd, zoals de lymfeklierratio (LNR) en de log-kansen van positieve lymfeklieren (LODDS). LNR, de verhouding tussen positieve lymfeklieren (PLN's) en totale lymfeklieren (TLN's), wordt minder beïnvloed door het aantal TLN's en dient als een prognostische factor bij CRC. LODDS, de logaritmische verhouding van PLN's tot negatieve lymfeklieren (NLN's), heeft een superieur voorspellend vermogen aangetoond bij zowel maag-SRCC als colorectale kanker10,11. Machine learning wordt in toenemende mate toegepast in de oncologie, met modellen die de risicostratificatie en prognostische voorspellingen verbeteren voor verschillende vormen van kanker, waaronder borst-, prostaat- en longkanker 12,13,14. De toepassing ervan in colorectale SRCC blijft echter beperkt.

Deze studie probeert deze kloof te overbruggen door LODDS te integreren met ML en concurrerende risicomodellen om een uitgebreide prognostische tool te creëren. Door de prognostische waarde van LODDS te evalueren en gebruik te maken van geavanceerde voorspellende technieken, heeft dit onderzoek tot doel de klinische besluitvorming te verbeteren en de resultaten voor SRCC-patiënten te verbeteren.

Toegang beperkt. Log in of start een proefperiode om deze inhoud te bekijken.

Protocol

Deze studie verwijst niet naar ethische goedkeuring en toestemming om deel te nemen. De gegevens die in dit onderzoek zijn gebruikt, zijn afkomstig uit databases. We hebben patiënten opgenomen bij wie van 2004 tot 2015 colorectaal zegelringcelcarcinoom is vastgesteld, evenals andere vormen van colorectale kanker. Uitsluitingscriteria waren onder meer patiënten met een overlevingstijd van minder dan een maand, patiënten met onvolledige klinisch-pathologische informatie en gevallen waarin de doodsoorzaak onduidelijk of niet gespecificeerd was.

1. Gegevensverzameling

  1. SEER downloaden. Verkrijg statistieken 8.4.3-software van de SEER-databasewebsite (http://seer.cancer.gov/about/overview.html). Nadat u bent ingelogd op de software, klikt u op Case List Session > Gegevens en selecteer de Incidence SEER Research Plus Data, 17 Registries, Nov 2021 Sub (2000-2019) database.
  2. Klik op Selectie > Bewerken en kies {Ras, Geslacht, Jaar Dx. Jaar van diagnose} = '2004', '2005', '2006', '2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015' EN {Site en morfologie. Site hercoderen ICD-O-3/WHO 2008} = '8490/3'.
  3. Klik vervolgens op Tabel en selecteer in de interface met beschikbare variabelen Leeftijdshercodering met alleenstaande leeftijden en 100+, Geslacht, Huwelijk, Site hercodering ICD-O-3/WHO 2008, CS-tumorgrootte, Regionaal nodes_examined (1988+), Regionaal nodes_positive (1988+), Afgeleide AJCC Stage Group, 6e druk (2004-2015), Afgeleid AJCC T, 6e druk (2004-2015), Afgeleid AJCC N, 6e druk (2004-2015), Afgeleid AJCC M, 6e druk (2004-2015), CEA, Straling hercoderen, Chemotherapie hercoderen (ja, nee/unk), SEER oorzaakspecifieke overlijdensclassificatie, Vitale status hercoderen (studiegrens gebruikt), Overlevingsmaanden, Jaar van diagnose.
  4. Klik ten slotte op Uitvoer, geef de gegevens een naam en klik op Uitvoeren om de gegevens uit te voeren en op te slaan. Het gedetailleerde inclusieproces wordt weergegeven in figuur 1.
  5. Download gegevens van patiënten met colorectale kanker, met uitzondering van SRCC-gevallen, voor latere externe validatie. Klik op Selectie > Bewerken en kies {Ras, Geslacht, Jaar Dx. Jaar van diagnose} = '2004', '2005', '2006', '2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015' EN {Primaire site - gelabeld} = 'C18-C20'. Herhaal stap 1.3 en 1.4 om klinisch-pathologische informatie te verkrijgen en sluit monsters met {Site and Morphology. Site hercodeer ICD-O-3/WHO 2008} = '8490/3' van het gedownloade bestand.
  6. Verwerk voor vergelijkingsdoeleinden verschillende variabelen. Classificeer de status van de lymfeklieren met behulp van zowel de lymfeklierratio (LNR) als de logaritme van de kans op positieve lymfeklieren (LODDS).
    1. Definieer LNR als de verhouding tussen positieve lymfeklieren (PLN's) en totale lymfeklieren (TLN's). Bereken de LODDS-waarde met behulp van de formule:
      loge(aantal PLN's + 0,5) / (aantal negatieve lymfeklieren (NLN's) + 0,5)
      waarbij 0,5 werd toegevoegd om een oneindig resultaat te voorkomen. De afkapwaarden voor LNR, LODDS en tumorgrootte werden bepaald met behulp van X-tile software (versie 3.6.1) op basis van de minimale P-waarde methode.
  7. Open de X-tile-software, klik op Bestand > Openen en selecteer het gegevensbestand om het in de software te importeren. Zodra de gegevens zijn geladen, brengt u de variabelen in kaart: Censor komt overeen met de overlevingsstatus, Overlevingstijd komt overeen met overlevingstijd en marker1 is de variabele die moet worden geanalyseerd, zodat de gegevens correct overeenkomen.
  8. Klik vervolgens op Do > Kaplan-Meier > Marker1 om de Kaplan-Meier-overlevingsanalyse uit te voeren en de overlevingscurve te genereren. Op basis van de scheiding van de Kaplan-Meier-overlevingscurves, statistische significantie (bijv. p-waarde) en klinische relevantie, bepaal de optimale afkapwaarde en registreer of exporteer ten slotte de analyseresultaten.
    1. Verdeel LNR in drie groepen: LNR 1 (≤0,16), LNR 2 (0,16 - 0,78) en LNR 3 (≥ 0,78). Categoriseer patiënten in drie groepen op basis van LODDS: LODDS 1 (≤ -1,44), LODDS 2 (-1,44 - 0,86) en LODDS 3 (≥ 0,86).
    2. Classificeer de tumorgrootte in drie categorieën: ≤ 3,5 cm, 3,5 - 5,5 cm en ≥ 5,5 cm. Converteer leeftijd van een continue naar een categorische variabele. Categoriseer de leeftijd van patiënten op het moment van de eerste diagnose als ≥60 jaar en <60 jaar. Classificeer de tumorlocatie op basis van de verdeling van zegelringcelcarcinoom (SRCC)-tumoren als rechter dikke darm, linker dikke darm en rectum. De rechter dikke darm omvat de blindedarm, de stijgende dikke darm, de leverbuiging en de dwarse dikke darm, terwijl de linker dikke darm de miltbuiging, de dalende dikke darm, de sigmoïde dikke darm en de rectosigmoïde overgang omvat.
  9. Wijs voor deze studie in totaal 2409 in aanmerking komende patiëntgegevens met SRCC willekeurig toe aan een trainingscohort (N = 1686) en een validatiecohort (N = 723) in een verhouding van 7:3. Gebruik de volgende code voor willekeurige splitsing en bron data.csv uit de SEER-database. De bestanden die na willekeurige splitsing worden gegenereerd, worden gebruikt voor verdere analyse.
    Bibliotheek(caret)
    Gegevens <- read.csv ("data.csv")
    set.zaad(123)
    train_indices <- createDataPartition(data$variable, p = 0,7, list = FALSE)
    train_data <- gegevens[train_indices, ]
    test_data <- gegevens[-train_indices, ]
    write.csv(train_data, "traindata.csv", rij.namen = ONWAAR)
    write.csv(test_data, "testdata.csv", rij.namen = ONWAAR)

2. Ontwikkeling en verificatie van ML-modellen

  1. Download RStudio (2024.04.2+764) en R software (4.4.1). Open RStudio om de R-software uit te voeren. Klik op Nieuw bestand en selecteer R Script om een nieuwe R-programmeerinterface te maken. Voer de relevante code in de code-editor in en klik op Uitvoeren om de code uit te voeren.
  2. Gebruik de volgende code om de variabelen in de ML-modellen te screenen door middel van Cox-regressieanalyse. Onderzoek daarnaast de impact van LODDS-, LNR- en pN-stadiëring op kankerspecifieke overleving (CSS) bij SRCC-patiënten. De traindata.csv zijn gegevens die zijn verkregen uit de SEER-database.
    bibliotheek ("overleving")
    bibliotheek ("survminer")
    Bibliotheek ("RMS")
    Bibliotheek ("dplyr")
    Gegevens <- read.csv ("traindata.csv")
    data$time=as.numeric(data$time)
    data$status=as.numeric(data$status)
    variabelen <- c("Geslacht", "Leeftijd", "Ras", "Huwelijk", "Stadium", "T", "N", "M","Tumor_size", "LNR", "LODDS", "CEA","Straling", "Chemotherapie", "Site")
    gegevens <- gegevens %>%
    mutate(over(all_of(variabelen), als.factor))
    cox=coxph(Surv(tijd, status) ~ data$T, data = data)
    cox$Coëfficiënten
    pval=anova(stuurman)$Pr[2]
    clean_data=gegevens[,c(1:12; 14:18)]
    get_coxVariable=functie(your_data;index){cox_list=c() k=1
    for (i in 1:index) {mod=coxph(Surv(tijd, status) ~ 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)
    voor(i in 1:15){print(variable_select[i])}
    for (var in variable_select) {formula <- as.formula(paste("Surv(tijd, status) ~", var))cox_model <- coxph(formule, data = data) print(summary(cox_model))
    ggforest (stuurman)
    variabelen <- c("Geslacht", "Leeftijd", "Ras", "Huwelijk", "Stadium", "T", "N", "M", "Tumor_size", "LNR", "LODDS", "Chemotherapie")
    gegevens <- gegevens %>%
    mutate(over(all_of(variabelen), als.factor))
    cox=coxph(Surv(tijd, status) ~ Geslacht+Leeftijd+Ras+Huwelijk+T+N+M+Tumor_size+LNR+
    LODDS+Chemotherapie, data = data)
    ggforest(stuurman;data = data)
    ggplot_forest <- ggforest(cox, data = data)
  3. Gebruik de volgende code om de prognostische voorspellingsmogelijkheden van drie LN-systemen (LODDS, LNR en pN-fasering) te vergelijken in de cohorten voor training, validatie en externe validatie.
    Bibliotheek (RMS)
    Bibliotheek (overleving)
    Bibliotheek (SurvMiner)
    bibliotheek(riskRegression)
    Bibliotheek(gt)
    train_data <- read.csv ("train_data123.csv")
    validation_data <- read.csv ("test_data123.csv")
    DD <- datadist(train_data)
    Options(DataDIST = "DD")
    model_LNR <- cph(Surv(tijd, status) ~ LNR, data = train_data, x = TRUE, y = TRUE)
    model_LODDS <- cph(Surv(tijd, status) ~ LODDS, data = train_data, x = TRUE, y = TRUE)
    model_pN <- cph(Surv(tijd, status) ~ N, data = train_data, x = TRUE, y = TRUE)
    calculate_performance <- functie(model, gegevens) {pred <- voorspellen(model, newdata = gegevens) c_index_result <- concordantie(Surv(data$time, data$status) ~ pred) c_index <- c_index_result$concordantie aic <- AIC(model) bic <- BIC(model) return(c(C_index = ronde(c_index, 3), AIC = ronde(aic, 2), BIC = ronde(bic, 2)))}
    calculate_performance <- functie(model, gegevens) {pred <- voorspellen(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 = ronde(ci_lower, 3), CI_Upper = ronde(ci_upper, 3), AIC = ronde(aic, 2), BIC = ronde(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(tijd, status) ~ LNR, data = validation_data, x = TRUE, y = TRUE)
    model_LODDS_val <- cph(Surv(tijd, status) ~ LODDS, data = validation_data, x = TRUE, y = TRUE)
    model_pN_val <- cph(Surv(tijd, status) ~ N, data = validation_data, x = TRUE, y = TRUE)
    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)
    resultaten <- 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(resultaten) %>%
    tab_header(title = "Voorspellingsprestaties van de drie lymfeklierstadiëringssystemen") %>%
    cols_label(Variabele = "Variabele",Training_C_Index = "C-index (95% BI) (Training)", Training_AIC = "AIC (Training)", Training_BIC = "BIC (Training)", Validation_C_Index = "C-index (95% BI) (Validatie)", Validation_AIC = "AIC (Validatie)", Validation_BIC = "BIC (Validatie)")
    write.csv(resultaten, "prediction_performance.csv", rij.namen = ONWAAR)
  4. Gebruik de volgende code om een XGBoost-model te bouwen en staafdiagrammen te genereren van het relatieve belang van variabelen, om zo het belang van de drie LN-systemen te vergelijken. Genereer op dezelfde manier ROC-curven en kalibratiecurves. De gegevens worden verkregen uit de SEER-database.
    Bibliotheek (XGboost)
    Bibliotheek(caret)
    bibliotheek(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("Leeftijd', 'T', 'N', 'M', 'LODDS', 'Chemotherapie')]), label = train_data$status)
    test_matrix <- xgb. DMatrix(data = as.matrix(test_data[, c("Leeftijd', 'T', 'N', 'M', 'LODDS', 'Chemotherapie')]), label = test_data$status)
    params <- list(booster = "gbtree", objective = "binair:logistiek", eval_metric = "auc", eta = 0,1, max_depth = 6, substeekproef = 0,8, colsample_bytree = 0,8)
    xgb_model <- xgb.train(params = params, data = train_matrix, nrounds = 100, watchlist= list(train = train_matrix), uitgebreid = 1)
    pred_probs <- voorspellen(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)
    gevoeligheid <- conf_matrix$byClass["Gevoeligheid"]
    specificiteit <- conf_matrix$byClass["Specificiteit"]
    nauwkeurigheid <- conf_matrix$overall["Nauwkeurigheid"]
    ppv <- conf_matrix$byClass["Pos Pred-waarde"]
    npv <- conf_matrix$byClass["Neg Pred-waarde"]
    result_table <- data.frame(Model = "XGBoost", AUC = sprintf("%.3f (%.3f-%.3f)", auc_value, ci_auc[1], ci_auc[3]), Gevoeligheid = sprintf("%.3f", gevoeligheid), Specificiteit = sprintf("%.3f", specificiteit), Nauwkeurigheid = sprintf("%.3f", nauwkeurigheid), PPV = sprintf("%.3f", ppv), NPV = sprintf("%.3f", npv))
    write.csv(result_table, "xgboost_model_performance.csv", rij.namen = ONWAAR)
    roc_df <- data.frame(FPR = 1 - roc_curve$specificiteiten, TPR = roc_curve$gevoeligheden)
    roc_plot <- ggplot(roc_df, aes(x = FPR, y = TPR)) +geom_line(color = "steelblue", size = 1.2) + geom_abline(intercept = 0, slope = 1, linetype = "gestippeld", color = "grijs") + annotate("text", x = 0.9, y = 0.2, label = plakken("AUC =", round(auc_value, 3)), size = 5, color = "black") + labs(title = "ROC Curve for XGBoost Model", x = "False Positive Rate", y = "True Positive Rate") + theme_minimal() + theme(panel.border = element_rect(color = "zwart", vulling = NA, grootte = 1))
    calibration_data <- data.frame(Status = as.factor(test_data$status), pred_probs = pred_probs)
    calib_model <- kalibratie(Status ~ pred_probs, gegevens = calibration_data, klasse = "1", sneden = 5)
    ggplot(calib_model$data, aes(x = middelpunt, y = procent)) + geom_line(color = "steelblue", size = 1) + geom_point(color = "rood", size = 2) + geom_abline(intercept = 0, slope = 1, linetype = "gestippeld", color = "zwart") +labs(title = "Kalibratiecurve voor XGBoost Model", x = "Voorspelde kans", y = "Waargenomen aandeel") + theme_minimal() + theme(panel.border = element_rect(color = "zwart", fill = NA, size = 0,5))
  5. Gebruik de volgende code om een RF-model te bouwen en staafdiagrammen te genereren van het relatieve belang van variabelen, waardoor het belang van de drie LN-systemen wordt vergeleken. Genereer op dezelfde manier ROC-curven en kalibratiecurves. De gegevens zijn afkomstig uit de SEER-database.library (randomForest)
    Bibliotheek (dplyr)
    Bibliotheek(ggplot2)
    bibliotheek(pROC)
    Bibliotheek(caret)
    Bibliotheek (RMS)
    Treinstel <- read.csv ("train_data.csv")
    geteste <- read.csv ("test_data.csv")
    treinset$status=factor(treinset$status)
    variabelen1 <- c("Leeftijd", "T", "N", "M", "LODDS", "Chemotherapie")
    Treinstel <- Treinstel %>%
    mutate(over(all_of(variabelen1), als.numeriek))
    getest$status=factor(getest$status)
    geteste <- geteste %>%
    mutate(over(all_of(variabelen1), als.numeriek))
    RF=randomForest(trainset$status ~ Leeftijd + T + N + M + LODDS + Chemotherapie, data=trainset,ntree=100,importance=TRUE,proximity=TRUE)
    imp=belang(RF)
    varImpPlot(RF)
    impvar=rijnamen(imp)[volgorde(imp[,4],afnemend = WAAR)]
    importance_df <- as.data.frame(imp)
    importance_df$Variabelen <- rijnamen(importance_df)
    importance_plot <- ggplot(importance_df, aes(x = herordening(Variabelen, MeanDecreaseAccuracy), y = MeanDecreaseAccuracy)) +geom_bar(stat = "identiteit", fill = "steelblue") +coord_flip() + labs(title = "Variabel belang", x = "Variabelen", y = "Gemiddelde afname nauwkeurigheid") + theme_minimal()
    pred_probs <- voorspellen(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$specificiteiten, y = roc_obj$gevoeligheden), color = "steelblue", size = 1.2) +geom_abline(intercept = 0, slope = 1, linetype = "gestippeld", color = "grijs") + annotate("text", x = 0.8, y = 0.2, label = plakken("AUC =", round(auc_value, 3)), color = "zwart", size = 5, hjust = 0) + labs(title = "ROC-curve voor willekeurig bosmodel", x = "Percentage fout-positieven", y = "Percentage echte positieven") +theme_minimal() + theme(panel.border = element_rect(kleur = "zwart", vulling = NA, grootte = 1))
    calibration_data <- data.frame(pred_probs = pred_probs, status = getest$status)
    calib_model <- kalibratie(status ~ pred_probs, gegevens = calibration_data, klasse = "1", sneden = 5)
    calib_df <- as.data.frame(calib_model[["data"]])
    calib_df$midden <- calib_df$middelpunt
    calib_df$Percent <- calib_df$Percent
    calibration_plot <- ggplot(calib_df, aes(x = mid, y = Percent)) + geom_line(color = "steelblue", size = 1.2) + geom_point(color = "steelblue", size = 3) + geom_abline(intercept = 0, slope = 1, linetype = "dashed", color = "zwart", size = 0.8) + labs(title = "Kalibratiecurve voor willekeurig bos", x = "Voorspelde kans", y = "Werkelijke kans") + theme_minimal() + theme(panel.border = element_rect(color = "zwart", fill = NA, size = 1), plot.title = element_text(hjust = -0.05, vjust = -1.5, face = "bold", size = 12) )
    rf_probs <- voorspellen(RF, newdata=getest, type="prob")[, 2]
    rf_auc <- roc(getest$status, rf_probs)
    auc_value <- auc(rf_auc)
    ci_auc <- ci.auc(rf_auc)
    rf_predictions <- voorspellen(RF, newdata=getest)
    conf_matrix <- confusionMatrix(rf_predictions, getest$status)
    gevoeligheid <- conf_matrix$byClass["Gevoeligheid"]
    specificiteit <- conf_matrix$byClass["Specificiteit"]
    nauwkeurigheid <- conf_matrix$overall["Nauwkeurigheid"]
    ppv <- conf_matrix$byClass["Pos Pred-waarde"]
    npv <- conf_matrix$byClass["Neg Pred-waarde"]
    result_table <- data.frame(Model = "RF", AUC = sprintf("%.3f (%.3f-%.3f)", auc_value, ci_auc[1], ci_auc[3]), Gevoeligheid = sprintf("%.3f", gevoeligheid), Specificiteit = sprintf("%.3f", specificiteit), Nauwkeurigheid = sprintf("%.3f", nauwkeurigheid), PPV = sprintf("%.3f", ppv), NPV = sprintf("%.3f", npv))
    write.csv(result_table, "RF_model_performance.csv", rij.namen = ONWAAR)
  6. Gebruik de volgende code om een NN-model te bouwen en staafdiagrammen te genereren van het relatieve belang van variabelen, waardoor het belang van de drie LN-systemen wordt vergeleken. Genereer op dezelfde manier ROC-curven en kalibratiecurves. De gegevens zijn afkomstig uit de SEER-database.library(nnet)
    Bibliotheek(caret)
    bibliotheek(pROC)
    Bibliotheek(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)
    kenmerken <- c("Age", "T", "N", "M", "LODDS", "Chemotherapy")
    x_train <- train_data[, functies]
    y_train <- train_data$status
    x_test <- test_data[, functies]
    y_test <- test_data$status
    nn_model <- nnet(status ~ Leeftijd + T + N + M + LODDS + Chemotherapie, data = train_data, grootte = 5, verval = 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 <- verwarringMatrix(als.factor(pred_labels), y_test)
    nauwkeurigheid <- conf_matrix$overall["Nauwkeurigheid"]
    gevoeligheid <- conf_matrix$byClass["Gevoeligheid"]
    specificiteit <- conf_matrix$byClass["Specificiteit"]
    ppv <- conf_matrix$byClass["Pos Pred-waarde"]
    npv <- conf_matrix$byClass["Neg Pred-waarde"]
    performance_table <- data.frame(Metrisch = c("AUC (95% BI)", "Nauwkeurigheid", "Gevoeligheid", "Specificiteit", "PPV", "NPV"),Waarde = c(auc_text, afrond(nauwkeurigheid, 3), afrond(gevoeligheid, 3), afrond(specificiteit, 3), afrond(ppv, 3), afrond(npv, 3)))
    write.csv(performance_table, "NN_performance_table.csv", rij.namen = ONWAAR)
    roc_curve <- roc(y_test, pred_probs)
    auc_value <- auc (roc_curve)
    roc_plot <- ggplot() + geom_line(aes(x = 1 - roc_curve$specificiteiten, y = roc_curve$gevoeligheden), 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 = "zwart", size = 5, hjust = 0) + labs(title = "ROC-curve voor neuraal netwerkmodel", x = "Percentage valse positieven", y = "Percentage echte positieven") + theme_minimal() + theme(panel.border = element_rect(kleur = "zwart", vulling = NA, grootte = 1))
    calibration_data <- data.frame(pred_probs = pred_probs, status = als.numeriek(y_test) - 1)
    calibration_data$pred_probs <- zoals.numeriek(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 <- aggregaat(status ~ calibration_bin, gegevens = calibration_data, PLEZIER = gemiddelde)
    calibration_summary$pred_mean <- aggregaat(pred_probs ~ calibration_bin, gegevens = calibration_data, FUN = gemiddelde)$pred_probs
    calibration_plot <- ggplot(calibration_summary, aes(x = pred_mean, y = status)) + geom_line(color = "steelblue", size = 1.2) + geom_point(color = "rood", size = 3) + geom_abline(intercept = 0, slope = 1, linetype = "gestippeld", color = "zwart", size = 0.8) + labs(title = "Kalibratiecurve voor neuraal netwerk", x = "Voorspelde kans", y = "Werkelijke kans") + theme_minimal() + theme(panel.border = element_rect(color = "zwart", vulling = NA, grootte = 1))
    nn_var_importance <- varImp(nn_model)
    importance_df <- data.frame(Functie = rijnamen(nn_var_importance), Belang = nn_var_importance$Overall )
    importance_plot <- ggplot(importance_df, aes(x = herordening(Functie, Belang), y = Belang)) + geom_bar(stat = "identiteit", vul = "steelblue") + coord_flip() + labs(title = "Variabel belang voor neuraal netwerk", x = "Functies", y = "Belang") + theme_minimal()

3. Ontwikkeling en verificatie van concurrerende risicomodellen

  1. Gebruik de volgende code om univariate analyse uit te voeren en de curve van de cumulatieve incidentiefunctie (CIF) uit te zetten. De data.csv zijn gegevens die zijn verkregen uit de SEER-database. De methode voor het opslaan van volgende afbeeldingen is hetzelfde als in deze stap. Vervang Site in de code één voor één door andere factoren om een univariate analyse uit te voeren voor alle factoren.
    Bibliotheek(tidycmprsk)
    Bibliotheek(gtsummary)
    Bibliotheek(ggplot2)
    Bibliotheek(ggsurvfit)
    Bibliotheek (ggprism)
    AA <- read.csv ("data.csv")
    cif2 <- tidycmprsk::cuminc(Surv(tijd, Status1) ~Site, data = aa)
    Opgeruimd(CIF2;Keer = C(12,24,36,48,60))
    tbl_cuminc(cif2, keer =c(12,24,36,48,60), uitkomsten = c("CSS", "OSS"),estimate_fun = NULL, label_header = "**{tijd/12}-jaar cuminc**") %>%
    add_p() %>%
    add_n(locatie = "niveau")
    cuminc_plot <- ggcuminc(cif2, outcome = c("CSS", "OSS"), size = 1.5) + labs(x = "time") +add_quantile(y_value = 0.20, size = 1) + scale_x_continuous(breaks = 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(kleur = "grey80")) + thema(legend.spacing.x = eenheid(0.1, "cm"), legend.spacing.y = eenheid(0.01, "cm")) + thema(axis.ticks.length.x = eenheid(-0.2, "cm"), axis.ticks.x = element_line(kleur = "zwart", grootte = 1, lineend = 1)) + thema(axis.ticks.length.y = eenheid(-0.2, "cm"), axis.ticks.y = element_line(kleur = "zwart", grootte = 1, regeleinde = 1))
  2. Gebruik de volgende code om multivariate analyse en visualisatie uit te voeren. De data1.csv komt voort uit de resultaten van de vorige code. Klik na het uitvoeren van de code op Exporteren, klik vervolgens op Opslaan als PDF en klik ten slotte op Opslaan om de afbeelding op te slaan.
    Bibliotheek(tidycmprsk)
    Bibliotheek(gtsummary)
    AA <-read.csv ('data1.csv')
    voor (i in namen(aa)[c(1:16, 19)]){aa[,i] <- as.factor(aa[,i])}
    mul1Tabel 2 <- Mul1 %>%
    gtsummary::tbl_regression(exponentiaal = WAAR) %>%
    add_n(locatie = "niveau"); Tabel 2
    table_df <- as_tibble (tabel 2)
    Tabblad <- Tabel2$table_body
    tab1 <- tab[,c(12,19,20,22:29)]
  3. Gebruik de volgende code om het nomogram, de ROC-curve en de kalibratiecurve uit te zetten. Nadat u het model hebt getraind met behulp van gegevens uit het trainingscohort, gebruikt u de gegevens van de validatie- en externe validatiecohorten om de model.library (QHScrnomo) te valideren. De externe cohortgegevens bestaan uit monsters van andere colorectale kanker dan ringcelcarcinoom, die in stap 1.4 zijn geselecteerd.
    Bibliotheek (RMS)
    bibliotheek(timeROC)
    Bibliotheek (overleving)
    AA <-read.csv ('data3.csv')
    voor (i in namen(aa)[c(1:16, 19)]){aa[,i] <- as.factor(aa[,i])}
    DD <- Datadist(aa)
    Options(DataDIST = "DD")
    mul <- cph(Surv(tijd, Status1 == 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("1-jaars CSS cumulatieve incidentie","3-jaars CSS cumulatieve incidentie","5-jaars CSS cumulatieve incidentie"))
    time_points <- c(12, 36, 60)
    pred_risks_list <- lapply(time_points, functie(time_point) {predict(m3, newdata = aa, type = "risico", tijd = time_point)})
    pred_risks_df <- data.frame(do.call(cbind, pred_risks_list))
    colnames(pred_risks_df) <- plakken("risk_at", time_points, "maanden", 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("rechtsonder",legenda = c("1 jaar CSS", "3 jaar CSS", "5 jaar CSS"), col = c("#BF1D2D", "#262626", "#397FC7"), lwd = 2)
    sas.cmprsk(m3;tijd = 36)
    set.zaad(123)
    aa$pro <- tenf.crr(m3;tijd = 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 = "Voorspelde kans", ylab = "Werkelijke kans", lty=1, lwd=2, col="#262626",xlim=c(0,1.0), ylim=c(0,1.0), add =TRUE)

Toegang beperkt. Log in of start een proefperiode om deze inhoud te bekijken.

Resultaten

Kenmerken van de patiënt
Deze studie richtte zich op patiënten met de diagnose colorectale SRCC, met behulp van gegevens uit de SEER-database van 2004 tot 2015. Uitsluitingscriteria waren onder meer patiënten met een overlevingstijd van minder dan een maand, patiënten met onvolledige klinisch-pathologische informatie en gevallen waarin de doodsoorzaak onduidelijk of niet gespecificeerd was. In totaal werden 2409 colorectale SRCC-patiënten die aan de inclusiecriteria v...

Toegang beperkt. Log in of start een proefperiode om deze inhoud te bekijken.

Discussie

Colorectale kanker (CRC) SRCC is een zeldzaam en speciaal subtype van colorectale kanker met een slechte prognose. Daarom moet er meer aandacht worden besteed aan de prognose van SRCC-patiënten. Nauwkeurige overlevingsvoorspelling voor SRCC-patiënten is cruciaal voor het bepalen van hun prognose en het nemen van geïndividualiseerde behandelingsbeslissingen. In deze studie onderzochten we de relatie tussen klinische kenmerken en prognose bij SRCC-patiënten en identificeerden we het optima...

Toegang beperkt. Log in of start een proefperiode om deze inhoud te bekijken.

Openbaarmakingen

De auteurs hebben geen financiële belangenconflicten om bekend te maken.

Materialen

Lijst van materialen gebruikt in dit artikel
NaamBedrijfCatalogusnummerOpmerkingen
SEER-databaseNational Cancer Institute at NIH
X-tile softwareYale School of Medicine
R-studioPosit

Referenties

  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).

Toegang beperkt. Log in of start een proefperiode om deze inhoud te bekijken.

Herprints en machtigingen

Tags

Machine learning-modellenoverlevingsvoorspelling bij kankerLODDS-classificatielymfeklierratioRandom ForestXGBoost-modelneuraal netwerkmodelconcurrerend risicomodel