cBioPortal ile mutasyon verisi

Bir mutasyonu H&E’den tahmin etmeye kalkmadan önce: prevalans, birlikte görülme, sağkalım ve slayt düzeyi etiket dosyası

cBioPortal web arayüzü ve API’si ile TCGA akciğer adenokarsinomunda EGFR/KRAS/TP53/STK11 mutasyon sıklığı, karşılıklı dışlama ve sağkalım analizi; örneklerden tanısal slaytlara geçiş ve MIL için etiket matrisi.

⏱ Süre: 60 dk (A bölümü kodsuz 25 dk; B–D Python 35 dk) 🧩 Ön koşul: A için tarayıcı; B–D için Python 3.10+, requests, pandas, scipy, lifelines 🔗 İlgili: Slayt Torba Ağı · Seri

Bu modül ne işe yarar

Slayt Torba Ağı’nda etiketler bir betikten gelir ve sınıflar dengelidir. Gerçekte etiket dizilemeden gelir, mutasyonlar nadirdir ve birbirleriyle ilişkilidir. cBioPortal (Cerami vd. 2012; Gao vd. 2013; Bruijn vd. 2023), halka açık kohortlarda bu üç soruyu kod yazmadan yanıtlar: Bu mutasyon ne sıklıkta? Başka hangi mutasyonlarla birlikte ya da ayrı görülür? Sağkalımla ilişkili mi? Son bölüm, aynı olguların tanısal slaytlarına nasıl ulaşıldığını ve bir MIL çalıştırması için etiket dosyasının nasıl kurulduğunu gösterir.

🎯 Öğrenme hedefleri

  • Bir çalışma (study), örnek listesi (sample list) ve moleküler profil (molecular profile) kavramlarını ayırt etmek
  • Web arayüzünde OncoPrint, karşılıklı dışlama ve sağkalım sekmelerini okumak
  • API’den gen × örnek ikili mutasyon matrisini çekmek ve sıklıkları hesaplamak
  • Birlikte görülme / karşılıklı dışlamayı Fisher kesin testiyle sınamak, sağkalımı Kaplan–Meier ile çizmek
  • TCGA örnek barkodundan tanısal slayt dosyasına geçmek; etiket dosyasını hasta düzeyinde kurmak
  • “Mutant” etiketinin neyi kapsadığını (sürücü / VUS, ekzom / panel, hipermutant) söyleyebilmek

Örnek olgu: TCGA akciğer adenokarsinomu

Modül boyunca Lung Adenocarcinoma (TCGA, PanCancer Atlas) çalışması kullanılır (The Cancer Genome Atlas Research Network 2014; Hoadley vd. 2018): çalışma kimliği luad_tcga_pan_can_atlas_2018, mutasyon verisi olan 566 örnek. Mutasyon çağrıları MC3 hattından gelir (Ellrott vd. 2018). Dört gen seçilir: EGFR (hedefe yönelik tedavi; H&E’den tahmin literatürünün klasik hedefi (Coudray vd. 2018)), KRAS (en sık sürücü), TP53 (en sık değişen gen), STK11 (immünoterapi yanıtıyla ilişkili).

Sayıların kaynağı

Aşağıdaki sıklıklar cBioPortal API’sinden 7 Kasım 2026’da çekilmiştir: 566 dizilenmiş örnekte EGFR mutasyonu 70 örnek (%12,4), 86 mutasyon kaydı (bazı örneklerde birden fazla); en sık L858R (23) ve E746_A750del (16). KRAS yaklaşık %30, TP53 yaklaşık %50, STK11 yaklaşık %15 — B bölümündeki kod bunları tam olarak yeniden üretir. Veri sürümü değişirse sayılar değişir; kendi çalıştırmanızın tarihini not edin.

A · Web arayüzü (kod gerekmez)

1

cbioportal.org → Query sekmesi. Arama kutusuna lung adenocarcinoma tcga pancancer yazın; Lung Adenocarcinoma (TCGA, PanCancer Atlas) çalışmasını işaretleyin. Sağda örnek sayılarını görün: “Mutations” satırı 566’dır.

2

Query By Gene → Select Molecular Profiles: yalnızca Mutations işaretli kalsın (CNA ve mRNA’yı kaldırın; etiketimiz mutasyon). Enter Genes kutusuna EGFR KRAS TP53 STK11 yazın → Submit Query.

3

OncoPrint sekmesi. Her sütun bir örnek, her satır bir gen. Satır başındaki yüzde, o genin değişmiş örnek oranıdır. Sütunları gözle tarayın: EGFR ve KRAS aynı sütunda neredeyse hiç görünmez. Sağ üstteki Download düğmesi tablo olarak indirir.

4

Mutual Exclusivity sekmesi. Her gen çifti için log2 olasılık oranı, p değeri ve “Mutual exclusivity / Co-occurrence” etiketi. EGFR–KRAS çifti karşılıklı dışlayıcıdır (aynı yolaktaki iki sürücüden biri yeter); TP53 çoğu genle bağımsız ya da birlikte görülür.

5

Comparison/Survival sekmesi → Survival. Gruplar “Altered” ve “Unaltered” olarak gelir; Overall Survival eğrisini ve log-rank p değerini okuyun. Dikkat: gruplar dört genin herhangi birinde değişimle tanımlanır. Tek gen için, Query’ye dönüp yalnızca o geni sorgulayın ya da D bölümündeki kodu kullanın.

6

Download sekmesi → Mutation data (sample × gene matrix) ya da Alteration data. Bu, MIL için etiket matrisinin kodsuz hâlidir: her satır bir örnek, her sütun bir gen, hücrede mutasyon varsa protein değişimi.

“Mutant” ne demek?

cBioPortal varsayılan olarak her somatik mutasyonu sayar: sürücüleri de, önemi bilinmeyen varyantları (VUS) da. OncoPrint’teki Mutations: Driver / VUS anahtarı (OncoKB ve Cancer Hotspots açıklamaları) ikisini ayırır. H&E’den “EGFR mutant” tahmin edecek bir model için etiket, klinik olarak anlamlı sürücü mutasyonlarla (L858R, ekzon 19 delesyonları…) sınırlanmalıdır; yoksa pozitif sınıfın bir kısmı morfolojik karşılığı olmayan rastgele VUS’lardan oluşur ve model bunu öğrenemez.

B · API: gen × örnek matrisi

cBioPortal’ın herkese açık REST API’si (https://www.cbioportal.org/api, OpenAPI belgesi /api/swagger-ui/) kimlik doğrulama gerektirmez. Aşağıdaki kod üç çağrıyla ikili mutasyon matrisini kurar. Çalıştırılmaz; kendi ortamınızda kopyalayın.

cbio_matrix.py
import requests, pandas as pd

API = "https://www.cbioportal.org/api"
STUDY = "luad_tcga_pan_can_atlas_2018"
PROFILE = f"{STUDY}_mutations"          # moleküler profil: mutasyonlar
SAMPLES = f"{STUDY}_sequenced"           # örnek listesi: mutasyon verisi olanlar
GENES = ["EGFR", "KRAS", "TP53", "STK11"]

# 1) HUGO sembolü → Entrez kimliği (API mutasyonları Entrez ile filtreler)
genes = requests.post(f"{API}/genes/fetch",
                      params={"geneIdType": "HUGO_GENE_SYMBOL"},
                      json=GENES).json()
entrez = {g["hugoGeneSymbol"]: g["entrezGeneId"] for g in genes}

# 2) Örnek listesi → dizilenmiş tüm örnek kimlikleri (566)
sl = requests.get(f"{API}/sample-lists/{SAMPLES}").json()
all_samples = sl["sampleIds"]

# 3) Seçili genlerin mutasyon kayıtları (örnek başına birden fazla olabilir)
muts = requests.post(f"{API}/molecular-profiles/{PROFILE}/mutations/fetch",
                     params={"projection": "DETAILED"},
                     json={"sampleListId": SAMPLES,
                           "entrezGeneIds": list(entrez.values())}).json()
mdf = pd.DataFrame(muts)[["sampleId", "patientId", "entrezGeneId",
                          "proteinChange", "mutationType"]]
mdf["gene"] = mdf["entrezGeneId"].map({v: k for k, v in entrez.items()})

# İkili matris: satır = örnek, sütun = gen, 1 = en az bir mutasyon
M = (mdf.assign(v=1).pivot_table(index="sampleId", columns="gene",
                                  values="v", aggfunc="max")
       .reindex(all_samples).fillna(0).astype(int))
print(M.sum().sort_values(ascending=False) / len(M))   # sıklıklar
M.to_csv("luad_mutation_matrix.csv")

Beklenen çıktı (Kasım 2026 verisi): EGFR 0.124 (70/566); KRAS, TP53 ve STK11 için sırasıyla yaklaşık 0,30, 0,50 ve 0,15.

Sürücü filtresi

projection=DETAILED ile gelen kayıtlarda driverFilter (“Putative_Driver” / “Putative_Passenger”) ve driverFilterAnnotation alanları bulunur (çalışmada OncoKB açıklaması varsa). Etiketi sürücülerle sınırlamak için matrisi kurmadan önce mdf = mdf[mdf["driverFilter"] == "Putative_Driver"] ekleyin. Alanın boş olduğu çalışmalarda protein değişimi listesiyle (örn. EGFR için L858R, ekzon 19 del, L861Q, G719x, S768I, ekzon 20 ins) filtreleyin.

C · Birlikte görülme ve karşılıklı dışlama

Her gen çifti için 2×2 tablo ve Fisher kesin testi; web arayüzünün Mutual Exclusivity sekmesinin yeniden üretimi.

cbio_pairs.py
import itertools, numpy as np, pandas as pd
from scipy.stats import fisher_exact

M = pd.read_csv("luad_mutation_matrix.csv", index_col=0)
rows = []
for a, b in itertools.combinations(M.columns, 2):
    t = pd.crosstab(M[a], M[b]).reindex(index=[0, 1], columns=[0, 1], fill_value=0)
    odds, p = fisher_exact(t.values)
    rows.append({"A": a, "B": b, "both": t.loc[1, 1], "A_only": t.loc[1, 0],
                 "B_only": t.loc[0, 1], "neither": t.loc[0, 0],
                 "log2_OR": np.log2(odds) if odds > 0 else -np.inf, "p": p})
print(pd.DataFrame(rows).sort_values("p"))

Okuma: EGFR–KRAS için both sıfıra yakındır ve log2 olasılık oranı belirgin negatiftir — karşılıklı dışlama. Bu, Slayt Torba Ağı’na şu soruyu taşır: EGFR tahmincisinin öğrendiği desen “EGFR var” mı, yoksa “KRAS yok” mu? Dış doğrulama kohortunda KRAS sıklığı farklıysa ikisi farklı davranır.

D · Sağkalım

Klinik veri hasta düzeyindedir; mutasyon örnek düzeyindedir. Önce örnek → hasta eşlemesi, sonra Kaplan–Meier.

cbio_survival.py
import requests, pandas as pd
from lifelines import KaplanMeierFitter
from lifelines.statistics import logrank_test

API = "https://www.cbioportal.org/api"; STUDY = "luad_tcga_pan_can_atlas_2018"
M = pd.read_csv("luad_mutation_matrix.csv", index_col=0)

samples = pd.DataFrame(requests.get(f"{API}/studies/{STUDY}/samples",
                                    params={"projection": "SUMMARY"}).json())
s2p = samples.set_index("sampleId")["patientId"]
M["patientId"] = s2p.reindex(M.index).values
# Hasta düzeyi etiket: hastanın herhangi bir örneğinde mutasyon varsa 1
P = M.groupby("patientId").max()

clin = pd.DataFrame(requests.get(f"{API}/studies/{STUDY}/clinical-data",
                                 params={"clinicalDataType": "PATIENT",
                                         "projection": "SUMMARY"}).json())
clin = clin.pivot(index="patientId", columns="clinicalAttributeId", values="value")
df = P.join(clin[["OS_STATUS", "OS_MONTHS"]], how="inner").dropna()
df["event"] = df["OS_STATUS"].str.startswith("1").astype(int)   # "1:DECEASED"
df["OS_MONTHS"] = df["OS_MONTHS"].astype(float)

gene = "EGFR"
km = KaplanMeierFitter()
for v, lab in [(1, f"{gene} mutant"), (0, f"{gene} yabanıl tip")]:
    g = df[df[gene] == v]
    km.fit(g["OS_MONTHS"], g["event"], label=f"{lab} (n={len(g)})").plot_survival_function()
r = logrank_test(df[df[gene]==1]["OS_MONTHS"], df[df[gene]==0]["OS_MONTHS"],
                 df[df[gene]==1]["event"], df[df[gene]==0]["event"])
print("log-rank p =", round(r.p_value, 4))

Aynı tabloyu df.to_csv("luad_os.csv") ile dışa aktarıp jamovi ClinicoPath modülünde sağkalım analizine de alabilirsiniz; kod gerekmeyen yol budur.

Sağkalım yorumunda üç tuzak

TCGA olguları cerrahi rezeksiyon örnekleridir ve tedavi bilgisi eksiktir; EGFR mutant hastaların TKI alıp almadığı bilinmez. Evre karıştırıcıdır; tek değişkenli log-rank bunu düzeltmez (Cox modeline AJCC_PATHOLOGIC_TUMOR_STAGE ekleyin). Ve sağkalım farkı, H&E’den tahmin edilen bir etiketin değil, dizilenmiş etiketin özelliğidir; tahmin edilen etiketle KM çizmek ayrı bir doğrulama sorusudur.

E · Örnekten slayta: MIL için etiket dosyası

TCGA örnek barkodu TCGA-05-4244-01 şu parçalardan oluşur: proje–doku kaynağı merkezi (05) – katılımcı (4244) – örnek tipi (01 = primer tümör). Aynı olgunun tanısal H&E slaytı GDC Data Portal’da TCGA-05-4244-01Z-00-DX1.<uuid>.svs adıyla bulunur (DX = tanısal FFPE, TS = dondurulmuş kesit; MIL için DX kullanılır). Doku kaynağı merkezi kodu (05, 44, 55…) aynı zamanda tarayan/boyayan merkezin vekilidir: Howard ve ark. (2021) bu kodla merkeze özgü imzaların mutasyon tahmincilerini nasıl şişirdiğini göstermiştir. Slayt Torba Ağı’ndaki “B laboratuvarı” tuzağı bu kodun simülasyon hâlidir.

cbio_labels.py
import pandas as pd
M = pd.read_csv("luad_mutation_matrix.csv", index_col=0)
lab = pd.DataFrame({
    "sample_id": M.index,
    "patient_id": M.index.str.slice(0, 12),      # TCGA-05-4244
    "site_code": M.index.str.slice(5, 7),        # 05  → merkez katmanlaması için
    "label_EGFR": M["EGFR"].values,
})
# Bölme hasta ve merkez düzeyinde yapılır; slayt düzeyinde ASLA.
print(lab["label_EGFR"].mean(), lab["site_code"].nunique())
lab.to_csv("luad_egfr_labels.csv", index=False)

Sınıf oranı ve ölçüt

Simülasyonda pozitif oran %50’dir; burada EGFR için %12. Bu oranla doğruluk (accuracy) anlamsızdır (her şeye “yabanıl tip” diyen model %88 doğru). AUROC ile birlikte AUPRC ve seçilen eşikte duyarlılık/özgüllük bildirilir; kayıp fonksiyonunda sınıf ağırlığı ya da dengeli örnekleme kullanılır. Yayımlanan EGFR tahmincilerinin AUROC’u 0,75–0,85 aralığındadır (Coudray vd. 2018; Kather vd. 2020); önceliği ön tarama olarak konumlandırın.

Kendinizi test edin

OncoPrint'te EGFR %12 görünüyor. H&E'den EGFR tahmin edecek bir model için etiket dosyasını doğrudan bu sütundan kurarsanız ne olur?

Sürücü / VUS ayrımı (OncoKB açıklaması ya da protein değişimi listesi) etiketin ilk temizliğidir.

Fisher testi EGFR–KRAS için güçlü karşılıklı dışlama gösteriyor. Bu, EGFR tahmincisi için neden önemlidir?

Etiketler arası ilişki, modelin öğrendiği desenin ne olduğunu belirsizleştirir; dış doğrulama ve karıştırıcı analizi bu yüzden gerekir.

Etiket dosyasında eğitim/test bölmesini hangi düzeyde yaparsınız?

Slayt ya da örnek düzeyinde bölme, test performansını sızıntıyla şişirir; merkez sızıntısı ise kestirme öğrenmeyi ödüllendirir.

Kaynaklar

Bu sayfada atıf verilen çalışmalar aşağıda listelenir; serinin tamamı için Kaynaklar. cBioPortal belgeleri: docs.cbioportal.org; API: cbioportal.org/api/swagger-ui; R istemcisi: cbioportalR; Bioconductor: cBioPortalData.

Başa dön

Referanslar

Bruijn, Ino de, Ritika Kundra, Brooke Mastrogiacomo, Thinh Ngoc Tran, Luke Sikina, Tali Mazor, Xiang Li, vd. 2023. “Analysis and Visualization of Longitudinal Genomic and Clinical Data from the AACR Project GENIE Biopharma Collaborative in cBioPortal”. Cancer Research 83 (23): 3861-67. https://doi.org/10.1158/0008-5472.CAN-23-0816.
Cerami, Ethan, Jianjiong Gao, Ugur Dogrusoz, Benjamin E. Gross, Selcuk Onur Sumer, Bülent Arman Aksoy, Anders Jacobsen, vd. 2012. “The cBio Cancer Genomics Portal: An Open Platform for Exploring Multidimensional Cancer Genomics Data”. Cancer Discovery 2 (5): 401-4. https://doi.org/10.1158/2159-8290.CD-12-0095.
Coudray, Nicolas, Paolo Santiago Ocampo, Theodore Sakellaropoulos, Navneet Narula, Matija Snuderl, David Fenyö, Andre L. Moreira, Narges Razavian, ve Aristotelis Tsirigos. 2018. “Classification and mutation prediction from non-small cell lung cancer histopathology images using deep learning”. Nature Medicine 24: 1559-67. https://doi.org/10.1038/s41591-018-0177-5.
Ellrott, Kyle, Matthew H. Bailey, Gordon Saksena, Kyle R. Covington, Cyriac Kandoth, Chip Stewart, Julian Hess, vd. 2018. “Scalable Open Science Approach for Mutation Calling of Tumor Exomes Using Multiple Genomic Pipelines”. Cell Systems 6 (3): 271-281.e7. https://doi.org/10.1016/j.cels.2018.03.002.
Gao, Jianjiong, Bülent Arman Aksoy, Ugur Dogrusoz, Gideon Dresdner, Benjamin Gross, S. Onur Sumer, Yichao Sun, vd. 2013. “Integrative Analysis of Complex Cancer Genomics and Clinical Profiles Using the cBioPortal”. Science Signaling 6 (269): pl1. https://doi.org/10.1126/scisignal.2004088.
Hoadley, Katherine A., Christina Yau, Toshinori Hinoue, Denise M. Wolf, Alexander J. Lazar, Esther Drill, Ronglai Shen, vd. 2018. “Cell-of-Origin Patterns Dominate the Molecular Classification of 10,000 Tumors from 33 Types of Cancer”. Cell 173 (2): 291-304.e6. https://doi.org/10.1016/j.cell.2018.03.022.
Howard, Frederick M., James Dolezal, Sara Kochanny, Jefree Schulte, Heather Chen, Lara Heij, Dezheng Huo, vd. 2021. “The impact of site-specific digital histology signatures on deep learning model accuracy and bias”. Nature Communications 12: 4423. https://doi.org/10.1038/s41467-021-24698-1.
Kather, Jakob Nikolas, Lara R. Heij, Heike I. Grabsch, Chiara Loeffler, Amelie Echle, Hannah Sophie Muti, Jeremias Krause, vd. 2020. “Pan-cancer image-based detection of clinically actionable genetic alterations”. Nature Cancer 1: 789-99. https://doi.org/10.1038/s43018-020-0087-6.
The Cancer Genome Atlas Research Network. 2014. “Comprehensive molecular profiling of lung adenocarcinoma”. Nature 511: 543-50. https://doi.org/10.1038/nature13385.