Gene Ontology(GO) 是描述基因功能的标准化词汇体系。它解决的问题是:不同研究者用不同措辞描述同一功能,导致无法比较和汇总。GO 提供一套受控词汇和层级结构,让「这个基因做什么」变成可计算的信息。它是功能富集分析的基础设施。
三大本体
| 本体 | 回答 | 例子 |
|---|---|---|
| Molecular Function(MF) | 分子层面做什么 | protein kinase activity、ATP binding |
| Biological Process(BP) | 参与什么生物过程 | cell cycle、apoptotic process |
| Cellular Component(CC) | 在哪里发挥作用 | nucleus、plasma membrane |
三者是有向无环图(DAG)而非简单树:一个术语可以有多个父术语。层级越深越具体,「is_a」和「part_of」关系支持向上传播——注释到 protein tyrosine kinase activity 的基因,自动也属于 kinase activity。
证据代码:最该先看的字段
每条 GO 注释都带证据代码,说明这个注释是怎么来的。可靠性差别巨大:
| 代码 | 含义 | 可靠性 |
|---|---|---|
| EXP / IDA / IPI / IMP / IGI | 实验证据(直接测定、突变表型等) | 最高 |
| TAS / IC | 作者陈述 / 策展人推断 | 较高 |
| ISS / ISO / ISA | 基于序列或结构相似性推断 | 中 |
| IBA | 基于系统发生树推断 | 中 |
| IEA | 电子注释,无人工审核 | 最低,但占比最大 |
IEA 注释占 GO 数据的绝大多数。做严肃分析时,应考虑只用实验证据支持的注释,或至少在报告中说明包含了 IEA。
富集分析
from gprofiler import GProfiler
gp = GProfiler(return_dataframe=True)
res = gp.profile(
organism="hsapiens",
query=["EGFR", "KRAS", "BRAF", "MAP2K1", "MAPK1", "SOS1", "GRB2"],
sources=["GO:BP", "GO:MF", "GO:CC"],
background=background_gene_list, # ← 关键,见下文
no_evidences=False,
)
print(res[["source", "name", "p_value", "term_size",
"query_size", "intersection_size"]].head(15))
富集分析最常犯的四个错误
- 背景基因集选错。这是最严重也最常见的错误。做 RNA-seq 分析时,背景应该是「在该实验中被检测到的所有基因」,而不是全基因组。用全基因组做背景会系统性地富集出「高表达基因常见的功能」,产生大量假阳性。
- 忽略术语冗余:父子术语高度重叠,富集结果里常出现十几个说的是同一件事的术语。应该用 REVIGO 等工具做语义去冗余,或只报告代表性术语。
- 只看 p 值不看效应量:一个包含 3000 个基因的宽泛术语(如
metabolic process)很容易显著,但几乎没有信息量。应同时看 term_size(术语大小)和 fold enrichment,优先关注中等大小(20~500 个基因)且富集倍数高的术语。 - 研究偏倚未考虑:被研究得多的基因注释更完整、更具体,冷门基因可能只有宽泛的 IEA 注释。这会让富集结果偏向热门通路。
ORA 与 GSEA 的区别
- ORA(过表示分析):先按阈值选出一组基因(如差异表达的),再检验这组基因在某功能上是否过表示。简单直接,但结果对阈值敏感。
- GSEA(基因集富集分析):用全部基因的排序(如按 log2FC),检验某个基因集是否集中在排序的两端。不需要设阈值,且能捕捉「许多基因都有小幅协同变化」的情况——这在真实生物学中很常见,而 ORA 会完全漏掉。
- 建议:有连续的排序信息时优先用 GSEA(见 263《MSigDB》);只有基因列表时用 ORA。
上手提示
- 先看证据代码,IEA 是无人工审核的电子注释,占比最大;
- 背景基因集必须是「实验中检测到的基因」而非全基因组,这是最常见的致命错误;
- 同时看术语大小与富集倍数,宽泛术语显著但无信息量;
- 有排序信息时优先用 GSEA,它能捕捉协同小幅变化。
延伸资源
- 基因集资源:263《MSigDB》;注释整合:257《InterPro》;
- 通路:260《Reactome》、261《KEGG》。