cbioportal-database について
cBioPortal Databaseは、cBioPortal REST APIを通じてがんゲノムデータを調べるスキルです。分子変化と臨床データを分析する研究者向けに、変異、コピー数、発現などの研究データを提供します。
主な機能
- 01がん研究と分子プロファイルの閲覧
- 02変異とコピー数データの取得
- 03臨床データの取得
- 04遺伝子変化頻度の分析
- 05研究間での遺伝子変化の比較
活用シーン
- 01がん種ごとの変異頻度の評価
- 02がん種間の変化率の比較
- 03ゲノム変化と臨床変数の関連付け
- 04生存分析用データの準備
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ leonchaox/ qinyan-academic-skills --skill cbioportal-databaseインストール後、Claude Code で/cbioportal-databaseを入力して読み込まれたか確認します。
同梱ファイルreferences/study_exploration.md
詳細
cBioPortalデータベース
概要
cBioPortal for Cancer Genomics(https://www.cbioportal.org/)は、多次元のがんゲノミクスデータを探索、可視化、分析するためのオープンアクセスリソースです。The Cancer Genome Atlas(TCGA)、AACR Project GENIE、MSK-IMPACTをはじめとする数百件のがん研究のデータをホストしており、数千件のがんサンプルについて、変異、コピー数変化(CNA)、構造変異、mRNA/タンパク質発現、メチル化、臨床データを扱っています。
主なリソース:
- cBioPortalウェブサイト:https://www.cbioportal.org/
- REST API:https://www.cbioportal.org/api/
- APIドキュメント(Swagger):https://www.cbioportal.org/api/swagger-ui/index.html
- Pythonクライアント:
bravadoまたはrequests - GitHub:https://github.com/cBioPortal/cbioportal
このスキルを使用する場面
次のような場合にcBioPortalを使用します。
- 変異の全体像:あるがん種で、特定の遺伝子に変異がある割合はどれくらいですか?
- がん遺伝子/がん抑制遺伝子の検証:ある遺伝子は、がんで頻繁に変異、増幅、または欠失していますか?
- 共変異パターン:遺伝子Aと遺伝子Bの変異は、相互排他的ですか、それとも共起しますか?
- 生存分析:ある遺伝子の変異は、患者の転帰の改善または悪化と関連していますか?
- 変化プロファイル:ある遺伝子には、どのような種類の変化(ミスセンス、短縮、増幅、欠失)が生じていますか?
- パンキャンサー分析:がん種間で変化頻度を比較する
- 臨床的関連:ゲノム変化を臨床変数(病期、グレード、治療反応)と関連付ける
- TCGA/GENIEの探索:TCGAおよび臨床シーケンシングデータセットに体系的にアクセスする
主な機能
1. cBioPortal REST API
ベースURL:https://www.cbioportal.org/api
APIはRESTfulで、JSONを返し、公開データにはAPIキーが不要です。
import requests
BASE_URL = "https://www.cbioportal.org/api"
HEADERS = {"Accept": "application/json", "Content-Type": "application/json"}
def cbioportal_get(endpoint, params=None):
url = f"{BASE_URL}/{endpoint}"
response = requests.get(url, params=params, headers=HEADERS)
response.raise_for_status()
return response.json()
def cbioportal_post(endpoint, body):
url = f"{BASE_URL}/{endpoint}"
response = requests.post(url, json=body, headers=HEADERS)
response.raise_for_status()
return response.json()
2. 研究の参照
def get_all_studies():
"""List all available cancer studies."""
return cbioportal_get("studies", {"pageSize": 500})
# Each study has:
# studyId: unique identifier (e.g., "brca_tcga")
# name: human-readable name
# description: dataset description
# cancerTypeId: cancer type abbreviation
# referenceGenome: GRCh37 or GRCh38
# pmid: associated publication
studies = get_all_studies()
print(f"Total studies: {len(studies)}")
# Common TCGA study IDs:
# brca_tcga, luad_tcga, coadread_tcga, gbm_tcga, prad_tcga,
# skcm_tcga, blca_tcga, hnsc_tcga, lihc_tcga, stad_tcga
# Filter for TCGA studies
tcga_studies = [s for s in studies if "tcga" in s["studyId"]]
print([s["studyId"] for s in tcga_studies[:10]])
3. 分子プロファイル
各研究には複数の分子プロファイル(変異、CNA、発現など)があります。
def get_molecular_profiles(study_id):
"""Get all molecular profiles for a study."""
return cbioportal_get(f"studies/{study_id}/molecular-profiles")
profiles = get_molecular_profiles("brca_tcga")
for p in profiles:
print(f" {p['molecularProfileId']}: {p['name']} ({p['molecularAlterationType']})")
# Alteration types:
# MUTATION_EXTENDED — somatic mutations
# COPY_NUMBER_ALTERATION — CNA (GISTIC)
# MRNA_EXPRESSION — mRNA expression
# PROTEIN_LEVEL — RPPA protein expression
# STRUCTURAL_VARIANT — fusions/rearrangements
4. 変異データ
def get_mutations(molecular_profile_id, entrez_gene_ids, sample_list_id=None):
"""Get mutations for specified genes in a molecular profile."""
body = {
"entrezGeneIds": entrez_gene_ids,
"sampleListId": sample_list_id or molecular_profile_id.replace("_mutations", "_all")
}
return cbioportal_post(
f"molecular-profiles/{molecular_profile_id}/mutations/fetch",
body
)
# BRCA1 Entrez ID is 672, TP53 is 7157, PTEN is 5728
mutations = get_mutations("brca_tcga_mutations", entrez_gene_ids=[7157]) # TP53
# Each mutation record contains:
# patientId, sampleId, entrezGeneId, gene.hugoGeneSymbol
# mutationType (Missense_Mutation, Nonsense_Mutation, Frame_Shift_Del, etc.)
# proteinChange (e.g., "R175H")
# variantClassification, variantType
# ncbiBuild, chr, startPosition, endPosition, referenceAllele, variantAllele
# mutationStatus (Somatic/Germline)
# alleleFreqT (tumor VAF)
import pandas as pd
df = pd.DataFrame(mutations)
print(df[["patientId", "mutationType", "proteinChange", "alleleFreqT"]].head())
print(f"\nMutation types:\n{df['mutationType'].value_counts()}")
5. コピー数変化データ
def get_cna(molecular_profile_id, entrez_gene_ids):
"""Get discrete CNA data (GISTIC: -2, -1, 0, 1, 2)."""
body = {
"entrezGeneIds": entrez_gene_ids,
"sampleListId": molecular_profile_id.replace("_gistic", "_all").replace("_cna", "_all")
}
return cbioportal_post(
f"molecular-profiles/{molecular_profile_id}/discrete-copy-number/fetch",
body
)
# GISTIC values:
# -2 = Deep deletion (homozygous loss)
# -1 = Shallow deletion (heterozygous loss)
# 0 = Diploid (neutral)
# 1 = Low-level gain
# 2 = High-level amplification
cna_data = get_cna("brca_tcga_gistic", entrez_gene_ids=[1956]) # EGFR
df_cna = pd.DataFrame(cna_data)
print(df_cna["value"].value_counts())
6. 変化頻度(OncoPrint形式)
def get_alteration_frequency(study_id, gene_symbols, alteration_types=None):
"""Compute alteration frequencies for genes across a cancer study."""
import requests, pandas as pd
# Get sample list
samples = requests.get(
f"{BASE_URL}/studies/{study_id}/sample-lists",
headers=HEADERS
).json()
all_samples_id = next(
(s["sampleListId"] for s in samples if s["category"] == "all_cases_in_study"), None
)
total_samples = len(requests.get(
f"{BASE_URL}/sample-lists/{all_samples_id}/sample-ids",
headers=HEADERS
).json())
# Get gene Entrez IDs
gene_data = requests.post(
f"{BASE_URL}/genes/fetch",
json=[{"hugoGeneSymbol": g} for g in gene_symbols],
headers=HEADERS
).json()
entrez_ids = [g["entrezGeneId"] for g in gene_data]
# Get mutations
mutation_profile = f"{study_id}_mutations"
mutations = get_mutations(mutation_profile, entrez_ids, all_samples_id)
freq = {}
for g_symbol, e_id in zip(gene_symbols, entrez_ids):
mutated = len(set(m["patientId"] for m in mutations if m["entrezGeneId"] == e_id))
freq[g_symbol] = mutated / total_samples * 100
return freq
# Example
freq = get_alteration_frequency("brca_tcga", ["TP53", "PIK3CA", "BRCA1", "BRCA2"])
for gene, pct in sorted(freq.items(), key=lambda x: -x[1]):
print(f" {gene}: {pct:.1f}%")
7. 臨床データ
def get_clinical_data(study_id, attribute_ids=None):
"""Get patient-level clinical data."""
params = {"studyId": study_id}
all_clinical = cbioportal_get(
"clinical-data/fetch",
params
)
# Returns list of {patientId, studyId, clinicalAttributeId, value}
# Clinical attributes include:
# OS_STATUS, OS_MONTHS, DFS_STATUS, DFS_MONTHS (survival)
# TUMOR_STAGE, GRADE, AGE, SEX, RACE
# Study-specific attributes vary
def get_clinical_attributes(study_id):
"""List all available clinical attributes for a study."""
return cbioportal_get(f"studies/{study_id}/clinical-attributes")
クエリのワークフロー
ワークフロー1:がん種における遺伝子変化プロファイル
import requests, pandas as pd
def alteration_profile(study_id, gene_symbol):
"""Full alteration profile for a gene in a cancer study."""
# 1. Get gene Entrez ID
gene_info = requests.post(
f"{BASE_URL}/genes/fetch",
json=[{"hugoGeneSymbol": gene_symbol}],
headers=HEADERS
).json()[0]
entrez_id = gene_info["entrezGeneId"]
# 2. Get mutations
mutations = get_mutations(f"{study_id}_mutations", [entrez_id])
mut_df = pd.DataFrame(mutations) if mutations else pd.DataFrame()
# 3. Get CNAs
cna = get_cna(f"{study_id}_gistic", [entrez_id])
cna_df = pd.DataFrame(cna) if cna else pd.DataFrame()
# 4. Summary
n_mut = len(set(mut_df["patientId"])) if not mut_df.empty else 0
n_amp = len(cna_df[cna_df["value"] == 2]) if not cna_df.empty else 0
n_del = len(cna_df[cna_df["value"] == -2]) if not cna_df.empty else 0
return {"mutations": n_mut, "amplifications": n_amp, "deep_deletions": n_del}
result = alteration_profile("brca_tcga", "PIK3CA")
print(result)
ワークフロー2:パンキャンサーでの遺伝子変異頻度
import requests, pandas as pd
def pan_cancer_mutation_freq(gene_symbol, cancer_study_ids=None):
"""Mutation frequency of a gene across multiple cancer types."""
studies = get_all_studies()
if cancer_study_ids:
studies = [s for s in studies if s["studyId"] in cancer_study_ids]
results = []
for study in studies[:20]: # Limit for demo
try:
freq = get_alteration_frequency(study["studyId"], [gene_symbol])
results.append({
"study": study["studyId"],
"cancer": study.get("cancerTypeId", ""),
"mutation_pct": freq.get(gene_symbol, 0)
})
except Exception:
pass
df = pd.DataFrame(results).sort_values("mutation_pct", ascending=False)
return df
ワークフロー3:変異状況別の生存分析
import requests, pandas as pd
def survival_by_mutation(study_id, gene_symbol):
"""Get survival data split by mutation status."""
# This workflow fetches clinical and mutation data for downstream analysis
gene_info = requests.post(
f"{BASE_URL}/genes/fetch",
json=[{"hugoGeneSymbol": gene_symbol}],
headers=HEADERS
).json()[0]
entrez_id = gene_info["entrezGeneId"]
mutations = get_mutations(f"{study_id}_mutations", [entrez_id])
mutated_patients = set(m["patientId"] for m in mutations)
clinical = cbioportal_get("clinical-data/fetch", {"studyId": study_id})
clinical_df = pd.DataFrame(clinical)
os_data = clinical_df[clinical_df["clinicalAttributeId"].isin(["OS_MONTHS", "OS_STATUS"])]
os_wide = os_data.pivot(index="patientId", columns="clinicalAttributeId", values="value")
os_wide["mutated"] = os_wide.index.isin(mutated_patients)
return os_wide
主なAPIエンドポイントの概要
| エンドポイント | 説明 |
|---|---|
GET /studies | すべての研究を一覧表示 |
GET /studies/{studyId}/molecular-profiles | 研究の分子プロファイル |
POST /molecular-profiles/{profileId}/mutations/fetch | 変異データを取得 |
POST /molecular-profiles/{profileId}/discrete-copy-number/fetch | CNAデータを取得 |
POST /molecular-profiles/{profileId}/molecular-data/fetch | 発現データを取得 |
GET /studies/{studyId}/clinical-attributes | 利用可能な臨床変数 |
GET /clinical-data/fetch | 臨床データ |
POST /genes/fetch | シンボルまたはEntrez IDによる遺伝子メタデータ |
GET /studies/{studyId}/sample-lists | サンプルリスト |
ベストプラクティス
- 研究IDを確認する:Swagger UIまたは
GET /studiesを使用して、正しい研究IDを確認します - サンプルリストを使用する:各研究には
allサンプルリストとそのサブセットがあります。必ず適切なものを指定してください - TCGAとGENIEの違い:TCGAデータは包括的ですが古く、GENIEにはより新しい臨床シーケンシングデータがあります
- Entrez遺伝子ID:APIではEntrez IDを使用します。シンボルから変換するには
/genes/fetchを使用してください - 404エラーに対処する:一部の分子プロファイルは、すべての研究で利用できるとは限りません
- レート制限:一括クエリでは間隔を空けてください。大規模な分析ではデータファイルのダウンロードを検討してください
データのダウンロード
大規模な分析では、研究データを直接ダウンロードします。
# Download TCGA BRCA data
wget https://cbioportal-datahub.s3.amazonaws.com/brca_tcga.tar.gz
追加リソース
- cBioPortal のウェブサイト: https://www.cbioportal.org/
- API Swagger UI: https://www.cbioportal.org/api/swagger-ui/index.html
- ドキュメント: https://docs.cbioportal.org/
- GitHub: https://github.com/cBioPortal/cbioportal
- データハブ: https://datahub.cbioportal.org/
- 引用文献: Cerami E et al. (2012) Cancer Discovery. PMID: 22588877
- API クライアント: https://docs.cbioportal.org/web-api-and-clients/
コメント
Markdown 対応