JoVE Logo

サインイン

このコンテンツを視聴するには、JoVE 購読が必要です。 サインイン又は無料トライアルを申し込む。

この記事について

  • 要約
  • 要約
  • 概要
  • プロトコル
  • 結果
  • ディスカッション
  • 開示事項
  • 謝辞
  • 資料
  • 参考文献
  • 転載および許可

要約

この研究では、機械学習モデルと競合するリスク分析を使用して、結腸直腸記号リング細胞癌患者の予後システムを評価します。これは、pN病期分類と比較して優れた予測因子として陽性リンパ節の対数オッズを特定し、強力な予測パフォーマンスを示し、堅牢な生存予測ツールを通じて臨床上の意思決定を支援します。

要約

リンパ節の状態は、患者にとって重要な予後予測因子です。しかし、結腸直腸標識リング細胞がん(SRCC)の予後については、あまり注目されていません。この研究では、機械学習モデル (Random Forest、XGBoost、Neural Network) と競合するリスク モデルを使用して、SRCC 患者における陽性リンパ節 (LODDS)、リンパ節比 (LNR)、および pN 病期分類の対数オッズの予後予測能力を調査します。関連データは、Surveillance, Epidemiology, and End Results(SEER)データベースから抽出した。機械学習モデルでは、単変量および多変量Cox回帰分析を通じてがん特異的生存(CSS)の予後因子を特定し、その後、XGBoost、RF、NNの3つの機械学習手法を適用して、最適なリンパ節病期分類システムを確認しました。競合リスクモデルでは、予後因子を特定するために単変量および多変量競合リスク分析が採用され、SRCC患者の予後を予測するためにノモグラムが構築された。レシーバー動作特性曲線(AUC-ROC)および較正曲線の下の面積は、モデルのパフォーマンスを評価するために利用されました。この研究には、合計2,409人のSRCC患者が含まれていました。モデルの有効性を検証するために、SRCC症例を除く15,122人の結腸直腸がん患者の追加コホートを外部検証に含めました。機械学習モデルと競合するリスクノモグラムは、生存結果の予測において優れたパフォーマンスを示しました。pN病期分類と比較して、LODDS病期分類システムは優れた予後能力を示しました。評価の結果、機械学習モデルと競合するリスクモデルは、優れた識別、キャリブレーション、および解釈可能性を特徴とする優れた予測パフォーマンスを達成しました。私たちの調査結果は、患者の臨床的意思決定に情報を提供するのに役立つ可能性があります。

概要

結腸直腸癌(CRC)は、世界で3番目に多い悪性腫瘍としてランク付けされています1,2,3。印環細胞がん(SRCC)は、CRCのまれな亜型であり、症例の約1%を占め、細胞核1,2,4を置換する細胞内ムチンが豊富にあることを特徴としています。SRCCは、若年患者と関連していることが多く、女性の有病率が高く、診断時の腫瘍病期が進行しています。結腸直腸腺癌と比較して、SRCCは分化が不十分で、遠隔転移のリスクが高く、5年生存率はわずか12%〜20%です5,6。SRCCの正確で効果的な予後モデルを開発することは、治療戦略を最適化し、臨床転帰を改善するために重要です。

この研究は、機械学習 (ML) や競合するリスク モデルなどの高度な統計的アプローチを使用して、SRCC 患者の堅牢な予後モデルを構築することを目的としています。これらの方法論は、臨床データの複雑な関係に対応でき、個別のリスク評価を提供し、予測精度で従来の方法を凌駕します。Random Forest、XGBoost、Neural Networksなどの機械学習モデルは、高次元データの処理と複雑なパターンの識別に優れています。研究によると、AIモデルは結腸直腸がんの生存転帰を効果的に予測し、臨床応用におけるMLの可能性を強調しています7,8。MLを補完する競合するリスクモデルは、がん特異的な死亡率と他の死因など、複数のイベントタイプに対処し、生存分析を改善します。Kaplan-Meier推定量のような従来の方法とは異なり、競合するリスクモデルは、競合するリスクが存在する場合の事象の限界確率を正確に推定し、より正確な生存評価を提供する8。MLと競合するリスク分析を統合することで、予測パフォーマンスが向上し、SRCC 9,10,11のパーソナライズされた予後ツールの強力なフレームワークが提供されます。

リンパ節転移は、CRC患者の予後と再発に大きく影響します。TNM分類におけるNステージ評価は重要ですが、不十分なリンパ節検査(症例の48%〜63%で報告されています)は、疾患の過小評価につながる可能性があります。これに対処するために、リンパ節比(LNR)や陽性リンパ節の対数オッズ(LODDS)などの代替アプローチが導入されています。LNRは、陽性リンパ節(PLN)と全リンパ節(TLN)の比率であり、TLN数の影響を受けにくく、CRCの予後因子として機能します。LODDSは、PLNと陰性リンパ節(NLN)の対数比であり、胃SRCCと結腸直腸癌の両方で優れた予測能力を示しています10,11。機械学習は腫瘍学でますます適用されており、モデルは乳がん、前立腺がん、肺がんなどのさまざまながんのリスク層別化と予後予測を改善しています12,13,14。ただし、結腸直腸SRCCへの適用は依然として限られています。

この研究では、LODDSをMLおよび競合するリスクモデルと統合して包括的な予後ツールを作成することにより、このギャップを埋めることを目指しています。この研究は、LODDSの予後的価値を評価し、高度な予測技術を活用することにより、SRCC患者の臨床的意思決定を強化し、転帰を改善することを目的としています。

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

プロトコル

この研究は、倫理的な承認と参加の同意を指すものではありません。この研究で使用されたデータは、データベースから取得されました。2004年から2015年に結腸直腸標識リング細胞がんと診断された患者、および他の種類の結腸直腸がんの患者を含めました。除外基準は、生存期間が1ヵ月未満の患者、臨床病理学的情報が不完全な患者、死因が不明または特定されていない症例であった。

1. データ取得

  1. SEERをダウンロードします。SEERデータベースWebサイト(http://seer.cancer.gov/about/overview.html)から統計8.4.3ソフトウェアを入手します。ソフトウェアにログインした後、[Case List Session] >データと 発生 率SEERリサーチプラスデータ、17レジストリ、2021年11月サブ(2000-2019)データベースを選択します。
  2. [選択] > [編集] をクリックし、{人種、性別、年、Dx. 診断年} = '2004', '2005', '2006', '2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015' AND {サイトと形態を選択します。サイト再コードICD-O-3 / WHO 2008} = '8490/3'
  3. 次に、[ テーブル]をクリックし、使用可能な変数インターフェイスで、[ 単一の年齢と100+の年齢再コード]、[性別]、[婚姻]、[サイト再コードICD-O-3 / WHO 2008]、[CS腫瘍サイズ]、[地域nodes_examined(1988+)]、[地域nodes_positive(1988+)]、[派生AJCCステージグループ、第6版(2004-2015)]、[派生AJCC T、第6版(2004-2015)]、[派生AJCC M]、[ 第6版(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 を繰り返して臨床病理情報を取得し、{Site and Morphology を持つサンプルを除外します。ダウンロードしたファイルからICD-O-3/WHO 2008} = '8490/3'をサイト再コードします。
  6. 比較のために、いくつかの変数を処理します。リンパ節比(LNR)と陽性リンパ節のオッズの対数(LODDS)の両方を使用して、リンパ節の状態を分類します。
    1. LNRは、陽性リンパ節(PLN)と全リンパ節(TLN)の比率として定義します。次の式を使用して LODDS 値を計算します。
      loge(PLNの数 + 0.5) / (陰性リンパ節(NLN)の数 + 0.5)
      ここで、0.5 は無限の結果を防ぐために追加されました。LNR、LODDS、および腫瘍サイズのカットオフ値は、最小P値法に基づいてX-tileソフトウェア(バージョン3.6.1)を使用して決定されました。
  7. X-tileソフトウェアを開き、[ ファイル]>[開く]をクリックし、データファイルを選択してソフトウェアにインポートします。データが読み込まれたら、変数をマッピングします: Censor は生存状態に対応し、Survival time は生存時間に対応し、marker1 は分析対象の変数で、データが正しく一致することを確認します。
  8. 次に、「 Do > Kaplan-Meier > Marker1 」をクリックして、Kaplan-Meier生存分析を実行し、生存曲線を生成します。Kaplan-Meier生存曲線の分離、統計的有意性(p値など)、および臨床的関連性に基づいて、最適なカットオフ値を決定し、最終的に分析結果を記録またはエクスポートします。
    1. LNRをLNR 1(≤0.16)、LNR 2(0.16 - 0.78)、LNR 3(≥ 0.78)の3つのグループに分けます。LODDS に基づいて、患者を LODDS 1 (≤ -1.44)、LODDS 2 (-1.44 - 0.86)、LODDS 3 (≥ 0.86) の 3 つのグループに分類します。
    2. 腫瘍のサイズを 3.5 cm ≤、3.5 - 5.5 cm、5.5 cm ≥ の 3 つのカテゴリに分類します。年齢を連続変数からカテゴリ変数に変換します。初期診断時の患者の年齢を≥60歳と<60歳に分類します。印環細胞がん(SRCC)腫瘍の分布に基づいて、腫瘍の位置を右結腸、左結腸、および直腸に分類します。右結腸には、盲腸、上行結腸、肝屈曲、横行結腸が含まれ、左結腸には、脾屈、下行結腸、S状結腸、および直腸S状結腸が含まれます。
  9. この研究では、SRCC を使用して合計 2409 人の適格な患者データを、トレーニング コホート (N = 1686) と検証コホート (N = 723) に 7:3 の比率でランダムに割り当てます。ランダム分割と SEER データベースからのソースdata.csvには、次のコードを使用します。ランダム分割後に生成されたファイルは、さらなる分析に使用されます。
    図書室(キャレット)
    データ<-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スクリプト ]を選択して、新しいRプログラミングインターフェイスを作成します。コードエディタで関連するコードを入力し、[ 実行 ]をクリックしてコードを実行します。
  2. 次のコードを使用して、Cox 回帰分析によって ML モデルに含まれる変数をスクリーニングします。さらに、SRCC患者のがん特異的生存期間(CSS)に対するLODDS、LNR、およびpN病期分類の影響を調査します。traindata.csvは、SEERデータベースから取得したデータです。
    library("サバイバル")
    ライブラリ("survminer")
    ライブラリ("rms")
    ライブラリ("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","放射線", "化学療法", "サイト")
    data <- data %>%
    mutate(across(all_of(変数), as.factor))
    cox=coxph(Surv(時間, ステータス) ~ data$T, data = data)
    cox$coefficients
    pval=anova(cox)$Pr[2]
    clean_data=データ[,c(1:12, 14:18)]
    get_coxVariable=関数(your_data,インデックス){cox_list=c() k=1
    for (i in 1:index) {mod=coxph(Surv(time, status) ~ your_data[,i],data=your_data) pval=anova(mod)$Pr[2] print:pval) print(your_data)[i]) if ) (pval<0.05) {cox_list[k]=colnames(your_data)[i] k=k+1}}returncox_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(時間, ステータス) ~", var)))cox_model <- coxph)(formula, data = data) print(summary)cox_model))
    GGフォレスト(COX)
    変数 <- c("性別", "年齢", "人種", "夫婦", "ステージ", "T", "N", "M", "Tumor_size", "LNR", "LODDS", "化学療法")
    data <- data %>%
    mutate(across(all_of(変数), as.factor))
    cox=coxph(Surv(時間, ステータス) ~ 性別+年齢+人種+婚姻+T+N+M+Tumor_size+LNR+
    LODDS+化学療法、データ=データ)
    ggforest(cox,data = data)
    ggplot_forest <- ggforest(cox, data = data)
  3. 次のコードを使用して、トレーニング、検証、および外部検証のコホート間で 3 つの LN システム (LODDS、LNR、pN ステージング) の予後予測能力を比較します。
    図書館(RMS)
    図書館(サバイバル)
    図書館(survminer)
    ライブラリ(riskRegression)
    ライブラリ(GT)
    train_data <- read.csv(以下「train_data123.csv」)
    validation_data <- read.csv(以下「test_data123.csv」)
    DD <- データディスト(train_data)
    options(datadist = "dd")
    model_LNR <- cph(Surv(時間, ステータス) ~ LNR, data = train_data, x = TRUE, y = TRUE)
    model_LODDS <- cph(Surv(時間, status) ~ LODDS, データ = train_data, x = TRUE, y = TRUE)
    model_pN <- cph(Surv(時間, ステータス) ~ N, データ = train_data, x = TRUE, y = TRUE)
    calculate_performance <- function(model, data) {pred <- predict(model, newdata = data) c_index_result <- concordance(Surv(data$time, data$status) ~ pred) c_index <- c_index_result$concordance aic <- AIC(model) bic <- BIC(model) return)c) c(C_index = round(c_index, 3), AIC = round(aic) 2)、BIC = round%(bic% 2))}
    calculate_performance <- function(model, data) {pred <- predict(model, newdata = data, type = "lp") concordance_result <- concordancefit(Surv(data$time, data$status), x = pred) c_index <- concordance_result$concordance ci_lower <- c_index - 1.96 * sqrt(concordance_result$var) ci_upper <- c_index + 1.96 * sqrt(concordance_result$var) AIC <- AIC(model) bic <- BIC(model) return(c(C_Index = round(c_index, 3), CI_Lower = 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(train_data年、model_pN年)
    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(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(結果) %>%
    tab_header(title = "3つのリンパ節の病期分類システムの予測性能") %>%
    cols_label(変数 = "変数",Training_C_Index = "C-index (95% CI) (Training)", Training_AIC = "AIC (Training)", Training_BIC = "BIC (Training)", Validation_C_Index = "C-index (95% CI) (Validation)", Validation_AIC = "AIC (Validation)", Validation_BIC = "BIC (Validation)")
    write.csv(results, "prediction_performance.csv", row.names = FALSE)
  4. 次のコードを使用して XGBoost モデルを作成し、変数の相対的な重要度の棒グラフを生成することで、3 つの 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$overall["精度"]
    ppv <- conf_matrix$byClass["位置予測値"]
    npv <- conf_matrix$byClass["負の予測値"]
    result_table <- data.frame(モデル = "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(color = "steelblue", size = 1.2) + geom_abline(intercept = 0, slope = 1, linetype = "破線", color = "gray") + annotate("text", x = 0.9, y = 0.2, label = paste("AUC =", round(auc_value, 3)), size = 5, color = "黒") + labs(title = "XGBoost モデルのROC曲線", x = "偽陽性率", y = "真陽性率") + theme_minimal() + theme(panel.border = element_rect(color = "黒", fill = NA, size = 1))
    calibration_data <- data.frame(Status = 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(color = "steelblue", size = 1) + geom_point(color = "red", size = 2) + geom_abline(切片 = 0, 傾き = 1, 線種 = "破線", color = "黒") +labs(title = "XGBoost モデルの検量線", x = "予測確率", y = "観測された比率") + theme_minimal() + theme(panel.border = element_rect(color = "黒", fill = NA, size = 0.5))
  5. 次のコードを使用して RF モデルを作成し、変数の相対的な重要度の棒グラフを生成して、3 つの LN システムの重要度を比較します。同様に、ROC曲線と検量線を生成します。データはSEERデータベースから取得されます.library(randomForest)
    図書室(dplyr)
    ライブラリ(ggplot2)
    図書館(pROC)
    図書室(キャレット)
    図書館(RMS)
    トレインセット<-read.csv(以下「train_data.csv」)
    テスト済み <- read.csv(以下「test_data.csv」)
    trainset$status=factor(トレインセット$status)
    変数1 <- c("年齢", "T", "N", "M", "LODDS", "化学療法")
    トレインセット <- トレインセット %>%
    mutate(across(all_of(変数1), as.numeric))
    testsed$status=factor(テストされた$status)
    テスト済み <- テスト済み %>%
    mutate(across(all_of(変数1), as.numeric))
    RF=randomForest(trainset$status ~ 年齢 + T + N + M + LODDS + 化学療法, data=trainset,ntree=100,importance=TRUE,proximity=TRUE)
    imp=重要度(RF)
    変数インププロット(RF)
    impvar=rownames(imp)[order(imp[,4],decreasing = TRUE〕
    importance_df <- as.data.frame(imp)
    importance_df$Variables <- rownames(importance_df)
    importance_plot <- ggplot(importance_df, aes(x = reorder(Variables, MeanDecreaseAccuracy), y = MeanDecreaseAccuracy)) +geom_bar(stat = "identity", 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$sensitivities), color = "steelblue", size = 1.2) +geom_abline(intercept = 0, slope = 1, linetype = "破線", 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 = "ランダムフォレストモデルのROC曲線", x = "偽陽性率", y = "真陽性率") +theme_minimal() + theme(panel.border = element_rect(color = "黒", fill = NA, size = 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$mid <- calib_df$midpoint
    calib_df$パーセント <- calib_df$パーセント
    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 = "破線", color = "黒", size = 0.8) + labs(title = "ランダムフォレストの検量線", x = "予測確率", y = "実際の確率") + theme_minimal() + theme(panel.border = element_rect(color = "黒", 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(テスト済み$status, rf_probs)
    auc_value <- AUC(rf_auc)
    ci_auc <- CI.AUC(rf_auc)
    rf_predictions <- predict(RF, newdata=testsed)
    conf_matrix <- confusionMatrix(rf_predictions, testsed$status)
    感度 <- conf_matrix$byClass["感度"]
    特異度 <- conf_matrix$byClass["特異度"]
    精度 <- conf_matrix$overall["精度"]
    ppv <- conf_matrix$byClass["位置予測値"]
    npv <- conf_matrix$byClass["負の予測値"]
    result_table <- data.frame(モデル = "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 モデルを作成し、変数の相対的な重要度の棒グラフを生成して、3 つの LN システムの重要度を比較します。同様に、ROC曲線と検量線を生成します。データは SEER データベースから取得されます。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(数値(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$overall["精度"]
    感度 <- conf_matrix$byClass["感度"]
    特異度 <- conf_matrix$byClass["特異度"]
    ppv <- conf_matrix$byClass["位置予測値"]
    npv <- conf_matrix$byClass["負の予測値"]
    performance_table <- data.frame(Metric = c("AUC (95% CI)", "Accuracy", "Sensitivity", "Specificity", "PPV", "NPV"),Value = c(auc_text, round(精度, 3), round(感度, 3), round(特異度, 3), round(ppv, 3), round(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$sensitivities), color = "steelblue", size = 1.2) +geom_abline(intercept = 0, slope = 1, linetype = "破線", 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 = "ニューラルネットワークモデルのROC曲線", x = "偽陽性率", y = "真陽性率") + theme_minimal() + theme(panel.border = element_rect(color = "black", fill = NA, size = 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 <集計(ステータス~calibration_bin、データ=calibration_data、FUN=平均)
    calibration_summary$pred_mean <- 集計(pred_probs ~ calibration_bin, データ = calibration_data, FUN = 平均)$pred_probs
    calibration_plot <- ggplot(calibration_summary, aes(x = pred_mean, y = status)) + geom_line(color = "steelblue", size = 1.2) + geom_point(color = "red", size = 3) + geom_abline(intercept = 0, slope = 1, linetype = "破線", color = "黒", size = 0.8) + labs(title = "ニューラルネットワークの検量線", x = "予測確率", y = "実際の確率") + theme_minimal() + theme(panel.border = element_rect(color = "黒", fill = NA, size = 1))
    nn_var_importance <- varImp(nn_model)
    importance_df <- data.frame(Feature = rownames(nn_var_importance), 重要度 = nn_var_importance$Overall )
    importance_plot <- ggplot(importance_df, aes(x = reorder(Feature, Importance), y = Importance)) + geom_bar(stat = "identity", fill = "steelblue") + coord_flip() + labs(title = "ニューラルネットワークの変数重要度", x = "特徴", y = "重要度") + theme_minimal()

3. 競合リスクモデルの開発・検証

  1. 次のコードを使用して、単変量解析を実行し、累積罹患率関数 (CIF) 曲線をプロットします。data.csvは、SEERデータベースから取得したデータです。後続の画像を保存する方法は、この手順と同じです。コード内の Site を 1 つずつ他のファクターに置き換えて、すべてのファクターに対して単変量解析を実行します。
    図書館(tidycmprsk)
    ライブラリ(gtsummary)
    ライブラリ(ggplot2)
    図書室(ggsurvfit)
    図書館(GGPRISM)
    AA <- read.csv(「data.csv」)
    cif2 <- tidycmprsk::cuminc(Surv(time, Status1) ~Site, data = aa)
    tidy(cif2,times = c(12,24,36,48,60))
    tbl_cuminc(cif2, times =c(12,24,36,48,60), outcomes = c("CSS", "OSS"),estimate_fun = NULL, label_header = "**{time/12}-year cuminc**") %>%
    add_p() %>%
    add_n(location = "レベル")
    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(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')
    for (i in names(aa)[c(1:16, 19)]){aa[,i] <- as.factor(aa[,i])}
    mul1表2 <- mul1 %>%
    gtsummary::tbl_regression(指数 = TRUE) %>%
    add_n(location = "レベル");テーブル 2
    table_df <- as_tibble(表2)
    タブ<-テーブル2$table_body
    タブ1 <- タブ[,C(12,19,20,22:29)]
  3. 次のコードを使用して、ノモグラム、ROC曲線、および検量線をプロットします。トレーニング コホートのデータを使用してモデルをトレーニングした後、検証コホートと外部検証コホートのデータを使用して model.library(QHScrnomo) を検証します。外部コホートデータは、ステップ1.4で選択した環状細胞がん以外の結腸直腸がんのサンプルで構成されています。
    図書館(RMS)
    図書館(timeROC)
    図書館(サバイバル)
    aa <-read.csv('data3.csv')
    for (i in names(aa)[c(1:16, 19)]){aa[,i] <- as.factor(aa[,i])}
    DD <- データディスト(AA)
    options(datadist = "dd")
    mul <- cph(Surv(time, 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"),サイト=
    c("RSC","LSC","直腸")))
    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-year CSS Cumulative Incidence","3-year CSS Cumulative Incidence","5-year CSS Cumulative Incidence"))
    time_points <-C(12, 36, 60)
    pred_risks_list <- lapply(time_points, function(time_point) {predict(m3, newdata = aa, type = "risk", time = time_point)})
    pred_risks_df <- data.frame(do.call(cbind, pred_risks_list))
    colnames(pred_risks_df) <- paste("risk_at", time_points, "months", sep = "_")
    roc_1year <- timeROC(T = aa$time, delta = ifelse(aa$Status1 == "CSS", 1, 0), marker = pred_risks_df$risk_at_12_months, cause = 1, times = 12, iid = TRUE)
    roc_3year <- timeROC(T = aa$time, delta = ifelse(aa$Status1 == "CSS", 1, 0), marker = pred_risks_df$risk_at_36_months, cause = 1, times = 36, iid = TRUE)
    roc_5year <- timeROC(T = aa$time, delta = ifelse(aa$Status1 == "CSS", 1, 0), marker = pred_risks_df$risk_at_60_months, cause = 1,times = 60, iid = TRUE)
    legend("bottomright",legend = c("1 年間の CSS", "3 年間の CSS", "5 年間の CSS"), col = c("#BF1D2D", "#262626", "#397FC7"), lwd = 2)
    sas.cmprsk(m3,時間 = 36)
    セットシード(123)
    aa$pro <- tenf.crr(m3,時間 = 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), add =TRUE)

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

結果

患者の特性
この研究は、2004 年から 2015 年までの SEER データベースのデータを使用して、結腸直腸 SRCC と診断された患者に焦点を当てました。除外基準は、生存期間が1ヵ月未満の患者、臨床病理学的情報が不完全な患者、死因が不明または特定されていない症例であった。選択基準を満たした合計2409人の結腸直腸SRCC患者が、トレーニングコホート(N =...

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

ディスカッション

結腸直腸癌(CRC)SRCCは、予後不良の結腸直腸癌のまれで特別なサブタイプです。したがって、SRCC患者の予後には、より一層の注意を払う必要があります。SRCC患者の正確な生存予測は、患者の予後を判断し、個別の治療決定を下すために重要です。本研究では、SRCC患者における臨床的特徴と予後との関連を検討し、SEERデータベースからSRCC患者に最適なLN病期分類シス?...

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

開示事項

著者には、開示すべき金銭的な利益相反はありません。

謝辞

何一つ

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

資料

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

参考文献

  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.

転載および許可

このJoVE論文のテキスト又は図を再利用するための許可を申請します

許可を申請

さらに記事を探す

This article has been published

Video Coming Soon

JoVE Logo

個人情報保護方針

利用規約

一般データ保護規則

研究

教育

JoVEについて

Copyright © 2023 MyJoVE Corporation. All rights reserved