JoVE Logo

Sign In

A subscription to JoVE is required to view this content. Sign in or start your free trial.

In This Article

  • Summary
  • Abstract
  • Introduction
  • Protocol
  • תוצאות
  • Discussion
  • Disclosures
  • Acknowledgements
  • Materials
  • References
  • Reprints and Permissions

Summary

מחקר זה מעריך מערכות פרוגנוסטיות לחולי קרצינומה של תאי טבעת חותם המעי הגס באמצעות מודלים של למידת מכונה וניתוחי סיכונים מתחרים. הוא מזהה סיכויי לוג של בלוטות לימפה חיוביות כמנבא טוב יותר בהשוואה לשלב pN, מדגים ביצועי חיזוי חזקים ומסייע בקבלת החלטות קליניות באמצעות כלי חיזוי הישרדות חזקים.

Abstract

מצב בלוטות הלימפה הוא מנבא פרוגנוסטי קריטי לחולים; עם זאת, הפרוגנוזה של קרצינומה של תאי טבעת חותם המעי הגס (SRCC) זכתה לתשומת לב מוגבלת. מחקר זה חוקר את יכולת החיזוי הפרוגנוסטית של סיכויי הלוג של בלוטות לימפה חיוביות (LODDS), יחס בלוטות הלימפה (LNR) ושלב pN בחולי SRCC באמצעות מודלים של למידת מכונה (Random Forest, XGBoost ו-Neural Network) לצד מודלים מתחרים של סיכונים. נתונים רלוונטיים חולצו ממסד הנתונים של מעקב, אפידמיולוגיה ותוצאות סופיות (SEER). עבור מודלים של למידת מכונה, זוהו גורמים פרוגנוסטיים להישרדות ספציפית לסרטן (CSS) באמצעות ניתוחי רגרסיה של קוקס חד-משתנים ורב-משתנים, ואחריהם יישום של שלוש שיטות למידת מכונה - XGBoost, RF ו-NN - כדי לוודא את מערכת השלבים האופטימלית של בלוטות הלימפה. במודל הסיכון המתחרה, נעשה שימוש בניתוחי סיכונים מתחרים חד-משתנים ורב-משתנים כדי לזהות גורמים פרוגנוסטיים, ונבנתה נומוגרמה כדי לחזות את הפרוגנוזה של חולי SRCC. האזור שמתחת לעקומת מאפיין ההפעלה של המקלט (AUC-ROC) ועקומות הכיול נוצלו כדי להעריך את ביצועי המודל. בסך הכל נכללו במחקר זה 2,409 חולי SRCC. כדי לאמת את יעילות המודל, קבוצה נוספת של 15,122 חולי סרטן המעי הגס, לא כולל מקרי SRCC, נכללה לאימות חיצוני. גם המודלים של למידת המכונה וגם נומוגרמת הסיכון המתחרה הציגו ביצועים חזקים בחיזוי תוצאות ההישרדות. בהשוואה לבימוי pN, מערכות ההיערכות של LODDS הפגינו יכולת פרוגנוסטית מעולה. לאחר ההערכה, מודלים של למידת מכונה ומודלים של סיכונים מתחרים השיגו ביצועי חיזוי מצוינים המאופיינים באבחנה, כיול ופרשנות טובים. הממצאים שלנו עשויים לסייע בקבלת החלטות קליניות מושכלות עבור מטופלים.

Introduction

סרטן המעי הגס (CRC) מדורג כגידול הממאיר השלישי בשכיחותו בעולם 1,2,3. קרצינומה של תאי טבעת חותם (SRCC), תת-סוג נדיר של CRC, מהווה כ-1% מהמקרים ומאופיינת בשפע של מוצין תוך תאי העוקף את גרעין התא 1,2,4. SRCC קשור לעתים קרובות לחולים צעירים יותר, יש לו שכיחות גבוהה יותר בנשים ויש לו שלבי גידול מתקדמים באבחון. בהשוואה לאדנוקרצינומה של המעי הגס, SRCC מראה התמיינות גרועה יותר, סיכון גבוה יותר לגרורות מרוחקות ושיעור הישרדות של 5 שנים של 12%-20% בלבד5,6. פיתוח מודל פרוגנוסטי מדויק ויעיל עבור SRCC הוא חיוני לאופטימיזציה של אסטרטגיות טיפול ושיפור התוצאות הקליניות.

מחקר זה נועד לבנות מודל פרוגנוסטי חזק עבור חולי SRCC תוך שימוש בגישות סטטיסטיות מתקדמות, כולל למידת מכונה (ML) ומודלים מתחרים של סיכונים. מתודולוגיות אלו יכולות להתאים ליחסים מורכבים בנתונים קליניים, להציע הערכות סיכונים אינדיבידואליות ולהתעלות על שיטות מסורתיות בדיוק חיזוי. מודלים של למידת מכונה, כגון Random Forest, XGBoost ו-Neural Networks, מצטיינים בעיבוד נתונים בממדים גבוהים ובזיהוי דפוסים מורכבים. מחקרים הראו כי מודלים של בינה מלאכותית חוזים ביעילות תוצאות הישרדות בסרטן המעי הגס, תוך שימת דגש על הפוטנציאל של ML ביישומים קליניים 7,8. כהשלמה ל-ML, מודלים מתחרים של סיכון מתייחסים לסוגי אירועים מרובים, כגון תמותה ספציפית לסרטן לעומת סיבות מוות אחרות, כדי לחדד את ניתוח ההישרדות. בניגוד לשיטות מסורתיות כמו אומדן קפלן-מאייר, מודלים מתחרים של סיכונים מעריכים במדויק את ההסתברות השולית לאירועים בנוכחות סיכונים מתחרים, ומספקים הערכות הישרדות מדויקות יותר8. שילוב ML וניתוח סיכונים מתחרים משפר את ביצועי החיזוי, ומציע מסגרת רבת עוצמה לכלים פרוגנוסטיים מותאמים אישית ב-SRCC 9,10,11.

גרורות בבלוטות הלימפה משפיעות באופן משמעותי על הפרוגנוזה וההישנות בחולי CRC. בעוד שהערכת שלב N בסיווג TNM היא קריטית, בדיקת בלוטות לימפה לא מספקת - המדווחת ב-48%-63% מהמקרים - עלולה להוביל להערכת חסר של המחלה. כדי לטפל בכך, הוצגו גישות חלופיות כמו יחס בלוטות הלימפה (LNR) וסיכויי הלוג של בלוטות לימפה חיוביות (LODDS). LNR, היחס בין בלוטות לימפה חיוביות (PLNs) לסך בלוטות הלימפה (TLNs), מושפע פחות מספירת TLN ומשמש כגורם פרוגנוסטי ב-CRC. LODDS, היחס הלוגריתמי של PLNs לבלוטות לימפה שליליות (NLNs), הראה יכולת ניבוי מעולה הן ב-SRCC בקיבה והן בסרטן המעי הגס10,11. למידת מכונה מיושמת יותר ויותר באונקולוגיה, עם מודלים המשפרים את ריבוד הסיכון ותחזיות פרוגנוסטיות על פני סוגי סרטן שונים, כולל סרטן השד, הערמונית והריאות 12,13,14. עם זאת, היישום שלו ב-SRCC המעי הגס נותר מוגבל.

מחקר זה מבקש לגשר על הפער הזה על ידי שילוב LODDS עם ML ומודלים מתחרים של סיכונים כדי ליצור כלי פרוגנוסטי מקיף. על ידי הערכת הערך הפרוגנוסטי של LODDS ומינוף טכניקות חיזוי מתקדמות, מחקר זה נועד לשפר את קבלת ההחלטות הקליניות ולשפר את התוצאות עבור חולי SRCC.

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

Protocol

מחקר זה אינו מתייחס לאישור אתי והסכמה להשתתף. הנתונים ששימשו במחקר זה התקבלו ממאגרי מידע. כללנו חולים שאובחנו עם קרצינומה של תאי טבעת המעי הגס בין השנים 2004 ל-2015, כמו גם סוגים אחרים של סרטן המעי הגס. קריטריוני ההדרה כללו חולים עם זמן הישרדות של פחות מחודש, כאלה עם מידע קליני פתולוגי חלקי ומקרים שבהם סיבת המוות לא הייתה ברורה או לא מוגדרת.

1. רכישת נתונים

  1. הורד את SEER. השג תוכנת סטטיסטיקה 8.4.3 מאתר מסד הנתונים של SEER (http://seer.cancer.gov/about/overview.html). לאחר הכניסה לתוכנה, לחץ על מפגש רשימת מקרים > נתונים ובחר את נתוני שכיחות SEER Research Plus, 17 רישומים, נובמבר 2021 תת מסד נתונים (2000-2019).
  2. לחץ על בחירה > עריכה ובחר {גזע, מין, שנת Dx. שנת אבחון} = '2004', '2005', '2006', '2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015' ו-{אתר ומורפולוגיה. קידוד האתר ICD-O-3/WHO 2008} = '8490/3'.
  3. לאחר מכן לחץ על טבלה, ובממשק המשתנים הזמינים, בחר קידוד מחדש של גיל עם גילאים בודדים ו-100+, מין, נישואים, קידוד מחדש של האתר ICD-O-3/WHO 2008, גודל גידול CS, nodes_examined אזורי (1988+), אזורי nodes_positive(1988+), קבוצת שלב AJCC נגזרת, מהדורה שישית (2004-2015), נגזרת AJCC T, מהדורה שישית (2004-2015), נגזרת AJCC N, מהדורה שישית (2004-2015), נגזרת AJCC M, מהדורה שישית (2004-2015), CEA, קידוד קרינה, קידוד מחדש של כימותרפיה (כן, לא/unk), סיווג מוות ספציפי לגורם SEER, קידוד מחדש של סטטוס חיוני (נעשה שימוש בחתך המחקר), חודשי הישרדות, שנת אבחון.
  4. לבסוף, לחץ על פלט, תן שם לנתונים ולחץ על ביצוע כדי להפיק ולשמור את הנתונים. תהליך ההכללה המפורט מוצג באיור 1.
  5. הורד נתונים מחולי סרטן המעי הגס, למעט מקרי SRCC, לצורך אימות חיצוני לאחר מכן. לחץ על בחירה > עריכה ובחר {גזע, מין, שנת Dx. שנת אבחון} = '2004', '2005', '2006', '2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015' ו-{אתר ראשי - מתויג} = 'C18-C20'. חזור על שלבים 1.3 ו-1.4 כדי לקבל מידע פתולוגי קליני ולהוציא דגימות עם {אתר ומורפולוגיה. קידוד האתר ICD-O-3/WHO 2008} = '8490/3' מהקובץ שהורדת.
  6. למטרות השוואה, עבד מספר משתנים. סווג את מצב בלוטות הלימפה באמצעות יחס בלוטות הלימפה (LNR) ולוגריתם של הסיכויים לבלוטות לימפה חיוביות (LODDS).
    1. הגדר LNR כיחס בין בלוטות לימפה חיוביות (PLNs) לסך בלוטות הלימפה (TLNs). חשב את ערך ה- LODDS באמצעות הנוסחה:
      loge(מספר PLNs + 0.5) / (מספר בלוטות הלימפה השליליות (NLNs) + 0.5)
      כאשר נוסף 0.5 כדי למנוע תוצאה אינסופית. ערכי החיתוך עבור LNR, LODDS וגודל הגידול נקבעו באמצעות תוכנת X-tile (גרסה 3.6.1) בהתבסס על שיטת ערך ה-P המינימלי.
  7. פתח את תוכנת X-tile, לחץ על File > Open ובחר את קובץ הנתונים כדי לייבא אותו לתוכנה. לאחר טעינת הנתונים, מפה את המשתנים: צנזור מתאים למצב ההישרדות, זמן ההישרדות מתאים לזמן ההישרדות, וסמן 1 הוא המשתנה שיש לנתח, מה שמבטיח שהנתונים תואמים כהלכה.
  8. לאחר מכן, לחץ על Do > Kaplan-Meier > Marker1 כדי לבצע את ניתוח ההישרדות של קפלן-מאייר וליצור את עקומת ההישרדות. בהתבסס על ההפרדה של עקומות ההישרדות של קפלן-מאייר, מובהקות סטטיסטית (למשל, p-value) ורלוונטיות קלינית, קובעים את ערך החיתוך האופטימלי, ולבסוף מתעדים או מייצאים את תוצאות הניתוח.
    1. חלקו את LNR לשלוש קבוצות: LNR 1 (≤0.16), LNR 2 (0.16 - 0.78) ו-LNR 3 (≥ 0.78). סווג את המטופלים לשלוש קבוצות על סמך LODDS: LODDS 1 (≤ -1.44), LODDS 2 (-1.44 - 0.86) ו-LODDS 3 (≥ 0.86).
    2. סווג את גודל הגידול לשלוש קטגוריות: ≤ 3.5 ס"מ, 3.5 - 5.5 ס"מ ו ≥ 5.5 ס"מ. המרת גיל ממשתנה רציף למשתנה קטגורי. סווג את גילאי המטופלים בזמן האבחנה הראשונית כ-≥60 שנים ו-<60 שנים. סווג את מיקום הגידול על סמך התפלגות גידולי קרצינומה של תאי טבעת חותם (SRCC) כמו המעי הגס הימני, המעי הגס השמאלי והחלחולת. המעי הגס הימני כולל את הצקום, המעי הגס העולה, כיפוף הכבד והמעי הגס הרוחבי, ואילו המעי הגס השמאלי כולל את כיפוף הטחול, המעי הגס היורד, המעי הגס הסיגמואיד וצומת הרקטוסיגמואיד.
  9. עבור מחקר זה, הקצו באופן אקראי סך של 2409 נתוני מטופלים מתאימים עם SRCC לקבוצת אימון (N = 1686) וקבוצת אימות (N = 723) ביחס של 7:3. השתמש בקוד הבא לפיצול אקראי, ומקור data.csv ממסד הנתונים של SEER. הקבצים שנוצרו לאחר פיצול אקראי ישמשו להמשך ניתוח.
    ספרייה (סימן כניסה)
    נתונים <- read.csv("data.csv")
    סט.זרע(123)
    train_indices <- createDataPartition(data$variable, p = 0.7, list = FALSE)
    train_data <- נתונים[train_indices, ]
    test_data <- נתונים[-train_indices, ]
    write.csv(train_data, "traindata.csv", row.names = FALSE)
    write.csv(test_data, "testdata.csv", row.names = FALSE)

2. פיתוח ואימות מודלים של ML

  1. הורד את תוכנת RStudio (2024.04.2+764) ו-R (4.4.1). פתח את RStudio כדי להריץ תוכנת R. לחץ על קובץ חדש ובחר R Script כדי ליצור ממשק תכנות R חדש. הזן את הקוד הרלוונטי בעורך הקוד ולחץ על הפעל כדי לבצע את הקוד.
  2. השתמש בקוד הבא כדי לסנן את המשתנים הכלולים במודלים של ML על ידי ניתוח רגרסיה של קוקס. בנוסף, חקור את ההשפעה של שלב LODDS, LNR ו-pN על הישרדות ספציפית לסרטן (CSS) בחולי SRCC. traindata.csv הוא נתונים המתקבלים ממסד הנתונים של SEER.
    library("הישרדות")
    library("survminer")
    library("RMS")
    library("dplyr")
    נתונים <- read.csv("traindata.csv")
    data$time=as.numeric(data$time)
    data$status=as.numeric(data$status)
    משתנים <- c("מין", "גיל", "גזע", "נישואים", "שלב", "T", "N", "M", "Tumor_size", "LNR", "LODDS", "CEA", "הקרנות", "כימותרפיה", "אתר")
    נתונים <- נתונים %>%
    מוטציה(לרוחב(all_of(משתנים), as.factor))
    cox=coxph(Surv(time, status) ~ data$T, data = data)
    COX$מקדמי
    pval=anova(cox)$Pr[2]
    clean_data=נתונים[,c(1:12, 14:18)]
    get_coxVariable=פונקציה(your_data,אינדקס){cox_list=c() k=1
    עבור (i ב-1:אינדקס) {mod=coxph(Surv(time, 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)
    for(i in 1:15){print(variable_select[i])}
    עבור (var ב-variable_select) {formula <- as.formula(paste("Surv(time, status) ~", var))cox_model <- coxph(formula, data = data) print(summary(cox_model))
    GGFOREST(קוקס)
    משתנים <- c("מין", "גיל", "גזע", "נישואים", "שלב", "T", "N", "M", "Tumor_size", "LNR", "LODDS", "כימותרפיה")
    נתונים <- נתונים %>%
    מוטציה(לרוחב(all_of(משתנים), as.factor))
    cox=coxph(Surv(זמן, סטטוס) ~ מין+גיל+גזע+נישואים+T+N+M+Tumor_size+LNR+
    LODDS+כימותרפיה, נתונים = נתונים)
    ggforest(cox,data = נתונים)
    ggplot_forest <- ggforest(קוקס, נתונים = נתונים)
  3. השתמש בקוד הבא כדי להשוות את יכולות החיזוי הפרוגנוסטיות של שלוש מערכות LN (LODDS, LNR ו-pN stageing) על פני קבוצות האימון, האימות והאימות החיצוני.
    ספרייה (RMS)
    ספריה(הישרדות)
    ספרייה(Survminer)
    library(riskRegression)
    ספריה(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(זמן, מצב) ~ LNR, נתונים = train_data, x = TRUE, y = TRUE)
    model_LODDS <- cph(Surv(time, status) ~ LODDS, data = train_data, x = TRUE, y = TRUE)
    model_pN <- cph(Surv(זמן, מצב) ~ N, נתונים = train_data, x = TRUE, y = TRUE)
    calculate_performance <- פונקציה(מודל, נתונים) {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 <- פונקציה(מודל, נתונים) {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 = 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(זמן, מצב) ~ LNR, נתונים = validation_data, x = TRUE, y = TRUE)
    model_LODDS_val <- cph(Surv(time, status) ~ LODDS, data = validation_data, x = TRUE, y = TRUE)
    model_pN_val <- cph(Surv(זמן, מצב) ~ N, נתונים = 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)
    תוצאות <- data.frame(משתנה = 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(תוצאות) %>%
    tab_header(כותרת = "ביצועי חיזוי של שלוש מערכות השלב של בלוטות הלימפה") %>%
    cols_label(משתנה = "משתנה",Training_C_Index = "C-index (95% CI) (הדרכה)", Training_AIC = "AIC (הדרכה)", Training_BIC = "BIC (הדרכה)", Validation_C_Index = "C-index (95% CI) (אימות)", Validation_AIC = "AIC (אימות)", Validation_BIC = "BIC (אימות)")
    write.csv(תוצאות, "prediction_performance.csv", row.names = FALSE)
  4. השתמש בקוד הבא כדי לבנות מודל XGBoost וליצור גרפי עמודות של החשיבות היחסית של משתנים, ובכך להשוות את החשיבות של שלוש מערכות ה-LN. באופן דומה, צור עקומות ROC ועקומות כיול. הנתונים מתקבלים ממסד הנתונים של SEER.
    ספרייה (XGBOOST)
    ספרייה (סימן כניסה)
    ספרייה (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('Age', 'T', 'N', 'M', 'LODDS', 'Chemotherapy')]), label = train_data$status)
    test_matrix <- xgb. DMatrix(data = as.matrix(test_data[, c('Age', 'T', 'N', 'M', 'LODDS', 'Chemotherapy')]), label = test_data$status)
    params <- list(booster = "gbtree", objective = "binary:logistic", eval_metric = "auc", eta = 0.1, max_depth = 6, subsample = 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$status, pred_probs)
    auc_value <- AUC(roc_curve)
    ci_auc <- ci.auc(roc_curve)
    רגישות <- conf_matrix$byClass["רגישות"]
    ספציפיות <- conf_matrix$byClass["ספציפיות"]
    דיוק <- conf_matrix$בסך הכל["דיוק"]
    ppv <- conf_matrix$byClass["Pos Pred Value"]
    npv <- conf_matrix$byClass["Neg Pred Value"]
    result_table <- data.frame(Model = "XGBoost", AUC = sprintf("%.3f (%.3f-%.3f)", auc_value, ci_auc[1], ci_auc[3]), רגישות = sprintf("%.3f", רגישות), ספציפיות = sprintf("%.3f", ספציפיות), דיוק = sprintf("%.3f", דיוק), PPV = sprintf("%.3f", ppv), NPV = sprintf("%.3f", npv))
    write.csv(result_table, "xgboost_model_performance.csv", row.names = FALSE)
    roc_df <- data.frame(FPR = 1 - roc_curve$specificities, TPR = roc_curve$sensitivities)
    roc_plot <- ggplot(roc_df, aes(x = FPR, y = TPR)) +geom_line(צבע = "steelblue", גודל = 1.2) + geom_abline(יירוט = 0, שיפוע = 1, linetype = "מקווקו", צבע = "אפור") + ביאור("טקסט", x = 0.9, y = 0.2, תווית = הדבק("AUC =", עגול (auc_value, 3)), גודל = 5, צבע = "שחור") + labs(title = "עקומת ROC עבור מודל XGBoost", x = "שיעור חיובי כוזב", y = "שיעור חיובי אמיתי") + theme_minimal() + theme(panel.border = element_rect(צבע = "שחור", fill = NA, גודל = 1))
    calibration_data <- data.frame(סטטוס = as.factor(test_data$status), pred_probs = pred_probs)
    calib_model <- כיול (סטטוס ~ pred_probs, נתונים = calibration_data, מחלקה = "1", חתכים = 5)
    ggplot(calib_model$data, aes(x = נקודת אמצע, y = אחוז)) + geom_line(צבע = "steelblue", גודל = 1) + geom_point(צבע = "אדום", גודל = 2) + geom_abline(יירוט = 0, שיפוע = 1, linetype = "מקווקו", צבע = "שחור") +labs(title = "עקומת כיול למודל XGBoost", x = "הסתברות חזויה", y = "פרופורציה נצפית") + theme_minimal() + theme(panel.border = element_rect(צבע = "שחור", מילוי = NA, גודל = 0.5))
  5. השתמש בקוד הבא כדי לבנות מודל RF וליצור גרפי עמודות של החשיבות היחסית של משתנים, ובכך להשוות את החשיבות של שלוש מערכות ה-LN. באופן דומה, צור עקומות ROC ועקומות כיול. הנתונים מתקבלים מ-SEER database.library(randomForest)
    ספרייה (DPLYR)
    ספריה(ggplot2)
    ספרייה (pROC)
    ספרייה (סימן כניסה)
    ספרייה (RMS)
    Trainset <- read.csv("train_data.csv")
    נבדק <- read.csv("test_data.csv")
    trainset$status=factor(trainset$status)
    משתנים1 <- c("גיל", "T", "N", "M", "LODDS", "כימותרפיה")
    Trainset <- Trainset %>%
    מוטציה(לרוחב(all_of(משתנים1), as.numeric))
    testsed$status=factor(testsed$status)
    נבדק <- נבדק %>%
    מוטציה(לרוחב(all_of(משתנים1), as.numeric))
    RF=randomForest(trainset$status ~ גיל + T + N + M + LODDS + כימותרפיה, data=trainset,ntree=100,significance=TRUE,proximity=TRUE)
    imp=significance(RF)
    varImpPlot (RF)
    impvar=שמות שורות(imp)[סדר(imp[,4],יורד = TRUE)]
    importance_df <- as.data.frame(imp)
    importance_df$משתנים <- שמות שורות(importance_df)
    importance_plot <- ggplot(importance_df, aes(x = reorder(משתנים, MeanDecreaseAccuracy), y = MeanDecreaseAccuracy)) +geom_bar(stat = "זהות", fill = "steelblue") +coord_flip() + labs(title = "חשיבות משתנה", x = "משתנים", y = "דיוק ירידה ממוצע") + 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$specificities, y = roc_obj$רגישויות), צבע = "steelblue", גודל = 1.2) +geom_abline(יירוט = 0, שיפוע = 1, linetype = "מקווקו", צבע = "אפור") + ביאור("טקסט", x = 0.8, y = 0.2, תווית = הדבק("AUC =", עגול(auc_value, 3)), צבע = "שחור", גודל = 5, hjust = 0) + labs(title = "עקומת ROC עבור מודל יער אקראי", x = "שיעור חיובי כוזב", y = "שיעור חיובי אמיתי") +theme_minimal() + theme(panel.border = element_rect(צבע = "שחור", מילוי = NA, גודל = 1))
    calibration_data <- data.frame(pred_probs = pred_probs, status = testsed$status)
    calib_model <- כיול (סטטוס ~ pred_probs, נתונים = calibration_data, מחלקה = "1", חיתוכים = 5)
    calib_df <- as.data.frame(calib_model[["נתונים"]])
    calib_df$אמצע <- calib_df$נקודת אמצע
    calib_df אחוז < - calib_df אחוז
    calibration_plot <- ggplot(calib_df, aes(x = אמצע, y = אחוז)) + geom_line(צבע = "כחול פלדה", גודל = 1.2) + geom_point(צבע = "כחול פלדה", גודל = 3) + geom_abline(יירוט = 0, שיפוע = 1, סוג קו = "מקווקו", צבע = "שחור", גודל = 0.8) + מעבדות(כותרת = "עקומת כיול ליער אקראי", x = "הסתברות חזויה", y = "הסתברות בפועל") + theme_minimal() + נושא(panel.border = element_rect(צבע = "שחור", fill = NA, גודל = 1), plot.title = element_text(hjust = -0.05, vjust = -1.5, face = "מודגש", גודל = 12) )
    rf_probs <- predict(RF, newdata=tested, type="prob")[, 2]
    rf_auc <- roc(testsed$status, rf_probs)
    auc_value <- AUC(rf_auc)
    ci_auc <- ci.auc(rf_auc)
    rf_predictions <- לחזות (RF, newdata=tested)
    conf_matrix <- confusionMatrix(rf_predictions, testsed$status)
    רגישות <- conf_matrix$byClass["רגישות"]
    ספציפיות <- conf_matrix$byClass["ספציפיות"]
    דיוק <- conf_matrix$בסך הכל["דיוק"]
    ppv <- conf_matrix$byClass["Pos Pred Value"]
    npv <- conf_matrix$byClass["Neg Pred Value"]
    result_table <- data.frame(Model = "RF", AUC = sprintf("%.3f (%.3f-%.3f)", auc_value, ci_auc[1], ci_auc[3]), רגישות = sprintf("%.3f", רגישות), ספציפיות = sprintf("%.3f", ספציפיות), דיוק = sprintf("%.3f", דיוק), PPV = sprintf("%.3f", ppv), NPV = sprintf("%.3f", npv))
    write.csv(result_table, "RF_model_performance.csv", row.names = FALSE)
  6. השתמש בקוד הבא כדי לבנות מודל NN וליצור גרפי עמודות של החשיבות היחסית של משתנים, ובכך להשוות את החשיבות של שלוש מערכות ה-LN. באופן דומה, צור עקומות ROC ועקומות כיול. הנתונים מתקבלים מ-SEER database.library(nnet)
    ספרייה (סימן כניסה)
    ספרייה (pROC)
    ספריה(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)
    תכונות <- c ("גיל", "T", "N", "M", "LODDS", "כימותרפיה")
    x_train <- train_data[, תכונות]
    y_train <- train_data$status
    x_test <- test_data[, תכונות]
    y_test <- test_data$status
    nn_model <- nnet (סטטוס ~ גיל + T + N + M + LODDS + כימותרפיה, נתונים = train_data, גודל = 5, דעיכה = 0.01, מקסיט = 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)
    דיוק <- conf_matrix$בסך הכל["דיוק"]
    רגישות <- conf_matrix$byClass["רגישות"]
    ספציפיות <- conf_matrix$byClass["ספציפיות"]
    ppv <- conf_matrix$byClass["Pos Pred Value"]
    npv <- conf_matrix$byClass["Neg Pred Value"]
    performance_table <- data.frame(מטרי = c("AUC (95% CI)", "דיוק", "רגישות", "ספציפיות", "PPV", "NPV"),ערך = c(auc_text, עגול(דיוק, 3), עגול(רגישות, 3), עגול(ספציפיות, 3), עגול(ppv, 3), עגול(npv, 3)))
    write.csv(performance_table, "NN_performance_table.csv", row.names = FALSE)
    roc_curve <- roc(y_test, pred_probs)
    auc_value <- AUC(roc_curve)
    roc_plot <- ggplot() + geom_line(aes(x = 1 - roc_curve$specificities, y = roc_curve$רגישויות), צבע = "steelblue", גודל = 1.2) +geom_abline(יירוט = 0, שיפוע = 1, linetype = "מקווקו", צבע = "אפור") + ביאור("טקסט", x = 0.8, y = 0.2, תווית = הדבק("AUC =", עגול (auc_value, 3)), צבע = "שחור", גודל = 5, hjust = 0) + labs(title = "עקומת ROC עבור מודל רשת עצבית", x = "שיעור חיובי כוזב", y = "שיעור חיובי אמיתי") + theme_minimal() + theme(panel.border = element_rect(צבע = "שחור", מילוי = NA, גודל = 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 <- aggregate(status ~ calibration_bin, data = calibration_data, FUN = ממוצע)
    calibration_summary$pred_mean <- aggregate(pred_probs ~ calibration_bin, data = calibration_data, FUN = mean)$pred_probs
    calibration_plot <- ggplot(calibration_summary, aes(x = pred_mean, y = סטטוס)) + geom_line(צבע = "steelblue", גודל = 1.2) + geom_point(צבע = "אדום", גודל = 3) + geom_abline(יירוט = 0, שיפוע = 1, linetype = "מקווקו", צבע = "שחור", גודל = 0.8) + labs(title = "עקומת כיול לרשת עצבית", x = "הסתברות חזויה", y = "הסתברות בפועל") + theme_minimal() + theme(panel.border = element_rect(צבע = "שחור", fill = NA, גודל = 1))
    nn_var_importance <- varImp(nn_model)
    importance_df <- data.frame(תכונה = שמות שורות(nn_var_importance), חשיבות = nn_var_importance$כולל)
    importance_plot <- ggplot(importance_df, aes(x = reorder(תכונה, חשיבות), y = חשיבות)) + geom_bar(stat = "זהות", fill = "steelblue") + coord_flip() + labs(title = "חשיבות משתנה לרשת עצבית", x = "תכונות", y = "חשיבות") + theme_minimal()

3. פיתוח ואימות מודל סיכונים מתחרים

  1. השתמש בקוד הבא כדי לבצע ניתוח חד-משתני ולשרטט את עקומת פונקציית השכיחות המצטברת (CIF). data.csv הוא נתונים המתקבלים ממסד הנתונים של SEER. השיטה לשמירת התמונות הבאות תהיה זהה לשלב זה. החלף את האתר בקוד בזה אחר זה בגורמים אחרים כדי לבצע ניתוח חד משתני עבור כל הגורמים.
    ספרייה (tidycmprsk)
    ספרייה(gtSummary)
    ספריה(ggplot2)
    ספרייה (ggsurvfit)
    ספרייה (ggprism)
    aa <- read.csv("data.csv")
    cif2 <- tidycmprsk::cuminc(Surv(time, Status1) ~אתר, נתונים = aa)
    מסודר(CIF2,times = c(12,24,36,48,60))
    tbl_cuminc(cif2, times =c(12,24,36,48,60), תוצאות = c("CSS", "OSS"),estimate_fun = NULL, label_header = "**{time/12}-year cuminc**") %>%
    add_p() %>%
    add_n(מיקום = "רמה")
    cuminc_plot <- ggcuminc(cif2, result = c("CSS", "OSS"), גודל = 1.5) + labs(x = "זמן") +add_quantile(y_value = 0.20, גודל = 1) + scale_x_continuous(הפסקות = seq(0, 84, by = 12), גבולות = c(0, 84)) +scale_y_continuous(label = סולמות: :p ercent, הפסקות = 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(color = "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. השתמש בקוד הבא כדי לבצע ניתוח ותצוגה חזותית מרובי משתנים. data1.csv מגיע מהתוצאות של הקוד הקודם. לאחר הפעלת הקוד, לחץ על ייצוא, לאחר מכן לחץ על שמור כ-PDF, ולבסוף לחץ על שמור כדי לשמור את התמונה.
    ספרייה (tidycmprsk)
    ספרייה(gtSummary)
    aa <-read.csv('data1.csv')
    עבור (i בשמות(aa)[c(1:16, 19)]){aa[,i] <- as.factor(aa[,i])}
    mul1טבלה 2 < - 1% >%
    gtסיכום::tbl_regression(מעריך = TRUE) %>%
    add_n(מיקום = "רמה"); טבלה2
    table_df <- as_tibble(טבלה 2)
    כרטיסייה <- טבלה2$table_body
    tab1 <- tab[,c(12,19,20,22:29)]
  3. השתמש בקוד הבא כדי להתוות את הנומוגרמה, עקומת ה-ROC ועקומת הכיול. לאחר אימון המודל באמצעות נתונים מקבוצת האימון, השתמש בנתוני קבוצות האימות והאימות החיצוני כדי לאמת את model.library(QHScrnomo). נתוני העוקבה החיצונית מורכבים מדגימות של סרטן המעי הגס מלבד קרצינומה של תאי טבעת, שנבחרו בשלב 1.4.
    ספרייה (RMS)
    ספרייה (timeROC)
    ספריה(הישרדות)
    aa <-read.csv('data3.csv')
    עבור (i בשמות(aa)[c(1:16, 19)]){aa[,i] <- as.factor(aa[,i])}
    DD <- datadist(AA)
    options(datadist = "dd")
    mul <- cph(Surv(time, Status1 == 1) ~ T + N + M + LODDS + אתר, נתונים = 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("שכיחות מצטברת של CSS לשנה אחת","שכיחות מצטברת של CSS ל-3 שנים","שכיחות מצטברת של CSS ל-5 שנים"))
    time_points <- ג(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, "חודשים", sep = "_")
    roc_1year <- timeROC(T = aa$time, delta = ifelse(aa$Status1 == "CSS", 1, 0), סמן = pred_risks_df$risk_at_12_months, סיבה = 1, פעמים = 12, iid = TRUE)
    roc_3year <- timeROC(T = aa$time, delta = ifelse(aa$Status1 == "CSS", 1, 0), סמן = pred_risks_df$risk_at_36_months, סיבה = 1, פעמים = 36, iid = TRUE)
    roc_5year <- timeROC(T = aa$time, delta = ifelse(aa$Status1 == "CSS", 1, 0), סמן = pred_risks_df$risk_at_60_months, cause = 1,times = 60, iid = TRUE)
    legend("bottomright",legend = c("1 year CSS", "3 year CSS", "5 year CSS"), col = c("#BF1D2D", "#262626", "#397FC7"), lwd = 2)
    sas.cmprsk(m3,time = 36)
    סט.זרע(123)
    aa$pro <- tenf.crr(m3,time = 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 = "הסתברות חזויה ", ylab = "הסתברות בפועל", 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.

תוצאות

מאפייני המטופלים
מחקר זה התמקד בחולים שאובחנו עם SRCC במעי הגס, תוך שימוש בנתונים ממסד הנתונים של SEER המשתרעים על פני 2004 עד 2015. קריטריוני ההדרה כללו חולים עם זמן הישרדות של פחות מחודש, כאלה עם מידע קליני פתולוגי חלקי ומקרים שבהם סיבת המוות לא הייתה ברורה או לא מוגד...

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

Discussion

סרטן המעי הגס (CRC) SRCC הוא תת-סוג נדיר ומיוחד של סרטן המעי הגס עם פרוגנוזה גרועה. לכן, יש להקדיש תשומת לב רבה יותר לפרוגנוזה של חולי SRCC. חיזוי הישרדות מדויק עבור חולי SRCC הוא חיוני לקביעת הפרוגנוזה שלהם ולקבלת החלטות טיפול אישיות. במחקר זה, חקרנו את הקשר בין מאפיינים קליניים ו?...

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

Disclosures

למחברים אין ניגודי אינטרסים פיננסיים לחשוף.

Acknowledgements

ללא

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

Materials

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

References

  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.

Reprints and Permissions

Request permission to reuse the text or figures of this JoVE article

Request Permission

Explore More Articles

218

This article has been published

Video Coming Soon

JoVE Logo

Privacy

Terms of Use

Policies

Research

Education

ABOUT JoVE

Copyright © 2025 MyJoVE Corporation. All rights reserved