Codar
下载

GO 与 KEGG 功能富集分析

GO 与 KEGG 富集分析回答「这批基因集中在哪些功能或通路上」。它属于过表征分析(ORA):给定一份基因列表,如差异基因、WGCNA 模块基因或亚群 marker,以本实验检测到的基因为背景,用超几何检验判断某个 GO 条目或 KEGG 通路中的列表基因是否多于随机预期。GO 分为生物过程、细胞组分、分子功能三个本体,层级细、覆盖广;KEGG 以代谢和信号通路为单位。R 中常用 clusterProfiler,网页工具有 DAVID、Metascape。

什么时候用

  • 解释 RNA-seq 或芯片差异表达基因主要涉及哪些生物过程和通路
  • 为 WGCNA 模块、单细胞亚群 marker 等基因集赋予功能标签
  • 并列比较多组基因列表,如上调与下调、不同聚类簇的功能差异
  • 对蛋白组、甲基化等其他组学得到的基因层面结果做功能注释
  • 从差异结果中挑选值得优先验证的通路和代表基因
  • 对比不同处理、时间点或细胞类型的差异基因,找出共有和特有功能

不适合的情况

  • 差异基因只有个位数或十几个时,ORA 几乎没有统计效力,应改用 GSEA
  • 想比较每个样本的通路活性高低,应使用 ssGSEA 或 GSVA 打分
  • 把富集结果写成通路被激活或抑制,ORA 本身不提供方向信息

需要准备的数据

目标基因列表
一行一个基因,统一为 SYMBOL、ENTREZID 或 ENSEMBL 中的一种,Ensembl ID 去掉版本号
背景基因集
通常是本实验中检测到并通过表达过滤的全部基因,而非全基因组注释
物种注释
人用 org.Hs.eg.db、小鼠用 org.Mm.eg.db;KEGG 物种代码如 hsa、mmu
分组信息(可选)
上调、下调或多个簇的列表,用于 compareCluster 并列比较

分析步骤

  1. 1

    确定基因列表

    按明确阈值从差异结果中取基因,例如 padj<0.05 且 |log2FC|>1,并把上调和下调分开保存。记录阈值和基因数;基因只有几十个以下时富集结果波动很大,需要在报告中说明。

  2. 2

    统一基因 ID

    用 clusterProfiler 的 bitr() 把 SYMBOL 转为 ENTREZID,enrichKEGG 默认需要 Entrez ID。检查转换失败的比例,若超过一成,多半是混入了版本号、旧基因名或物种选错。

  3. 3

    设定背景基因

    把表达过滤后保留的全部基因传给 universe 参数。若用全基因组作背景,组织中本就高表达的通路会显得格外显著,这是结果「满屏免疫通路」的常见原因之一。

  4. 4

    运行 GO 富集

    enrichGO 指定 OrgDb、keyType 和 ont(BP、CC、MF 或 ALL),pAdjustMethod 常用 BH。核对 GeneRatio 的分母:它应是列表中能注释到 GO 的基因数,而不是原始输入数。

  5. 5

    运行 KEGG 富集

    enrichKEGG 将 organism 设为 hsa 等物种代码。该函数需要在线访问 KEGG,网络不可用时会报错;离线环境可用本地整理的通路-基因对应表,交给 enricher() 做通用富集。

  6. 6

    去除冗余条目

    GO 条目层级重叠严重,可用 simplify() 按语义相似度合并相近条目,常用 cutoff 为 0.7;也可用 emapplot 把共享基因多的条目聚成主题,再从每个主题挑代表条目。

  7. 7

    出图与导出

    dotplot 或 barplot 展示排名靠前的条目,cnetplot 展示基因与条目的对应关系。导出完整结果表,保留 ID、Description、GeneRatio、BgRatio、p.adjust、geneID 等列,便于复核。

关键参数与决策

pvalueCutoff 与 qvalueCutoff

默认 pvalueCutoff 0.05、qvalueCutoff 0.2,过滤基于校正后 P 值。报告以 p.adjust 为准;结果为空时不要改用原始 P 值凑结果,先检查列表和背景。

minGSSize 与 maxGSSize

默认 10 和 500,用来排除过小和过大的条目。过大的条目如「代谢过程」信息量低,过小的条目命中一两个基因就可能显著,必要时可收紧到 15–300 左右。

ont 本体选择

BP 最常用于解释生物学过程;CC 和 MF 适合蛋白组或亚细胞定位类问题。选 ALL 时三个本体一起做多重校正,条目数明显增加,图上需按本体分面展示。

上调和下调是否分开

合并做只能得到「这些功能有变化」,方向相反的信号还会互相稀释。分开做可以看出哪些功能集中在上调基因、哪些集中在下调基因,更便于写机制推断。

背景 universe

背景决定每个条目的期望命中数。bulk 数据建议用过滤后检测到的基因;单细胞数据建议用在一定比例细胞中表达的基因,不要用全部注释基因。

常见错误

  • 不设背景基因,默认使用注释库全部基因:组织中本就高表达的通路被系统性高估,结论反映的是组织背景而不是处理效应。
  • 报告原始 P 值而非校正后 P 值:GO 条目数以千计,未校正的显著结果中假阳性比例很高,审稿时容易被直接指出。
  • 把「Pathways in cancer」这类大而泛的 KEGG 通路当成核心发现:它们包含大量通用信号分子,几乎任何基因列表都容易命中。
  • ID 转换静默丢失基因:人类基因全大写、小鼠首字母大写,大小写混用或带 Ensembl 版本号时,一部分基因会悄悄掉出分析。
  • 把富集到的通路写成被激活或被抑制:ORA 只说明基因集中出现,方向需要靠上下调分开分析或 GSEA 判断。
  • 只截取前 10 个条目画图却不交代筛选规则:读者无法判断是否经过挑选,应附完整结果表并写明排序依据。

结果怎么看

富集气泡图(dotplot)

横轴通常是 GeneRatio,点的大小是命中基因数,颜色是 p.adjust。优先关注颜色深且 GeneRatio 高的条目;如果靠前的全是包含上千基因的宽泛条目,说明需要收紧 maxGSSize 或先去冗余。

富集结果表

GeneRatio 是命中数除以列表中有注释的基因数,BgRatio 是条目基因数除以背景中有注释的基因数,两者之比即富集倍数。geneID 列列出命中基因,可回查结果是否由同一基因家族驱动。

基因-条目网络图(cnetplot)

展示哪些基因同时参与多个条目。若多个显著条目几乎共享同一批基因,它们代表的是同一个信号,写结果时应合并叙述,而不是当作多项独立发现。

条目关系图(emapplot)

节点是条目,边表示共享基因。成团的节点构成一个功能主题,便于把几十个条目归纳成两三条主线;孤立且命中基因很少的节点,往往是不稳定的偶然结果。

KEGG 通路图

用 pathview 等工具把 log2FC 映射到 KEGG 通路图的基因框上,红绿表示上下调。看变化基因集中在通路的上游受体、中间激酶还是下游效应分子,可以帮助判断哪一段信号最可能受影响。

和相近方法怎么选

ORA 富集与 GSEA

ORA 只使用阈值筛出的基因,简单直观,适合差异基因较多、信号明确的情况;GSEA 使用全部基因的排序,不依赖阈值,能捕捉许多基因同时小幅变化的通路,并给出方向。差异基因很少时优先用 GSEA。

GO、KEGG 与 Reactome

GO 覆盖最广但层级冗余,需要去冗余;KEGG 通路图直观,以代谢和经典信号通路为主;Reactome 注释层级更细,可用 ReactomePA 包分析。论文中常 GO 与 KEGG 并报,Reactome 作为补充。

clusterProfiler 与 DAVID、Metascape

clusterProfiler 可脚本化、可自定义背景、便于复现;DAVID 和 Metascape 是网页工具,上手快,但注释版本随网站更新,复现时需记录访问日期和数据库版本,背景基因的设置也不如脚本灵活。

常见问题

GO 富集分析结果为空怎么办?

先查三点:ID 转换是否大量失败,keyType 是否与实际 ID 类型一致,基因列表是否过短。若都正常,说明这批基因功能较分散,可以重新审视差异阈值或改用 GSEA,而不是把筛选条件换成原始 P 值。

GeneRatio 和 BgRatio 分别是什么意思?

GeneRatio 是列表中落入该条目的基因数除以列表中有注释的基因总数;BgRatio 是该条目在背景中的基因数除以背景中有注释的基因总数。GeneRatio 明显高于 BgRatio 才说明该条目在列表中富集。

KEGG 富集一定要用 Entrez ID 吗?

enrichKEGG 默认 keyType 为 kegg,对人类而言就是 Entrez ID,所以通常先用 bitr 转换。结果出来后可用 setReadable 把 Entrez ID 转回基因符号,便于阅读和作图。

上调和下调基因要分开做富集吗?

多数情况下建议分开。合并后无法区分功能来自哪个方向,方向相反的基因还可能互相稀释。若想在一张图里看全貌,可以用 compareCluster 把上调、下调结果并列展示。

做富集分析的基因数多少合适?

没有硬性标准,经验上几十到几百个基因结果较稳定。少于 20 个时单个基因就能左右条目是否显著;超过两三千个时大条目几乎都会显著,此时应收紧阈值或改用 GSEA。

在 Codar 里怎么做

在 Codar 中,上传差异基因表或基因列表,说明物种和比较方向即可。Codar 会先确认基因 ID 类型、背景基因和筛选阈值,再完成 GO 三个本体与 KEGG 通路的富集分析,需要时按上调、下调分别计算并合并冗余条目。交付富集结果表、气泡图、条形图、基因-条目网络图、报告和可复现的 R 脚本。

可以这样提问
这是我的 DESeq2 结果(人,肿瘤 vs 癌旁),请按 padj<0.05、|log2FC|>1 分上下调做 GO 和 KEGG 富集,背景用检测到的基因。
了解网络与系统生物学插件

相关实践案例