第3章 批次效应的识别:可视化方法(PCA、箱线图)

你拿到表达矩阵后的第一件事是什么?千万别急着跑差异分析。

我个人的习惯是——先画图看看。数据里有没有隐藏的批次结构,可视化往往比任何统计检验都来得直观。本章我们就聊两种最常用的可视化识别手段:PCA 和箱线图。

3.1 为什么先看可视化?

说白了,批次效应如果存在,它一定会在数据分布上留下“指纹”。

这个指纹可能是样本在低维空间里按批次聚成几团,也可能是某个批次整体表达量偏高或偏低。可视化就是把这些指纹放大给你看。

核心原则:先看全局,再定方案。可视化识别不是最终证据,但它能告诉你“有没有必要做批次校正”,以及“哪种校正方法可能有效”。

我在项目里遇到过这种情况:某次多中心RNA-seq整合,统计检验显示批次效应p值显著,但PCA图上样本完全混匀——后来发现是样本量太大导致的假阳性。所以说,图比数可靠。

3.2 PCA:高维数据的第一只眼睛

主成分分析,说白了就是把几千个基因的表达量压缩成两三个主成分,让你能在二维或三维空间里看到样本的整体结构。

3.2.1 原理一句话

PCA 找到数据方差最大的方向,把样本投影上去。如果批次效应很强,那前两个主成分往往会把不同批次的样本推开。

3.2.2 R代码实战

假设你有一个表达矩阵 expr_mat,行是基因,列是样本。还有一份批次信息 batch_info。

# 转置:让样本成为行,基因成为列
expr_t <- t(expr_mat)

# 运行PCA,中心化和标准化都要做
pca_res <- prcomp(expr_t, center = TRUE, scale. = TRUE)

# 提取前两个主成分
pca_df <- data.frame(
  PC1 = pca_res$x[, 1],
  PC2 = pca_res$x[, 2],
  Batch = batch_info
)

# 用ggplot2画散点图
library(ggplot2)
ggplot(pca_df, aes(x = PC1, y = PC2, color = Batch)) +
  geom_point(size = 3, alpha = 0.8) +
  stat_ellipse(level = 0.5, show.legend = FALSE) +
  theme_classic() +
  labs(title = "PCA: 按批次着色")

小技巧:如果前两个主成分看不出分离,别急着下结论。试试 PC3 和 PC4,有时候批次效应藏在后面的维度里。我个人习惯把前五个主成分都扫一遍。

3.2.3 怎么看图?

  • 完全混匀:不同批次样本交叉分布,没有明显聚类 → 批次效应弱或无。
  • 明显分离:同批次样本聚在一起,不同批次之间有清晰边界 → 批次效应强。
  • 部分重叠:有分离趋势但边界模糊 → 存在一定批次效应,需结合其他方法判断。

我曾经做过一个项目,PCA 图上批次分离得干干净净,但生物学分组完全混在批次里——那种情况你就别想直接做差异分析了,必须先校正。

3.3 箱线图:分布差异的放大镜

PCA 看的是样本间的关系,箱线图看的是表达值整体的分布。它不关心基因怎么组合,只关心每个样本的表达量高低、离散程度和异常值。

3.3.1 什么时候用?

当批次效应表现为“某个批次整体表达量偏高或偏低”时,PCA 可能看不出来——因为所有基因一起偏移,样本间的相对关系没变。但箱线图一眼就能抓住。

3.3.2 R代码实战

# 把表达矩阵变成长格式
library(reshape2)
expr_long <- melt(expr_mat)
colnames(expr_long) <- c("Gene", "Sample", "Expression")

# 合并批次信息
expr_long$Batch <- batch_info[expr_long$Sample]

# 画箱线图:每个样本一个箱线,按批次着色
ggplot(expr_long, aes(x = Sample, y = Expression, fill = Batch)) +
  geom_boxplot(outlier.size = 0.5) +
  theme_classic() +
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
  labs(title = "样本表达量分布:按批次分组", x = "样本", y = "表达量")

3.3.3 怎么看图?

  • 中位数线齐平:各批次样本的中位表达量基本一致 → 没有明显的整体偏移。
  • 中位数高低不一:某个批次整体偏高或偏低 → 存在全局批次效应。
  • 箱体宽度差异大:不同批次的离散度不同 → 批次影响了数据的变异程度。

注意:箱线图对异常值敏感。如果某个批次里有个别样本的文库构建出了问题,箱线图会拉得很高或很低。我曾经因为这个误判批次效应,后来加上 sample-wise 的 QC 标志才分清楚。

3.4 两种方法怎么选?

它们不是互斥的,是互补的。我一般 PCA 和箱线图都做,先看 PCA 了解全局结构,再用箱线图确认分布偏移。

维度 PCA 箱线图
看什么 样本间关系(聚类/分离) 表达量分布(中位数/离散度)
适合场景 批次效应改变样本相似性 批次效应改变整体表达水平
数据要求 高维矩阵,需转置 长格式即可,无需降维
解读难度 需要理解主成分含义 直观,非技术人员也能看
敏感性 对强批次效应敏感 对全局偏移敏感

我的经验:两者结合使用。如果 PCA 有分离 + 箱线图有偏移 → 强烈批次效应,必须校正。如果 PCA 混匀但箱线图有偏移 → 可能是技术差异,先检查 QC。如果 PCA 分离但箱线图齐平 → 可能是生物学差异,别盲目校正。

批次效应可视化识别流程 原始表达矩阵 (基因 × 样本) 数据预处理 (归一化 / 中心化) PCA 降维分析 (散点图按批次着色) 箱线图分析 (样本分布按批次分组) 综合判断 (是否存在批次效应) 判断参考 PCA 分离 → 批次效应强 箱线偏移 → 全局分布差异

3.5 避坑指南

做可视化识别这几年,我踩过几个坑,分享给你。

  • 坑一:样本量不平衡。如果 Batch1 有 50 个样本,Batch2 只有 5 个,PCA 图上 Batch2 被挤到边缘是正常现象,不代表批次效应强。我建议先按批次做随机下采样,平衡后再比较。
  • 坑二:PCA 只看前两个主成分。方差占比可能很低(比如只有 10%),剩下的 90% 里可能藏着批次信息。我习惯用 summary(pca_res) 看累积方差贡献,把前 5–10 个主成分都检查一遍。
  • 坑三:箱线图被异常值带偏。某个样本的文库扩增异常会导致箱线图整体偏移。建议先做样本级别的 QC 过滤,或者改用中位数 + IQR 的展示方式。
  • 坑四:过度解读可视化结果。图只是提示,不是证据。如果 PCA 和箱线图都指向批次效应,再用统计方法(如 RUVseq、ComBat)验证一下,别直接下结论。

我的小习惯:每次做可视化识别,我都会保存三张图——PCA(PC1 vs PC2)、PCA(PC3 vs PC4)、批次分组的箱线图。三张图放在一起看,基本不会漏掉批次效应。如果三张图都干净,那我才会放心往下走。

好了,这一章的内容就到这里。可视化识别是批次效应分析的第一步,也是最直观的一步。掌握了 PCA 和箱线图,你就能在数据分析初期快速判断数据质量,避免带着批次效应跑下游分析。