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ı
🎯 Öğ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).
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.
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.
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.
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)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?
Fisher testi EGFR–KRAS için güçlü karşılıklı dışlama gösteriyor. Bu, EGFR tahmincisi için neden önemlidir?
Etiket dosyasında eğitim/test bölmesini hangi düzeyde yaparsınız?
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.