JoVE Logo

Oturum Aç

Bu içeriği görüntülemek için JoVE aboneliği gereklidir. Oturum açın veya ücretsiz deneme sürümünü başlatın.

Bu Makalede

  • Özet
  • Özet
  • Giriş
  • Protokol
  • Sonuçlar
  • Tartışmalar
  • Açıklamalar
  • Teşekkürler
  • Malzemeler
  • Referanslar
  • Yeniden Basımlar ve İzinler

Özet

Bu çalışma, kolorektal taşlı yüzük hücreli karsinom hastaları için prognostik sistemleri, makine öğrenmesi modelleri ve rakip risk analizleri kullanarak değerlendirmektedir. Pozitif lenf nodlarının log oranlarını, pN evrelemesine kıyasla üstün bir öngörücü olarak tanımlar, güçlü öngörücü performans gösterir ve sağlam sağkalım tahmin araçları aracılığıyla klinik karar vermeye yardımcı olur.

Özet

Lenf nodu durumu hastalar için kritik bir prognostik belirleyicidir; bununla birlikte, kolorektal taşlı yüzük hücreli karsinomun (SRCC) prognozu sınırlı dikkat çekmiştir. Bu çalışma, rakip risk modellerinin yanı sıra makine öğrenimi modelleri (Random Forest, XGBoost ve Neural Network) kullanarak SRCC hastalarında pozitif lenf nodlarının log oranları (LODDS), lenf nodu oranı (LNR) ve pN evrelemesinin prognostik prediktif kapasitesini araştırmaktadır. İlgili veriler Sürveyans, Epidemiyoloji ve Son Sonuçlar (SEER) veri tabanından çıkarıldı. Makine öğrenimi modelleri için, kansere özgü sağkalım (CSS) için prognostik faktörler, tek değişkenli ve çok değişkenli Cox regresyon analizleri yoluyla belirlendi ve ardından optimal lenf nodu evreleme sistemini belirlemek için üç makine öğrenimi yönteminin (XGBoost, RF ve NN) uygulanması izledi. Rakip risk modelinde, prognostik faktörleri belirlemek için tek değişkenli ve çok değişkenli rakip risk analizleri kullanıldı ve SRCC hastalarının prognozunu tahmin etmek için bir nomogram oluşturuldu. Modelin performansını değerlendirmek için alıcı çalışma karakteristik eğrisi (AUC-ROC) ve kalibrasyon eğrileri altındaki alan kullanılmıştır. Bu çalışmaya toplam 2.409 SRCC hastası dahil edildi. Modelin etkinliğini doğrulamak için, SRCC vakaları hariç, 15.122 kolorektal kanser hastasından oluşan ek bir kohort, harici doğrulama için dahil edildi. Hem makine öğrenimi modelleri hem de rekabet eden risk nomogramı, hayatta kalma sonuçlarını tahmin etmede güçlü performans sergiledi. pN evrelemesi ile karşılaştırıldığında, LODDS evreleme sistemleri üstün prognostik yetenek göstermiştir. Değerlendirmenin ardından, makine öğrenimi modelleri ve rakip risk modelleri, iyi ayrımcılık, kalibrasyon ve yorumlanabilirlik ile karakterize edilen mükemmel tahmin performansı elde etti. Bulgularımız, hastalar için klinik karar verme sürecini bilgilendirmede yardımcı olabilir.

Giriş

Kolorektal kanser (KRK) dünya çapında en sık görülen üçüncü malign tümör olarak yer almaktadır 1,2,3. KRK'nın nadir bir alt tipi olan taşlı yüzük hücreli karsinom (SRCC), olguların yaklaşık %1'ini oluşturur ve hücre çekirdeğinin yerini alan bol miktarda hücre içi müsin ile karakterize 1,2,4. SRCC genellikle genç hastalarla ilişkilidir, kadınlarda daha yüksek prevalansa sahiptir ve tanı sırasında ileri tümör evrelerine sahiptir. Kolorektal adenokarsinom ile karşılaştırıldığında, SRCC daha kötü farklılaşma, daha yüksek uzak metastaz riski ve 5 yıllık sağkalım oranı sadece %12-%20 arasındadır5,6. SRCC için doğru ve etkili bir prognostik model geliştirmek, tedavi stratejilerini optimize etmek ve klinik sonuçları iyileştirmek için çok önemlidir.

Bu çalışma, makine öğrenimi (ML) ve rakip risk modelleri dahil olmak üzere gelişmiş istatistiksel yaklaşımlar kullanarak SRCC hastaları için sağlam bir prognostik model oluşturmayı amaçlamaktadır. Bu metodolojiler, klinik verilerdeki karmaşık ilişkileri barındırabilir, kişiselleştirilmiş risk değerlendirmeleri sunabilir ve tahmine dayalı doğrulukta geleneksel yöntemleri geride bırakabilir. Rastgele Orman, XGBoost ve Sinir Ağları gibi makine öğrenimi modelleri, yüksek boyutlu verileri işlemede ve karmaşık kalıpları belirlemede mükemmeldir. Çalışmalar, yapay zeka modellerinin kolorektal kanserde sağkalım sonuçlarını etkili bir şekilde tahmin ettiğini ve makine öğreniminin klinik uygulamalardaki potansiyelini vurguladığını göstermiştir 7,8. Makine öğrenimini tamamlayan rakip risk modelleri, sağkalım analizini iyileştirmek için kansere özgü ölüm oranı ve diğer ölüm nedenleri gibi birden fazla olay türünü ele alır. Kaplan-Meier tahmincisi gibi geleneksel yöntemlerin aksine, rekabet eden risk modelleri, rekabet eden risklerin varlığında olayların marjinal olasılığını doğru bir şekilde tahmin ederek daha kesin hayatta kalma değerlendirmeleri sağlar8. Makine öğrenimi ve rekabet eden risk analizini entegre etmek, SRCC 9,10,11'de kişiselleştirilmiş prognostik araçlar için güçlü bir çerçeve sunarak tahmine dayalı performansı artırır.

Lenf nodu metastazı KRK hastalarında prognozu ve nüksü önemli ölçüde etkiler. TNM sınıflamasında N evresi değerlendirmesi kritik öneme sahip olsa da, yetersiz lenf nodu muayenesi - vakaların %48-63'ünde bildirilmiştir - hastalığın hafife alınmasına yol açabilir. Bunu ele almak için, lenf nodu oranı (LNR) ve pozitif lenf nodlarının log oranları (LODDS) gibi alternatif yaklaşımlar tanıtılmıştır. Pozitif lenf nodlarının (PLN) toplam lenf nodlarına (TLN) oranı olan LNR, TLN sayısından daha az etkilenir ve KRK'de prognostik bir faktör olarak görev yapar. PLN'lerin negatif lenf nodlarına (NLN'ler) logaritmik oranı olan LODDS, hem mide SRCC'sinde hem de kolorektal kanserde üstün prediktif yetenek göstermiştir10,11. Makine öğrenimi, meme, prostat ve akciğer kanserleri dahil olmak üzere çeşitli kanserlerde risk sınıflandırmasını ve prognostik tahminleri iyileştiren modellerle onkolojide giderek daha fazla uygulanmaktadır 12,13,14. Bununla birlikte, kolorektal SRCC'deki uygulaması sınırlı kalmaktadır.

Bu çalışma, kapsamlı bir prognostik araç oluşturmak için LODDS'yi makine öğrenimi ve rakip risk modelleriyle entegre ederek bu boşluğu doldurmayı amaçlamaktadır. Bu araştırma, LODDS'nin prognostik değerini değerlendirerek ve gelişmiş öngörücü tekniklerden yararlanarak, SRCC hastaları için klinik karar vermeyi geliştirmeyi ve sonuçları iyileştirmeyi amaçlamaktadır.

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

Protokol

Bu çalışma, etik onay ve katılım rızasına atıfta bulunmamaktadır. Bu çalışmada kullanılan veriler veri tabanlarından elde edilmiştir. 2004-2015 yılları arasında kolorektal taşlı yüzük hücreli karsinom ve diğer kolorektal kanser türleri tanısı alan hastaları dahil ettik. Dışlama kriterleri, sağkalım süresi bir aydan az olan hastaları, eksik klinikopatolojik bilgisi olanları ve ölüm nedeninin belirsiz veya belirtilmemiş olduğu vakaları içeriyordu.

1. Veri toplama

  1. SEER'i indirin. İstatistik 8.4.3 yazılımını SEER veritabanı web sitesinden (http://seer.cancer.gov/about/overview.html) edinin. Yazılıma giriş yaptıktan sonra Vaka Listesi Oturumu > Veriler ve Insidence SEER Research Plus Data, 17 Registries, Nov 2021 Sub (2000-2019) veritabanını seçin.
  2. Düzenle > Seçim'e tıklayın ve {Irk, Cinsiyet, Yıl Dx. Tanı yılı} = '2004', '2005', '2006', '2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015' VE {Site ve Morfoloji. Site yeniden kodlaması ICD-O-3/WHO 2008} = '8490/3'.
  3. Ardından Tablo'ya tıklayın ve mevcut değişkenler arayüzünde, Tek yaş ve 100+ ile yaş yeniden kodlama, Cinsiyet, Evlilik, Site yeniden kodlaması ICD-O-3/WHO 2008, CS tümör boyutu, Bölgesel nodes_examined(1988+), Bölgesel nodes_positive(1988+), Türetilmiş AJCC Aşama Grubu, 6. baskı (2004-2015), Türetilmiş AJCC T, 6. baskı (2004-2015), Türetilmiş AJCC N, 6. baskı (2004-2015), Türetilmiş AJCC M, 6. baskı (2004-2015), CEA, Radyasyon kodlaması, Kemoterapi yeniden kodlaması (evet, hayır/unk), SEER nedene özgü ölüm sınıflandırması, Hayati durum yeniden kodlaması (kullanılan çalışma kesimi), Sağkalım ayları, Tanı yılı.
  4. Son olarak, Çıktı'ya tıklayın, verileri adlandırın ve verilerin çıktısını almak ve kaydetmek için Yürüt'e tıklayın. Ayrıntılı dahil etme süreci Şekil 1'de gösterilmektedir.
  5. Daha sonraki harici doğrulama için SRCC vakaları hariç kolorektal kanser hastalarından alınan verileri indirin. Düzenle'> Seçim'e tıklayın ve {Irk, Cinsiyet, Yıl Dx. Tanı yılı} = '2004', '2005', '2006', '2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015' VE {Birincil Site - etiketli} = 'C18-C20'. Klinik patolojik bilgi elde etmek için 1.3 ve 1.4 adımlarını tekrarlayın ve {Site ve Morfoloji. İndirilen dosyadan site yeniden kodlaması ICD-O-3/WHO 2008} = '8490/3'.
  6. Karşılaştırmalı amaçlar için, birkaç değişkeni işleyin. Hem Lenf Nodu Oranını (LNR) hem de Pozitif Lenf Nodu Oranlarının Logaritmasını (LODDS) kullanarak lenf nodu durumunu sınıflandırın.
    1. LNR'yi pozitif lenf düğümlerinin (PLN'ler) toplam lenf düğümlerine (TLN'ler) oranı olarak tanımlayın. Aşağıdaki formülü kullanarak LODDS değerini hesaplayın:
      loge (PLN sayısı + 0.5) / (negatif lenf nodu sayısı (NLN) + 0.5)
      burada sonsuz bir sonucu önlemek için 0,5 eklenmiştir. LNR, LODDS ve tümör boyutu için kesme değerleri, minimum P-değeri yöntemine dayalı olarak X-tile yazılımı (sürüm 3.6.1) kullanılarak belirlendi.
  7. X-tile yazılımını açın, Dosya > Aç'a tıklayın ve yazılıma aktarmak için veri dosyasını seçin. Veriler yüklendikten sonra değişkenleri eşleyin: Sansür hayatta kalma durumuna karşılık gelir, Hayatta kalma süresi hayatta kalma süresine karşılık gelir ve marker1 analiz edilecek değişkendir ve verilerin doğru şekilde eşleşmesini sağlar.
  8. Ardından, Kaplan-Meier sağkalım analizini gerçekleştirmek ve hayatta kalma eğrisini oluşturmak için Kaplan-Meier > Marker1 > Yap'a tıklayın. Kaplan-Meier sağkalım eğrilerinin ayrılmasına, istatistiksel anlamlılığa (örneğin, p değeri) ve klinik alakalılığa dayanarak, optimal kesme değerini belirleyin ve son olarak analiz sonuçlarını kaydedin veya dışa aktarın.
    1. LNR'yi üç gruba ayırın: LNR 1 (≤0.16), LNR 2 (0.16 - 0.78) ve LNR 3 (≥ 0.78). Hastaları LODDS'ye göre üç gruba ayırın: LODDS 1 (≤ -1.44), LODDS 2 (-1.44 - 0.86) ve LODDS 3 (≥ 0.86).
    2. Tümör boyutunu üç kategoriye ayırın: ≤ 3,5 cm, 3,5 - 5,5 cm ve ≥ 5,5 cm. Yaşı sürekli değişkenden kategorik değişkene dönüştürün. Hastaların ilk tanı anındaki yaşlarını ≥60 ve <60 yıl olarak sınıflandırın. Taşlı yüzük hücreli karsinom (SRCC) tümörlerinin dağılımına göre tümör konumunu sağ kolon, sol kolon ve rektum olarak sınıflandırın. Sağ kolon çekum, çıkan kolon, hepatik fleksura ve transvers kolonu içerirken, sol kolon splenik fleksura, inen kolon, sigmoid kolon ve rektosigmoid bileşkeyi içerir.
  9. Bu çalışma için, SRCC ile toplam 2409 uygun hasta verisini bir eğitim kohortuna (N = 1686) ve bir doğrulama kohortuna (N = 723) 7: 3 oranında rastgele atayın. Rastgele bölme için aşağıdaki kodu kullanın ve SEER veritabanından kaynak data.csv kullanın. Rastgele bölme işleminden sonra oluşturulan dosyalar daha fazla analiz için kullanılacaktır.
    Kütüphane(şapka işareti)
    Veri <- read.csv ("data.csv")
    set.tohum(123)
    train_indices <- createDataPartition(veri$değişkeni, p = 0.7, liste = YANLIŞ)
    train_data <- Veriler[train_indices, ]
    test_data <- veri[-train_indices, ]
    write.csv(train_data, "traindata.csv", row.names = YANLIŞ)
    write.csv(test_data, "testdata.csv", row.names = YANLIŞ)

2. Makine öğrenimi modelleri geliştirme ve doğrulama

  1. RStudio (2024.04.2+764) ve R yazılımını (4.4.1) indirin. R yazılımını çalıştırmak için RStudio'yu açın. Yeni Dosya'ya tıklayın ve yeni bir R programlama arabirimi oluşturmak için R Betiği'ni seçin. İlgili kodu kod düzenleyicisine girin ve kodu çalıştırmak için Çalıştır'a tıklayın.
  2. ML modellerine dahil edilen değişkenleri Cox regresyon analizi ile taramak için aşağıdaki kodu kullanın. Ek olarak, LODDS, LNR ve pN evrelemesinin SRCC hastalarında kansere özgü sağkalım (CSS) üzerindeki etkisini keşfedin. traindata.csv, SEER veritabanından elde edilen verilerdir.
    kütüphane("Hayatta Kalma")
    Kütüphane("survminer")
    Kütüphane("RMS")
    Kütüphane("dplyr")
    Veri <- read.csv ("traindata.csv")
    Veri$Zaman=AS.Numeric(Veri$Zaman)
    data$status=as.numeric(veri$status)
    değişkenler <- c("Cinsiyet", "Yaş", "Irk", "Evlilik", "Evre", "T", "N", "M", "Tumor_size", "LNR", "LODDS", "CEA", "Radyasyon", "Kemoterapi", "Site")
    veri <- veri %>
    mutate(across(all_of(değişkenler), as.faktör))
    cox=coxph(Surv(zaman, durum) ~ veri$T, veri = veri)
    cox$katsayıları
    pval=anova(cox)$Pr[2]
    clean_data=veri[,c(1:12, 14:18)]
    get_coxVariable=fonksiyon(your_data,indeks){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(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)
    için(i 1:15'te){print(variable_select[i])}
    for (var in variable_select) {formül <- as.formula(paste("Surv(zaman, durum) ~", var))cox_model <- coxph(formül, veri = veri) print(summary(cox_model))
    ggforest(cox)
    değişkenler <- c("Cinsiyet", "Yaş", "Irk", "Evlilik", "Evre", "T", "N", "M", "Tumor_size", "LNR", "LODDS", "Kemoterapi")
    veri <- veri %>
    mutate(across(all_of(değişkenler), as.faktör))
    cox=coxph(Surv(zaman, durum) ~ Cinsiyet+Yaş+Irk+Evlilik+T+N+M+Tumor_size+LNR+
    LODDS+Kemoterapi,veri = veri)
    ggforest(cox,veri = veri)
    ggplot_forest <- ggforest(cox, veri = veri)
  3. Eğitim, doğrulama ve dış doğrulama kohortları genelinde üç LN sisteminin (LODDS, LNR ve pN evreleme) prognostik tahmin yeteneklerini karşılaştırmak için aşağıdaki kodu kullanın.
    Kitaplık(RMS)
    Kütüphane (Hayatta Kalma)
    Kütüphane(Survminer)
    library(riskRegression)
    Kütüphane(gt)
    train_data <- read.csv ("train_data123.csv")
    validation_data <- read.csv ("test_data123.csv")
    dd <- veri dağıtımı(train_data)
    options(datadist = "dd")
    model_LNR <- cph(Surv(zaman, durum) ~ LNR, veri = train_data, x = DOĞRU, y = DOĞRU)
    model_LODDS <- cph(Surv(zaman, durum) ~ LODDS, veri = train_data, x = DOĞRU, y = DOĞRU)
    model_pN <- cph(Surv(zaman, durum) ~ N, veri = train_data, x = DOĞRU, y = DOĞRU)
    calculate_performance <- function(model, veri) {pred <- predict(model, newdata = veri) 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 <- fonksiyon(model, veri) {pred <- tahmin (model, newdata = veri, tür = "lp") concordance_result <- concordancefit(Surv(veri$zaman, veri$durum), x = pred) c_index <- concordance_result$uyum 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 = yuvarlak(c_index, 3), CI_Lower = yuvarlak(ci_lower, 3), CI_Upper = yuvarlak(ci_upper, 3), AIC = yuvarlak(aic, 2), BIC = yuvarlak(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(zaman, durum) ~ LNR, veri = validation_data, x = DOĞRU, y = DOĞRU)
    model_LODDS_val <- cph(Surv(zaman, durum) ~ LODDS, veri = validation_data, x = DOĞRU, y = DOĞRU)
    model_pN_val <- cph(Surv(zaman, durum) ~ N, veri = validation_data, x = DOĞRU, y = DOĞRU)
    val_LNR <- calculate_performance(model_LNR_val, validation_data)
    val_LODDS <- calculate_performance(model_LODDS_val, validation_data)
    val_pN <- calculate_performance(model_pN_val, validation_data)
    results <- data.frame(Değişken = c("LNR", "LODDS", "pN"), Training_C_Index = c(yapıştır(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(yapıştır(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(sonuçlar) %>%
    tab_header(başlık = "Üç Lenf Nodu Evreleme Sisteminin Tahmin Performansı") %>%
    cols_label(Değişken = "Değişken",Training_C_Index = "C-indeksi (%95 CI) (Eğitim)", Training_AIC = "AIC (Eğitim)", Training_BIC = "BIC (Eğitim)", Validation_C_Index = "C-indeksi (%95 CI) (Doğrulama)", Validation_AIC = "AIC (Doğrulama)", Validation_BIC = "BIC (Doğrulama)")
    write.csv(sonuçlar, "prediction_performance.csv", row.names = YANLIŞ)
  4. Bir XGBoost modeli oluşturmak ve değişkenlerin göreceli öneminin çubuk grafiklerini oluşturmak için aşağıdaki kodu kullanın, böylece üç LN sisteminin önemini karşılaştırın. Benzer şekilde, ROC eğrileri ve kalibrasyon eğrileri oluşturun. Veriler SEER veri tabanından elde edilir.
    Kitaplık(xgboost)
    Kütüphane(şapka işareti)
    kütüphane(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('Yaş', 'T', 'N', 'M', 'LODDS', 'Kemoterapi')]), label = train_data$status)
    test_matrix <- xgb. DMatrix(data = as.matrix(test_data[, c('Yaş', 'T', 'N', 'M', 'LODDS', 'Kemoterapi')]), label = test_data$status)
    params <- list(booster = "gbtree", amaç = "ikili:lojistik", eval_metric = "auc", eta = 0.1, max_depth = 6, alt örnek = 0.8, colsample_bytree = 0.8)
    xgb_model <- xgb.train(params = parametreler, veri = train_matrix, nrounds = 100, watchlist= list(tren = train_matrix), ayrıntılı = 1)
    pred_probs <- tahmin et(xgb_model, yeni veri = test_matrix)
    pred_labels <- ifelse(pred_probs > 0.5, 1, 0)
    conf_matrix <- karışıklıkMatris(as.factor(pred_labels), as.factor(test_data$status))
    roc_curve <- roc(test_data$durum, pred_probs)
    auc_value <- AUC (roc_curve)
    ci_auc <- ci.auc(roc_curve)
    hassasiyet <- conf_matrix$byClass["Duyarlılık"]
    özgüllük <- conf_matrix$byClass["Özgüllük"]
    doğruluk <- conf_matrix$genel["Doğruluk"]
    ppv <- conf_matrix$byClass["Pos Pred Değeri"]
    npv <- conf_matrix$byClass["Neg Pred Değeri"]
    result_table <- data.frame(Model = "XGBoost", AUC = sprintf("%.3f (%.3f-%.3f)", auc_value, ci_auc[1], ci_auc[3]), Duyarlılık = sprintf("%.3f", duyarlılık), Özgüllük = sprintf("%.3f", özgüllük), Doğruluk = sprintf("%.3f", doğruluk), PPV = sprintf("%.3f", ppv), NPV = sprintf("%.3f", npv))
    write.csv(result_table, "xgboost_model_performance.csv", row.names = YANLIŞ)
    roc_df <- data.frame(FPR = 1 - roc_curve$özgüllükler, TPR = roc_curve$duyarlılıklar)
    roc_plot <- ggplot(roc_df, aes(x = FPR, y = TPR)) +geom_line(renk = "steelblue", boyut = 1.2) + geom_abline(kesişim noktası = 0, eğim = 1, linetype = "kesikli", color = "gri") + annotate("metin", x = 0.9, y = 0.2, label = paste("AUC =", round(auc_value, 3)), size = 5, color = "black") + labs(title = "XGBoost Modeli için ROC Eğrisi", x = "Yanlış Pozitif Oran", y = "Gerçek Pozitif Oran") + theme_minimal() + theme(panel.border = element_rect(color = "black", dolgu = NA, boyut = 1))
    calibration_data <- data.frame(Durum = as.factor(test_data$durum), pred_probs = pred_probs)
    calib_model <- kalibrasyon (Durum ~ pred_probs, veri = calibration_data, sınıf = "1", kesimler = 5)
    ggplot(calib_model$data, AES(x = orta nokta, y = Yüzde)) + geom_line(renk = "steelblue", boyut = 1) + geom_point(renk = "kırmızı", boyut = 2) + geom_abline(kesişim noktası = 0, eğim = 1, çizgi türü = "kesikli", renk = "siyah") +labs(title = "XGBoost Modeli için Kalibrasyon Eğrisi", x = "Tahmin Edilen Olasılık", y = "Gözlemlenen Oran") + theme_minimal() + theme(panel.border = element_rect(color = "black", fill = NA, boyut = 0.5))
  5. Bir RF modeli oluşturmak ve değişkenlerin göreceli öneminin çubuk grafiklerini oluşturmak için aşağıdaki kodu kullanın, böylece üç LN sisteminin önemini karşılaştırın. Benzer şekilde, ROC eğrileri ve kalibrasyon eğrileri oluşturun. Veriler SEER veritabanından elde edilir.library(randomForest)
    Kütüphane (dplyr)
    Kütüphane(ggplot2)
    kütüphane(pROC)
    Kütüphane(şapka işareti)
    Kitaplık(RMS)
    Tren Seti <- read.csv("train_data.csv")
    Test Edilen <- read.csv ("test_data.csv")
    trainset$status=faktör(trainset$status)
    değişkenler1 <- c("Yaş", "T", "N", "M", "LODDS", "Kemoterapi")
    Tren Seti <- Tren Seti %>%
    mutate(across(all_of(variables1), as.numeric))
    testsed$status=faktör(testsed$status)
    Test edildi < test edildi %>
    mutate(across(all_of(variables1), as.numeric))
    RF=randomForest(trainset$status ~ Yaş + T + N + M + LODDS + Kemoterapi, veri=trainset,ntree=100,önem=DOĞRU,yakınlık=DOĞRU)
    imp=önem(RF)
    varImpPlot(RF)
    impvar=rownames(imp)[order(imp[,4],azalan = TRUE)]
    importance_df <- as.data.frame(imp)
    importance_df$Değişkenler <- satır adları(importance_df)
    importance_plot <- ggplot(importance_df, aes(x = reorder(Variables, MeanReduce Accuracy), y = MeanReduce Accuracy)) +geom_bar(stat = "identity", fill = "steelblue") +coord_flip() + labs(title = "Değişken Önemi", x = "Değişkenler", y = "Ortalama Azalma Doğruluğu") + theme_minimal()
    pred_probs <- tahmin (RF, test seti, tür = "prob")[,2]
    roc_obj <- roc(testset$status, pred_probs)
    auc_value <- AUC (roc_obj)
    roc_plot <- ggplot() +geom_line(aes(x = 1 - roc_obj$özgüllükler, y = roc_obj$hassasiyetler), color = "steelblue", boyut = 1.2) +geom_abline(kesişim noktası = 0, eğim = 1, linetype = "kesikli", color = "gri") + annotate("text", x = 0.8, y = 0.2, label = paste("AUC =", round(auc_value, 3)), color = "black", size = 5, hjust = 0) + labs(title = "Rastgele Orman Modeli için ROC Eğrisi", x = "Yanlış Pozitif Oran", y = "Gerçek Pozitif Oran") +theme_minimal() + theme(panel.border = element_rect(renk = "siyah", dolgu = NA, boyut = 1))
    calibration_data <- data.frame(pred_probs = pred_probs, durum = testsed$status)
    calib_model <- kalibrasyon (durum ~ pred_probs, veri = calibration_data, sınıf = "1", kesimler = 5)
    calib_df <- as.data.frame(calib_model[["veri"]])
    calib_df $ orta <- calib_df $ orta nokta
    calib_df$Yüzde <- calib_df$Yüzde
    calibration_plot <- ggplot(calib_df, aes(x = orta, y = Yüzde)) + geom_line(renk = "çelik mavisi", boyut = 1.2) + geom_point(renk = "çelik mavisi", boyut = 3) + geom_abline(kesişim noktası = 0, eğim = 1, linetype = "kesikli", renk = "siyah", boyut = 0.8) + labs(başlık = "Rastgele Orman için Kalibrasyon Eğrisi", x = "Tahmin Edilen Olasılık", y = "Gerçek Olasılık") + theme_minimal() + theme(panel.border = element_rect(renk = "siyah", fill = NA, boyut = 1), plot.title = element_text(hjust = -0.05, vjust = -1.5, face = "kalın", boyut = 12) )
    rf_probs <- tahmin (RF, yeni veri=test edilmiş, type="prob")[, 2]
    rf_auc <- roc(test edildi$durum, rf_probs)
    auc_value <- AUC (rf_auc)
    ci_auc <- ci.auc(rf_auc)
    rf_predictions <- tahmin (RF, yeni veri = test edildi)
    conf_matrix <- confusionMatrix(rf_predictions, test edildi$durum)
    hassasiyet <- conf_matrix$byClass["Duyarlılık"]
    özgüllük <- conf_matrix$byClass["Özgüllük"]
    doğruluk <- conf_matrix$genel["Doğruluk"]
    ppv <- conf_matrix$byClass["Pos Pred Değeri"]
    npv <- conf_matrix$byClass["Neg Pred Değeri"]
    result_table <- data.frame(Model = "RF", AUC = sprintf("%.3f (%.3f-%.3f)", auc_value, ci_auc[1], ci_auc[3]), Duyarlılık = sprintf("%.3f", duyarlılık), Özgüllük = sprintf("%.3f", özgüllük), Doğruluk = sprintf("%.3f", doğruluk), PPV = sprintf("%.3f", ppv), NPV = sprintf("%.3f", npv))
    write.csv(result_table, "RF_model_performance.csv", row.names = YANLIŞ)
  6. Bir NN modeli oluşturmak ve değişkenlerin göreli önemine ilişkin çubuk grafikler oluşturmak için aşağıdaki kodu kullanın, böylece üç LN sisteminin önemini karşılaştırın. Benzer şekilde, ROC eğrileri ve kalibrasyon eğrileri oluşturun. Veriler SEER veritabanından elde edilir.library(nnet)
    Kütüphane(şapka işareti)
    kütüphane(pROC)
    Kütüphane(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)
    özellikler <- c ("Yaş", "T", "N", "M", "LODDS", "Kemoterapi")
    x_train <- train_data[, Özellikler]
    y_train <- train_data$durumu
    x_test <- test_data[, Özellikler]
    y_test <- test_data$durum
    nn_model <- nnet(durum ~ Yaş + T + N + M + LODDS + Kemoterapi, veri = train_data, boyut = 5, çürüme = 0.01, maksit = 200)
    pred_probs <- tahmin (nn_model, newdata = x_test, tür = "ham")
    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 <- yapıştır0(yuvarlak(auc_value, 3), " (", yuvarlak(auc_ci[1], 3), "-", yuvarlak(auc_ci[3], 3), ")")
    conf_matrix <- karışıklıkMatris (as.factor (pred_labels), y_test)
    doğruluk <- conf_matrix$genel["Doğruluk"]
    hassasiyet <- conf_matrix$byClass["Duyarlılık"]
    özgüllük <- conf_matrix$byClass["Özgüllük"]
    ppv <- conf_matrix$byClass["Pos Pred Değeri"]
    npv <- conf_matrix$byClass["Neg Pred Değeri"]
    performance_table <- data.frame(Metrik = c("AUC (%95 CI)", "Doğruluk", "Duyarlılık", "Özgüllük", "PPV", "NPV"),Değer = c(auc_text, yuvarlak(doğruluk, 3), yuvarlak(duyarlılık, 3), yuvarlak(özgüllük, 3), yuvarlak(ppv, 3), yuvarlak(npv, 3)))
    write.csv(performance_table, "NN_performance_table.csv", row.names = YANLIŞ)
    roc_curve <- ROC (y_test, pred_probs)
    auc_value <- AUC (roc_curve)
    roc_plot <- ggplot() + geom_line(aes(x = 1 - roc_curve$özgüllükler, y = roc_curve$hassasiyetler), color = "steelblue", boyut = 1.2) +geom_abline(kesişim noktası = 0, eğim = 1, linetype = "kesikli", color = "gri") + annotate("text", x = 0.8, y = 0.2, label = paste("AUC =", round(auc_value, 3)), color = "black", boyut = 5, hjust = 0) + labs(title = "Sinir Ağı Modeli için ROC Eğrisi", x = "Yanlış Pozitif Oran", y = "Gerçek Pozitif Oran") + theme_minimal() + theme(panel.border = element_rect(renk = "siyah", dolgu = NA, boyut = 1))
    calibration_data <- data.frame(pred_probs = pred_probs, durum = as.numeric(y_test) - 1)
    calibration_data$pred_probs <- Sayısal(calibration_data$pred_probs)
    calibration_data$calibration_bin <- cut(calibration_data$pred_probs, breaks(0, 1, by = 0.2), include.lower = TRUE)
    calibration_summary <- aggregate(durum ~ calibration_bin, veri = calibration_data, EĞLENCE = ortalama)
    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 = durum)) + geom_line(renk = "steelblue", boyut = 1.2) + geom_point(renk = "kırmızı", boyut = 3) + geom_abline(kesişim noktası = 0, eğim = 1, linetype = "kesikli", renk = "siyah", boyut = 0.8) + labs(başlık = "Sinir Ağı için Kalibrasyon Eğrisi", x = "Tahmin Edilen Olasılık", y = "Gerçek Olasılık") + theme_minimal() + theme(panel.border = element_rect(renk = "siyah", dolgu = NA, boyut = 1))
    nn_var_importance <- varImp(nn_model)
    importance_df <- data.frame(Özellik = rownames(nn_var_importance), Önem = nn_var_importance$Overall )
    importance_plot <- ggplot(importance_df, aes(x = reorder(Özellik, Önem), y = Önem)) + geom_bar(stat = "kimlik", fill = "steelblue") + coord_flip() + labs(title = "Sinir Ağı için Değişken Önem", x = "Özellikler", y = "Önem") + theme_minimal()

3. Rekabet eden risk modeli geliştirme ve doğrulama

  1. Tek değişkenli analiz gerçekleştirmek ve kümülatif insidans fonksiyonu (CIF) eğrisini çizmek için aşağıdaki kodu kullanın. data.csv, SEER veritabanından elde edilen verilerdir. Sonraki görüntüleri kaydetme yöntemi bu adımdakiyle aynı olacaktır. Tüm faktörler için tek değişkenli analiz gerçekleştirmek için koddaki Siteyi tek tek diğer faktörlerle değiştirin.
    Kütüphane(Tidycmprsk)
    Kitaplık(gtsummary)
    Kütüphane(ggplot2)
    Kütüphane(ggsurvfit)
    Kütüphane(ggprism)
    AA <- read.csv ("data.csv")
    cif2 <- tidycmprsk::cuminc(Surv(time, Status1) ~Site, data = aa)
    Düzenli(cif2,times = c(12,24,36,48,60))
    tbl_cuminc(cif2, çarpı =c(12,24,36,48,60), sonuçlar = c("CSS", "OSS"),estimate_fun = BOŞ, label_header = "**{zaman/12}-yıl cuminc**") %>%
    add_p() %>%
    add_n(konum = "seviye")
    cuminc_plot <- ggcuminc(cif2, sonuç = c("CSS", "OSS"), boyut = 1.5) + labs(x = "zaman") +add_quantile(y_value = 0.20, boyut = 1) + scale_x_continuous(kesmeler = sıra(0, 84, tarafından = 12), limitler = c(0, 84)) +scale_y_continuous(etiket = ölçekler::p ercent, breaks= seq(0, 1, by = 0.2), limitler = c(0, 1)) + theme_prism() + theme(legend.position = c(0.2, 0.8), panel.grid = element_blank(),panel.grid.major.y = element_line(renk = "gri80")) + theme(legend.spacing.x = birim(0.1, "cm"), legend.spacing.y = birim(0.01, "cm")) + theme(axis.ticks.length.x = birim(-0.2, "cm"), axis.ticks.x = element_line(renk = "siyah", boyut = 1, satır sonu = 1)) + theme(axis.ticks.length.y = birim(-0.2, "cm"), axis.ticks.y = element_line(renk = "siyah", boyut = 1, satır sonu = 1))
  2. Çok değişkenli analiz ve görselleştirme gerçekleştirmek için aşağıdaki kodu kullanın. data1.csv, önceki kodun sonuçlarından gelir. Kodu çalıştırdıktan sonra Dışa Aktar'a tıklayın, ardından PDF Olarak Kaydet'e tıklayın ve son olarak görüntüyü kaydetmek için Kaydet'e tıklayın.
    Kütüphane(Tidycmprsk)
    Kitaplık(gtsummary)
    aa <-read.csv('data1.csv')
    for (I in names(aa)[c(1:16, 19)]){aa[,i] <- as.factor(aa[,i])}
    mul1Tablo2 <- MUL1 %>
    gtsummary::tbl_regression(üs = DOĞRU) %>%
    add_n(konum = "seviye"); Tablo 2
    table_df <- as_tibble(Tablo 2)
    sekme <- table2$table_body
    tab1 <- tab[,c(12,19,20,22:29)]
  3. Nomogramı, ROC eğrisini ve kalibrasyon eğrisini çizmek için aşağıdaki kodu kullanın. Eğitim kohortundaki verileri kullanarak modeli eğittikten sonra, model.library(QHScrnomo) doğrulamak için doğrulama ve dış doğrulama kohort verilerini kullanın. Dış kohort verileri, adım 1.4'te seçilen halka hücreli karsinom dışındaki kolorektal kanser örneklerinden oluşur.
    Kitaplık(RMS)
    kütüphane (timeROC)
    Kütüphane (Hayatta Kalma)
    aa <-read.csv('data3.csv')
    for (I in names(aa)[c(1:16, 19)]){aa[,i] <- as.factor(aa[,i])}
    dd <- veri dağılımı (aa)
    options(datadist = "dd")
    mul <- cph(Surv(zaman, Durum1 == 1) ~ T + N + M + LODDS + Site, veri = aa, x = DOĞRU, y = DOĞRU, surv = DOĞRU)
    m3 <- crr.fit(mul, failcode = 1, cencode = 0)
    nomo <-Newlabels(fit = m3, etiketler =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","Rektum")))
    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 yıllık CSS Kümülatif İnsidansı","3 yıllık CSS Kümülatif İnsidansı","5 yıllık CSS Kümülatif İnsidansı"))
    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, "aylar", sep = "_")
    roc_1year <- timeROC(T = aa$time, delta = ifelse(aa$Status1 == "CSS", 1, 0), marker = pred_risks_df$risk_at_12_months, neden = 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, neden = 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, neden = 1,times = 60, iid = TRUE)
    legend("bottomright",legend = c("1 yıllık CSS", "3 yıllık CSS", "5 yıllık CSS"), col = c("#BF1D2D", "#262626", "#397FC7"), lwd = 2)
    sas.cmprsk(m3,zaman = 36)
    set.tohum(123)
    aa$pro <- tenf.crr(m3,zaman = 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 = "Tahmin Edilen Olasılık", ylab = "Gerçek Olasılık", 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.

Sonuçlar

Hasta özellikleri
Bu çalışma, 2004-2015 yıllarını kapsayan SEER veri tabanından elde edilen verileri kullanarak kolorektal SRCC tanısı alan hastalara odaklanmıştır. Dışlama kriterleri, sağkalım süresi bir aydan az olan hastaları, eksik klinikopatolojik bilgisi olanları ve ölüm nedeninin belirsiz veya belirtilmemiş olduğu vakaları içeriyordu. Dahil edilme kriterlerini karşılayan toplam 2409 kolorektal SRCC hastası rastgele bir eğitim kohor...

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

Tartışmalar

Kolorektal kanser (KRK) SRCC, kolorektal kanserlerin nadir ve özel bir alt tipidir ve prognozu kötüdür. Bu nedenle, SRCC hastalarının prognozuna daha fazla dikkat edilmesi gerekmektedir. SRCC hastaları için doğru sağkalım tahmini, prognozlarını belirlemek ve bireyselleştirilmiş tedavi kararları vermek için çok önemlidir. Bu çalışmada, SRCC hastalarında klinik özellikler ve prognoz arasındaki ilişkiyi araştırdık ve SEER veri tabanından SRCC hastaları için o...

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

Açıklamalar

Yazarların ifşa etmesi gereken herhangi bir finansal çıkar çatışması yoktur.

Teşekkürler

Hiç kimse

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

Malzemeler

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

Referanslar

  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.

Yeniden Basımlar ve İzinler

Bu JoVE makalesinin metnini veya resimlerini yeniden kullanma izni talebi

Izin talebi

Daha Fazla Makale Keşfet

T pSay 218makine renmesikolorektal ta l ta halka h creli karsinompozitif lenf nodlar n n log oranlarlenf nodu evresi

This article has been published

Video Coming Soon

JoVE Logo

Gizlilik

Kullanım Şartları

İlkeler

Araştırma

Eğitim

JoVE Hakkında

Telif Hakkı © 2020 MyJove Corporation. Tüm hakları saklıdır