跳到正文
百沐一下百沐一下
本节目录

结果怎么读:PCA / 火山 / 热图 / 富集图

跟完这篇,您能拿到分析跑出来的四类常见图,逐一「读一遍」,判断哪张在正常范围内、哪张暗示数据或分组有问题、哪张其实只是好看的摆设,最后套用一组通用的三问,给每张图下一个能不能写进结果的结论。

看图和跑分析是两件事。分析工具会一声不吭地把图画出来,但图对不对、能不能支撑结论,得您自己判断。下面按四类图各讲一遍「先看哪里」,每一节都给一段可照做的自查代码,最后给一套拿到任何一张图都能套用的三个问题。

四类图速览

先建立一张全局地图。拿到一批结果图,先对照这张表定位每张图的作用和最该警惕的地方,再进到对应小节细看。

一句话作用先看哪里危险信号
PCA 图无监督质检,看样本整体格局分组是否分开、有无离群点样本按批次而非分组分开
火山图一眼看差异「多大 + 多显著」形状、左右是否平衡、阈值线点全堆在极高显著度或全落一侧
热图展示一批基因在样本间的相对高低色标含义、有无块结构只挑显著基因画,拿展示当证据
富集气泡图差异基因集中在哪些通路padj、命中基因数、是否讲得通清一色泛化大类、命中基因极少

PCA 图看什么

PCA(主成分分析)是无监督的:它不知道您的分组,只把样本按整体表达的最大变异方向铺开。所以它最适合用来做「上手第一眼」的质检——看样本之间的大格局有没有毛病。

按这个顺序看:

  1. 分组是否分开:同一组的样本应该聚在一起,不同组分开。重点看主要的分离方向(一般是横轴 PC1)是不是对应您的实验分组,比如处理 vs 对照。
  2. 每根轴解释了多少变异:轴标题上的百分比(如 PC1: 62% variance)。PC1 占比越高,说明第一主成分抓住的变异越多;两根轴加起来太低,说明变异很分散,图上的距离要少当真。
  3. 有没有离群样本:某个点明显远离它所在的组。可能是质量问题、样本标签弄反、也可能是真实的生物学异常。先别急着删——回头查这个样本的 QC 指标和元数据,确认原因再决定。
  4. 是不是批次在主导:如果样本是按测序批次、送样日期这类技术因素分开,而不是按生物学分组分开,说明批次效应盖过了真正想看的差异,需要在分析模型里校正(例如把 batch 放进设计公式)。

一段常见的画法(对方差稳定化后的数据做 PCA):

library(DESeq2)
vsd <- vst(dds, blind = TRUE)          # 方差稳定化,避免高表达基因主导
plotPCA(vsd, intgroup = "condition")   # 按分组上色,看样本铺开的格局

对着上图排查,常见现象大多能对号入座:

您看到的现象可能的原因下一步
同组不聚、组间不分效应弱、样本量小,或分组标签错了核对元数据与分组表,别只凭 PCA 下结论
某个点远离本组质量差、标签弄反,或真实的生物学异常查该样本 QC 与元数据,确认原因再决定去留
样本按批次 / 日期分开批次效应主导了整体变异在设计公式里校正 batch,或先做批次校正
两轴百分比之和很低变异分散,没有主导方向图上距离少当真,结论交给差异分析

一个提醒:分组在 PCA 上没完全分开,不一定就是坏结果。效应本身弱、样本量小,都可能让分组挨得比较近。PCA 看的是全局最大变异,和后面差异分析的结论不是一回事,别拿它当最终判决。批次问题的细致排查见 教程:批次效应怎么处理

火山图看什么

火山图把「变化多大」和「变化多显著」放在一张图上:横轴是 log2 fold change(变化幅度与方向),纵轴一般是 -log10(padj)(越往上越显著)。

按这个顺序看:

  • 整体形状像不像火山:底部宽(大量基因变化小、不显著,挤在中间偏下),越往上越尖越少。如果一大片点都堆在很高的显著度上,往往是 p 值被低估了——比如没做多重检验校正,或样本存在伪重复。
  • 两侧上下调是否大致平衡:左右两边的显著点数量差不多是常态。如果几乎全落在一侧,先怀疑归一化或文库大小的问题,再考虑是不是真有全局性偏移。
  • 阈值线画在哪:常用组合是 padj < 0.05 配 |log2FC| > 1(也就是 2 倍变化)。这是常用惯例、不是铁律——效应弱的数据可以放宽 log2FC,噪声大的可以收紧 padj,按您的数据和生物学背景调。
  • 关心的基因落在哪:如果有先验预期的标志基因,看它们是否落在显著区、方向对不对,这是快速的「合理性自检」。

不用只靠眼睛,几行代码就能把「形状」量化出来自查:

# 以 DESeq2 结果为例,快速核对上下调数量与方向
res <- results(dds, contrast = c("condition", "treated", "control"))
sig <- subset(res, padj < 0.05 & abs(log2FoldChange) > 1)   # 阈值按数据调
table(sign(sig$log2FoldChange))   # -1 / 1 两侧数量应大致平衡
summary(res$padj)                 # 看 padj 分布,别一大片贴近 0

contrast = c("condition", "treated", "control") 明确了 treated 相对 control:此时 log2FC 为正代表 treated 更高。方向读反是最常见也最尴尬的错误,画图前务必把参照组认清楚。对着输出排查:

您看到的现象怀疑什么
显著点几乎全落在一侧归一化 / 文库大小问题,或真有全局性偏移
一大片点顶到极高显著度未做多重检验校正,或存在伪重复
阈值内基因数为零或成千上万阈值定得过严 / 过松,回到数据背景重定

火山图的完整画法与配色见 教程:火山图怎么做

热图看什么

热图适合展示「一批基因在各样本间的相对高低」。画之前通常会按行做标准化(z-score),目的是看每个基因在样本之间的相对模式,而不是绝对表达量——不做标准化的话,高丰度基因会把颜色全占了。

按这个顺序看:

  • 确认色标含义:先看图例,弄清颜色对应高还是低(红高蓝低常见,但不是固定的),以及数值有没有做行标准化。
  • 有没有清晰的块结构:理想情况是同一组的列聚在一起、颜色一致,组与组之间形成对比分明的色块。
  • 列聚类和分组是否吻合:如果列的聚类把不同组的样本混着排,说明这批基因对分组的区分力不强,或存在批次、离群样本干扰。
  • 警惕选择偏差:如果这张热图只画了「最显著的那批差异基因」,它必然好看——因为您正是挑着好看的选进来的。这种热图是展示,不是证据,别用它反过来证明差异存在。

一段常见画法(对差异基因的标准化表达画热图):

library(pheatmap)
pheatmap(mat,
         scale = "row",            # 按行 z-score,看相对高低
         cluster_rows = TRUE,
         cluster_cols = TRUE,
         annotation_col = coldata) # 顶部标注分组,方便核对列聚类

富集气泡图看什么

富集气泡图(dotplot)总结的是「差异基因集中在哪些通路 / GO 条目上」。图上每个点是一个通路,常见的编码是:纵轴通路名,横轴 GeneRatio(您的基因里落在该通路的比例),点的大小代表命中基因数,颜色代表 padj。

按这个顺序看:

看哪里判断标准
padj(颜色)越小越可靠,常用 padj < 0.05(常用惯例,非铁律)
命中基因数 / 基因比只有 2 至 3 个基因命中的通路,即使 padj 显著也要谨慎,容易不稳定
通路是否讲得通结果应和您的生物学背景对得上,一串高度相关的通路一起出现是好信号
是不是全是泛化大类若清一色是「代谢过程」这类极宽泛的条目,信息量低,参考价值有限

两个容易被忽略的点:

  • 背景对不对:物种、基因 ID 类型、注释版本要和您的数据一致,否则富集结果整体不可信。基因 ID 的坑见 教程:基因 ID 怎么转换
  • 条目冗余:GO 里很多条目高度重叠,一堆近义通路会让图显得「结果很多」。必要时做去冗余处理,再看剩下的主线。

一段常见画法:

library(clusterProfiler)
ego <- enrichGO(gene          = sig_genes,      # 差异基因,ID 类型要与 keyType 一致
                OrgDb         = org.Hs.eg.db,    # 物种注释包,人是 org.Hs.eg.db
                keyType       = "SYMBOL",
                ont           = "BP",            # 生物学过程
                pAdjustMethod = "BH",
                pvalueCutoff  = 0.05)
dotplot(ego, showCategory = 15)

拿到任何一张图先问的三个问题

不管是上面四类图还是别的图,先别急着解读,先花十秒回答这三个问题。它们能挡掉绝大多数误读。

  1. 这张图画的是什么数据、怎么处理的? 是原始值、标准化值,还是取了 log、做了 z-score?纳入了哪些样本、哪些基因?处理方式不同,同一张图能读出的东西完全不同。
  2. 对比是什么,方向对不对? 谁是对照、谁是处理?log2FC 的正负、颜色的高低,各指向哪一组?先把参照组认清楚,别把方向读反。
  3. 这个结果稳不稳、讲不讲得通? 换个阈值、去掉那个离群样本,结论还成立吗?和已知的生物学一致吗?样本量撑得起这个结论吗?经得起这三问的图,才值得写进结果。

在平台上跑一遍

不想写代码也能完成这一步。在百沐一下,您只要上传表达矩阵和分组表、说清要比较哪两组,平台会自动产出 PCA、火山、热图和富集图;您要做的就是照本文这几节,把每张图逐一「读一遍」。做法见 组学分析助手,或直接到 app.baimuyixia.com 上传数据试试。

相关