关于 gtex-database
gtex-database 是用于查询 GTEx 人体组织基因表达及遗传调控数据的技能,面向研究组织特异性表达、eQTL 和 sQTL 的研究者。它提供 API 查询流程,也说明大规模分析所需的数据下载方式。
主要功能
- 01查询跨组织基因表达量
- 02按基因或变异检索 eQTL
- 03查询 sQTL 与组织 eGene
- 04获取组织元数据
- 05提供 GTEx v10 与 v8 数据访问说明
适用场景
- 01解释 GWAS 位点可能调控的基因
- 02比较基因在不同组织的表达
- 03查找组织特异性遗传调控信号
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ leonchaox/ qinyan-academic-skills --skill gtex-database安装后在 Claude Code 中输入/gtex-database确认已加载。
附带文件references/api_reference.md
详细介绍
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 位点解读:通过 eQTL 确定非编码 GWAS 变异调控的基因
- 组织特异性表达:比较基因在 54 种人体组织中的表达水平
- eQTL 共定位:检验 GWAS 信号和 eQTL 信号是否具有相同的因果变异
- 多组织 eQTL 分析:查找可在多个组织中调控表达的变异
- 剪接 QTL(sQTL):识别影响剪接比例的变异
- 组织特异性分析:确定哪些组织表达目标基因
- 基因表达探索:获取各组织中标准化后的表达水平(TPM)
核心功能
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(gene_id_or_symbol, dataset_id="gtex_v10"):
"""Get median gene expression across all tissues."""
url = "https://gtexportal.org/api/v2/expression/medianGeneExpression"
params = {
"gencodeId": gene_id_or_symbol,
"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:
df = df[["tissueSiteDetailId", "tissueSiteDetail", "median", "unit"]].sort_values(
"median", ascending=False
)
return df
# Example: get expression of APOE across tissues
df = get_gene_expression_by_tissue("ENSG00000130203.10") # APOE GENCODE ID
# Or use gene symbol (some endpoints accept both)
print(df.head(10))
# Output: tissue name, 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("pval", ascending=True)
return df
# Example: Find eQTLs for PCSK9
df = query_eqtl("ENSG00000169174.14")
print(df[["snpId", "tissueSiteDetailId", "slope", "pval", "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", "slope", "pval", "maf"]].sort_values("pval")
# Example
results = interpret_gwas_variant("chr1_154453788_A_T_b38")
print(results.groupby("geneSymbol")["tissueSiteDetailId"].count().sort_values(ascending=False))
工作流 2:基因表达图谱
- 获取基因在所有组织中的表达中位数
- 确定主要表达部位
- 与疾病相关组织进行比较
- 下载原始数据以进行统计比较
工作流 3:组织特异性 eQTL 分析
- 选择与疾病相关的组织
- 查询该组织中的所有 eGenes
- 与 GWAS 显著位点进行交叉比对
- 识别共定位信号
主要 API 端点
| 端点 | 描述 |
|---|---|
/expression/medianGeneExpression | 基因在各组织中的 TPM 中位数 |
/expression/geneExpression | 各组织中表达的完整分布 |
/association/singleTissueEqtl | 显著 eQTL 关联 |
/association/singleTissueSqtl | 显著 sQTL 关联 |
/association/egene | 某组织中的 eGenes |
/dataset/tissueSiteDetail | 含元数据的可用组织 |
/reference/gene | 基因元数据(GENCODE ID、坐标) |
/variant/variantPage | 按 rsID 或位置查询变异 |
可用数据集
| ID | 描述 |
|---|---|
gtex_v10 | GTEx v10(当前版本;约 960 名供体,54 种组织) |
gtex_v8 | GTEx v8(838 名供体,49 种组织)——版本较旧,但被广泛引用 |
最佳实践
- 使用 GENCODE ID(例如,
ENSG00000130203.10)查询基因;对于某些端点,.version后缀很重要 - GTEx 变异 ID 的格式为
chr{chrom}_{pos}_{ref}_{alt}_b38(GRCh38)——与 rs ID 不同 - 处理分页:大型查询(例如,所有 eGene)需要逐页迭代
- 组织命名规范:API 调用应使用
tissueSiteDetailId(例如,Whole_Blood),而非显示名称 - FDR 校正:GTEx 使用 FDR < 0.05(q 值)作为 eQTL 的显著性阈值
- 效应等位基因:
slope字段表示替代等位基因的效应;正值 = 替代等位基因对应更高的表达量
数据下载(用于大规模分析)
对于全基因组分析,请下载完整的汇总统计数据,而不要使用 API:
# All significant eQTLs (v10)
wget https://storage.googleapis.com/adult-gtex/bulk-qtl/v10/single-tissue-cis-qtl/GTEx_Analysis_v10_eQTL.tar
# Normalized expression matrices
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
评论
支持 Markdown