2、批次效应检测方法:PCA、热图、变异来源分析归纳总结
拿到一份多批次的数据集,别急着上校正。我个人的习惯是——先搞清楚批次效应到底存不存在,严重到什么程度。这才是后续选择校正方法的前提。
你可能会问:“怎么看?用眼睛扫一下散点图行吗?”嗯,没那么简单。今天我就把三种最常用的检测方法串起来讲清楚:PCA、热图、变异来源分析。它们各有侧重,结合起来用才能做判断。
2.1 PCA – 降维看趋势
PCA(主成分分析)是我最常用的第一板斧。说白了就是把高维表达数据压缩到两三个主成分,然后投影到平面上看样本的分布情况。
关键信号:如果同一个批次的样本在PCA图上挤成一团,不同批次的样本分得远远的,那批次效应肯定不小。
我在一个多中心的RNA-seq项目中遇到过——用PCA一看,PC1就把医院A和医院B的样本完全分开了,PC1解释的方差竟然超过40%。当时我就知道,不校正根本没法做差异分析。
画PCA图的代码很简单。拿R为例:
# 假设 expr 是基因表达矩阵(基因×样本),batch 是批次标签
pca <- prcomp(t(expr), scale. = TRUE)
pca_df <- as.data.frame(pca$x)
pca_df$batch <- batch
library(ggplot2)
ggplot(pca_df, aes(x = PC1, y = PC2, color = batch)) +
geom_point(size = 3) + theme_minimal()
小提示:PCA前记得对数据进行标准化(scale=TRUE),不然高表达基因会把方差带偏。另外,如果前两个主成分解释的方差太小(比如加起来不到20%),可以多看看PC3、PC4,或者改用t-SNE/UMAP。
2.2 热图 – 层次聚类+颜色矩阵
热图的思路更直观:把表达矩阵按样本(列)和基因(行)做层次聚类,然后用颜色深浅表示表达量高低。如果批次效应存在,你会看到样本聚类树上有明显的批次块。
举个例子——我曾经处理过一个微阵列数据集,热图上一眼就能看到两个大分支,左边全是批次1,右边全是批次2,中间只有寥寥几个基因的差异。这就是典型的强批次效应。
R里画热图推荐用 pheatmap 或 ComplexHeatmap:
library(pheatmap)
# expr 是基因表达矩阵(行基因,列样本)
# 添加批次注释
annotation_col <- data.frame(batch = batch)
rownames(annotation_col) <- colnames(expr)
pheatmap(expr, annotation_col = annotation_col,
scale = "row", clustering_distance_cols = "euclidean",
show_rownames = FALSE, show_colnames = FALSE)
注意坑:热图很容易被离群样本或高变基因骗了。我遇到过一例,表面上看样本按批次分开,实际上分开的只有几个高表达的管家基因,真正的生物学差异根本没被反映。所以画热图时一定要把基因数限制在top 500-2000高变基因内,并且检查聚类树的稳定性。
2.3 变异来源分析 – 用数字说话
PCA和热图靠视觉判断,主观性太强。变异来源分析才是硬核定量方法。核心思路是把表达量的总方差拆解成“批次方差”“生物学变量方差”“残差方差”,然后比较它们各自的占比。
常用的方法有:
- ANOVA:对每个基因做线性模型,提取批次因子解释的方差比例(R²)。再取中位数或均值作为全局评估。
- SVA(Surrogate Variable Analysis):自动估计潜在的未观测到的变异来源,包括批次效应。
- RUV(Remove Unwanted Variation)中的RUVg方法:利用负对照基因评估隐藏变异。
我个人偏爱先跑一个混合线性模型,看看批次随机效应的方差分量:
# R 代码示例:每个基因做lmer,提取批次方差占比
library(lme4)
gene_var <- function(gene_vec, batch, condition) {
fit <- lmer(gene_vec ~ condition + (1|batch))
var_comp <- as.data.frame(VarCorr(fit))
batch_var <- var_comp$vcov[1]
total_var <- batch_var + var_comp$vcov[2] + attr(VarCorr(fit), "sc")^2
batch_var / total_var
}
batch_var_ratio <- apply(expr, 1, gene_var, batch=batch, condition=condition)
median(batch_var_ratio)
如果这个中位数超过0.3(30%),那批次效应就非常严重了——这时候必须用ComBat或RUV这样的强校正方法。
经验阈值:批次方差占比 < 0.1 → 可忽略;0.1~0.3 → 中等,需结合PCA判断;> 0.3 → 强烈建议校正。
2.4 综合判断流程
光用一种方法不够可靠。我总结了一个“三步走”流程,用下图表示:
具体怎么操作?我的建议是:
- 先跑PCA,看看有没有明显的批次分离。
- 再画热图,确认聚类树的分支是否对应批次。
- 最后算变异来源占比,获取定量证据。
- 如果至少两种方法都显示存在批次效应,那就不用纠结了——赶紧准备校正吧。
2.5 三种方法对比总表
| 方法 | 优势 | 局限 | 适用场景 |
|---|---|---|---|
| PCA | 快速直观,能发现非预期的批次结构 | 易受离群点影响,低方差维度可能掩盖真实信号 | 初步探索、多批次对比 |
| 热图 | 同时展示基因和样本的聚类关系 | 基因数选择敏感,颜色映射可能误导 | 确认聚类结构、检查离群样本 |
| 变异来源分析 | 定量、可重复,支持统计推断 | 计算量大,需要设定线性模型 | 批量对比、严谨报告、选择校正方法前的最后确认 |
2.6 避坑指南
我踩过不少坑,挑三个最疼的说给你听:
- 陷阱一:只看PCA就下结论。 我曾经遇到过PCA图上批次完全混在一起,但热图却显示样本按批次分成了两个亚群。原因是批次效应主要影响低表达基因,PCA被高表达基因主导了。所以一定要多方法交叉验证。
- 陷阱二:忘记检查生物学变量。 如果批次和疾病分组完全混杂(比如批次1全是病人,批次2全是健康人),PCA和热图都会显示明显的分组——但这其实是生物学差异,不是批次效应。这时候需要用变异来源分析把批次和条件都放进模型,分离出独立的批次方差。
- 陷阱三:盲目相信p值。 大样本下,ANOVA的p值很容易显著,但实际方差占比可能只有2%。我个人的习惯是:p值只是一个参考,真正要看的是效应量(R²或方差分量)。
重要提醒:检测必须在原始数据上进行,不要在标准化(如FPKM/RPKM)或log转换之前做PCA/热图吗?不,这些预处理是必要的,但千万别在校正之后再去做检测——那样你就看不到真实的批量效应了。