alterlab-gtex について
alterlab-gtexは、GTExの組織別発現と遺伝子制御データを調べる研究向けスキルです。GTEx REST APIやデータダウンロードを通じて、遺伝子発現、eQTL、sQTLを分析できます。
主な機能
- 01組織別の遺伝子発現中央値の取得
- 02遺伝子・変異単位のeQTL検索
- 03sQTL関連とeGeneの取得
- 04組織一覧と遺伝子IDの解決
- 05GTEx v10・v8データセットの利用
活用シーン
- 01GWAS変異が制御する遺伝子の特定
- 02組織間での遺伝子発現の比較
- 03組織特異的なeQTL・sQTL関連の検索
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ alterlab-ieu/ alterlab-academic-skills --skill alterlab-gtexインストール後、Claude Code で/alterlab-gtexを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
evals/evals.jsonreferences/api_reference.mdscripts/query_gtex.py詳細
GTEx データベース
概要
Genotype-Tissue Expression(GTEx)プロジェクトは、約1,000人の被験者から得られた、疾患のないヒトの54組織における組織特異的な遺伝子発現と遺伝的制御を研究するための包括的なリソースを提供します。最新リリースの GTEx v10 により、研究者は遺伝的バリアントが組織特異的な方法で遺伝子発現(eQTL)やスプライシング(sQTL)をどのように制御するかを理解できます。これは、GWAS の遺伝子座を解釈し、制御メカニズムを特定するうえで重要です。
主なリソース:
- GTEx Portal:https://gtexportal.org/
- GTEx API v2:https://gtexportal.org/api/v2/
- データのダウンロード:https://gtexportal.org/home/downloads/adult-gtex/
- ドキュメント:https://gtexportal.org/home/documentationPage
このスキルを使用する場面
以下の場合に GTEx を使用します。
- GWAS 遺伝子座の解釈:非コード GWAS バリアントが eQTL を介して制御する遺伝子を特定する
- 組織特異的発現:54のヒト組織における遺伝子発現レベルを比較する
- eQTL の共局在解析:GWAS シグナルと eQTL シグナルが同じ原因バリアントを共有しているか検証する
- マルチ組織 eQTL 解析:複数の組織で発現を制御するバリアントを見つける
- スプライシング QTL(sQTL):スプライシング比に影響するバリアントを特定する
- 組織特異性解析:関心のある遺伝子が発現する組織を判定する
- 遺伝子発現の調査:組織ごとの正規化発現レベル(TPM)を取得する
使用しない場面
| シナリオ | 代わりに使用 |
|---|---|
| キュレーション済みの形質とバリアントの関連、報告された形質、研究の由来情報 | alterlab-gwas |
| 集団アレル頻度、LoF 制約(pLI/LOEUF) | alterlab-gnomad |
| 遺伝子/転写産物モデル、VEP の影響、ID マッピング | alterlab-ensembl |
| 遺伝学的根拠に基づく標的と疾患のエビデンススコア(共局在/L2G を含む) | alterlab-opentargets |
| 単一細胞発現アトラス(細胞型解像度) | alterlab-cellxgene |
主な機能
1. GTEx REST API v2
ベース URL:https://gtexportal.org/api/v2/
API は JSON を返し、認証は不要です。すべてのエンドポイントでページネーションがサポートされています。
import requests
BASE_URL = "https://gtexportal.org/api/v2"
def gtex_get(endpoint, params=None):
"""Make a GET request to the GTEx API."""
url = f"{BASE_URL}/{endpoint}"
response = requests.get(url, params=params, headers={"Accept": "application/json"})
response.raise_for_status()
return response.json()
2. 組織別の遺伝子発現
import requests
import pandas as pd
def get_gene_expression_by_tissue(gencode_id, dataset_id="gtex_v10"):
"""Get median gene expression across all tissues (versioned GENCODE ID required)."""
url = "https://gtexportal.org/api/v2/expression/medianGeneExpression"
params = {
"gencodeId": gencode_id,
"datasetId": dataset_id,
"itemsPerPage": 100
}
response = requests.get(url, params=params)
data = response.json()
records = data.get("data", [])
df = pd.DataFrame(records)
if not df.empty:
# v2 returns tissueSiteDetailId (not a display-name column), median, unit, geneSymbol
df = df[["geneSymbol", "tissueSiteDetailId", "median", "unit"]].sort_values(
"median", ascending=False
)
return df
# Example: get expression of APOE across tissues (v10 = GENCODE v39; APOE keeps .10 here)
df = get_gene_expression_by_tissue("ENSG00000130203.10") # APOE GENCODE ID
print(df.head(10))
# Output: tissueSiteDetailId, median TPM, sorted by highest expression
3. eQTL の検索
import requests
import pandas as pd
def query_eqtl(gene_id, tissue_id=None, dataset_id="gtex_v10"):
"""Query significant eQTLs for a gene, optionally filtered by tissue."""
url = "https://gtexportal.org/api/v2/association/singleTissueEqtl"
params = {
"gencodeId": gene_id,
"datasetId": dataset_id,
"itemsPerPage": 250
}
if tissue_id:
params["tissueSiteDetailId"] = tissue_id
all_results = []
page = 0
while True:
params["page"] = page
response = requests.get(url, params=params)
data = response.json()
results = data.get("data", [])
if not results:
break
all_results.extend(results)
if len(results) < params["itemsPerPage"]:
break
page += 1
df = pd.DataFrame(all_results)
if not df.empty:
df = df.sort_values("pValue", ascending=True)
return df
# Example: Find eQTLs for PCSK9 (v10 GENCODE ID — version suffix must match the dataset)
df = query_eqtl("ENSG00000169174.11")
# v2 single-tissue eQTL fields: snpId, variantId, tissueSiteDetailId, nes, pValue, gencodeId
# (nes = normalized effect size of the alt allele; there is no separate slope/qval/maf here)
print(df[["snpId", "tissueSiteDetailId", "nes", "pValue", "gencodeId"]].head(20))
4. バリアント別の単一組織 eQTL
import requests
def query_variant_eqtl(variant_id, tissue_id=None, dataset_id="gtex_v10"):
"""Get all eQTL associations for a specific variant."""
url = "https://gtexportal.org/api/v2/association/singleTissueEqtl"
params = {
"variantId": variant_id, # e.g., "chr1_55516888_G_GA_b38"
"datasetId": dataset_id,
"itemsPerPage": 250
}
if tissue_id:
params["tissueSiteDetailId"] = tissue_id
response = requests.get(url, params=params)
return response.json()
# GTEx variant ID format: chr{chrom}_{pos}_{ref}_{alt}_b38
# Example: "chr17_43094692_G_A_b38"
5. マルチ組織 eQTL(eGenes)
import requests
def get_egenes(tissue_id, dataset_id="gtex_v10"):
"""Get all eGenes (genes with at least one significant eQTL) in a tissue."""
url = "https://gtexportal.org/api/v2/association/egene"
params = {
"tissueSiteDetailId": tissue_id,
"datasetId": dataset_id,
"itemsPerPage": 500
}
all_egenes = []
page = 0
while True:
params["page"] = page
response = requests.get(url, params=params)
data = response.json()
batch = data.get("data", [])
if not batch:
break
all_egenes.extend(batch)
if len(batch) < params["itemsPerPage"]:
break
page += 1
return all_egenes
# Example: all eGenes in whole blood
egenes = get_egenes("Whole_Blood")
print(f"Found {len(egenes)} eGenes in Whole Blood")
6. 組織の一覧
import requests
def get_tissues(dataset_id="gtex_v10"):
"""Get all available tissues with metadata."""
url = "https://gtexportal.org/api/v2/dataset/tissueSiteDetail"
params = {"datasetId": dataset_id, "itemsPerPage": 100}
response = requests.get(url, params=params)
return response.json()["data"]
tissues = get_tissues()
# Key fields: tissueSiteDetailId, tissueSiteDetail, colorHex, samplingSite
# Common tissue IDs:
# Whole_Blood, Brain_Cortex, Liver, Kidney_Cortex, Heart_Left_Ventricle,
# Lung, Muscle_Skeletal, Adipose_Subcutaneous, Colon_Transverse, ...
7. sQTL(スプライシング QTL)
import requests
def query_sqtl(gene_id, tissue_id=None, dataset_id="gtex_v10"):
"""Query significant sQTLs for a gene."""
url = "https://gtexportal.org/api/v2/association/singleTissueSqtl"
params = {
"gencodeId": gene_id,
"datasetId": dataset_id,
"itemsPerPage": 250
}
if tissue_id:
params["tissueSiteDetailId"] = tissue_id
response = requests.get(url, params=params)
return response.json()
クエリのワークフロー
ワークフロー 1:eQTL を用いた GWAS バリアントの解釈
- GWAS バリアントを特定する(rs ID または染色体上の位置)
- GTEx のバリアント ID 形式に変換する(
chr{chrom}_{pos}_{ref}_{alt}_b38) - すべての組織における、そのバリアントの eQTL 関連を照会する
- 効果の方向を確認する:GWAS のリスクアレルは eQTL の効果アレルと同じか?
- 組織に優先順位を付ける:疾患に生物学的に関連する組織を選択する
- 全要約統計量を使用して
coloc(R パッケージ)で共局在解析を検討する
import requests, pandas as pd
def interpret_gwas_variant(variant_id, dataset_id="gtex_v10"):
"""Find all genes regulated by a GWAS variant."""
url = "https://gtexportal.org/api/v2/association/singleTissueEqtl"
params = {"variantId": variant_id, "datasetId": dataset_id, "itemsPerPage": 500}
response = requests.get(url, params=params)
data = response.json()
df = pd.DataFrame(data.get("data", []))
if df.empty:
return df
return df[["geneSymbol", "tissueSiteDetailId", "nes", "pValue"]].sort_values("pValue")
# Example: rs2228145 (IL6R p.Asp358Ala). Resolve an rsID to the GTEx ID with
# GET /dataset/variant?snpId=rs2228145&datasetId=gtex_v10 -> "chr1_154454494_A_C_b38"
results = interpret_gwas_variant("chr1_154454494_A_C_b38")
if not results.empty:
print(results.groupby("geneSymbol")["tissueSiteDetailId"].count().sort_values(ascending=False))
ワークフロー 2:遺伝子発現アトラス
- すべての組織における遺伝子の発現中央値を取得する
- 主な発現部位を特定する
- 疾患に関連する組織と比較する
- 統計的な比較のために生データをダウンロードする
ワークフロー 3:組織特異的 eQTL 解析
- 疾患に関連する組織を選択する
- その組織におけるすべての eGene を照会する
- GWAS で有意な遺伝子座と照合する
- 共局在するシグナルを特定する
主要な API エンドポイント
| エンドポイント | 説明 |
|---|---|
/expression/medianGeneExpression | 遺伝子の組織別 TPM 中央値 |
/expression/geneExpression | 組織ごとの発現量の全分布 |
/association/singleTissueEqtl | 有意な eQTL 関連 |
/association/singleTissueSqtl | 有意な sQTL 関連 |
/association/egene | 組織内の eGene |
/dataset/tissueSiteDetail | メタデータ付きの利用可能な組織 |
/reference/gene | 遺伝子のメタデータ。シンボルをデータセットのバージョン付き GENCODE ID に解決します |
/dataset/variant | snpId(rsID)または variantId によるバリアント検索。b38 GTEx ID を返します |
利用可能なデータセット
| ID | 説明 |
|---|---|
gtex_v10 | GTEx v10(現行版。946 人のドナー、54 組織、うち 50 組織で eQTL をマッピング。GENCODE v39) |
gtex_v8 | GTEx v8(948 人のドナー、838 人が遺伝子型判定済み。54 組織中 49 組織で eQTL を取得。GENCODE v26)。旧版ですが、広く引用されています |
ベストプラクティス
- GENCODE のバージョンサフィックスはデータセットと一致させる必要があります(最大の落とし穴):v10 は GENCODE v39、v8 は GENCODE v26 に対応しており、同じ遺伝子でも各バージョンで
.versionが異なります。PCSK9 は v10 ではENSG00000169174.11、v8 では.10です。間違ったサフィックスを指定すると、エラーなく結果が 0 件になります。/reference/gene?geneId=SYMBOL&gencodeVersion=v39でデータセットに適した ID を解決してください(v8 ではv26を使用)。発現および QTL のエンドポイントが受け付けるのは、バージョン付きのgencodeId値のみです。APOEのような単独のシンボルを指定した場合も、結果は 0 件になります。 - 必ず
datasetIdを指定してください:一部のエンドポイント(/association/singleTissueSqtl、/dataset/tissueSiteDetail、/dataset/variant)は、省略すると現在もgtex_v8がデフォルトで使われるため、気付かないまま v8 のデータを取得します。その場合、v10 の GENCODE ID では何も返されません。 - GTEx のバリアント ID は
chr{chrom}_{pos}_{ref}_{alt}_b38形式(GRCh38)で、rs ID とは異なります。 - ページネーションを処理してください:すべての eGene など、大規模なクエリではページを順に取得する必要があります。
- 組織の命名規則:API 呼び出しには表示名ではなく、
tissueSiteDetailId(例:Whole_Blood)を使用してください。 - FDR 閾値:GTEx は FDR < 0.05 で eGene/eQTL を判定します。単一組織の eQTL/sQTL レスポンスは、すでに有意なペアに絞り込まれており、
pValueとnesを返します(行ごとのqvalはありません)。遺伝子ごとのqValueは/association/egeneエンドポイントにあります。 - 効果量:QTL レスポンスのフィールドは
slopeではなくnes(代替アレルの正規化効果量)です。nesが正の場合、代替アレルで発現量が高くなります。
データのダウンロード(大規模解析向け)
ゲノム全体の解析では、API を使う代わりに、完全な要約統計量をダウンロードしてください。
# All significant eQTLs (v10)
wget https://storage.googleapis.com/adult-gtex/bulk-qtl/v10/single-tissue-cis-qtl/GTEx_Analysis_v10_eQTL.tar
# Gene read counts (use ..._gene_tpm.gct.gz for TPM, ..._gene_median_tpm.gct.gz for per-tissue medians)
wget https://storage.googleapis.com/adult-gtex/bulk-gex/v10/rna-seq/GTEx_Analysis_v10_RNASeQCv2.4.2_gene_reads.gct.gz
追加リソース
- GTEx ポータル:https://gtexportal.org/
- API ドキュメント:https://gtexportal.org/api/v2/
- データのダウンロード:https://gtexportal.org/home/downloads/adult-gtex/
- GitHub:https://github.com/broadinstitute/gtex-pipeline
- 引用文献:GTEx Consortium(2020)Science. PMID: 32913098
スクリプト
scripts/query_gtex.py — GTEx Portal API v2 用の実行可能なヘルパー(キー不要):
python scripts/query_gtex.py gene APOE # symbol -> versioned GENCODE ID for gtex_v10
python scripts/query_gtex.py expression ENSG00000130203.10
python scripts/query_gtex.py eqtl ENSG00000169174.11 --tissue Liver # v10 GENCODE ID
python scripts/query_gtex.py tissues
コメント
Markdown 対応