高通量测序数据与差异表达分析概述

好,咱们正式开始。这一章我把高通量测序数据——特别是RNA-seq数据——的差异表达分析流程梳理一遍。你想想看,做这行的人几乎天天跟这东西打交道。我从头说,基础打牢,后面学edgeR和limma-voom才不吃力。

高通量测序数据长什么样?

说实话,我第一次接触原始测序数据时有点懵。一堆FASTQ文件,里面全是碱基和质量值。但我不建议大家直接碰FASTQ,除非你想从头搭流程。通常我们拿到的,是经过比对和定量之后的表达矩阵。长这样——行是基因,列是样本,格子里的数字是 counts。

说白了,就是一张计数表。我习惯叫它“原始计数矩阵”。

表达矩阵的结构

给你一个最简单的例子,人工造了点数据,你感受一下结构。

            Sample1_Control  Sample2_Treated  Sample3_Control  Sample4_Treated
GeneA               1523              842              1789              912
GeneB                234             1987              189             2103
GeneC               4567             3210              4987             3456
GeneD                 89              567               78              612

看见没?每行一个基因,每列一个样本。数字是比对到这个基因上的reads数目。嗯,这些数字看起来挺整齐的,但背后的问题可不少。后面我会慢慢讲。

差异表达分析的核心逻辑

我自己的理解是这样的:差异表达分析本质上是个统计推断问题。给定了两组(或多组)样本的表达量,你问基因在这两组间有没有显著变化。很多人以为直接算个倍数变化,大于2就是上调,小于0.5就是下调。错,完全不是那么回事。

实际流程通常包含这几步:

  1. 数据预处理——过滤低表达基因、标准化
  2. 统计建模——用负二项分布或准似然模型拟合离散度
  3. 假设检验——计算p值和校正多重检验
  4. 结果注释与可视化——火山图、热图、富集分析

关键点:差异表达不是只看倍数变化,还得看统计显著性。我曾经有个项目,某个基因倍数变化高达10倍,但p值0.6,后来发现是样本量太少加技术重复导致的假象。从那以后我再也不单看fold change了。

为什么不能直接做t检验?

刚入行的人经常问这个问题。常规t检验假设数据服从正态分布,并且方差齐性。RNA-seq的count数据呢?它是离散的,低表达基因方差很大,高表达基因方差又相对稳定。尤其重要的是——RNA-seq数据有明显的“均值-方差”关系,说白了你不能直接用t检验那套东西。

我做个表,把几种常见模型比一下,你一看就明白。

模型 适用数据类型 核心假设 典型工具
泊松分布 计数数据 均值=方差 早期方法 (已淘汰)
负二项分布 过离散计数数据 均值<方差(有离散度参数) edgeR, DESeq2
准似然 灵活,对分布不敏感 仅要求一阶矩正确 limma-voom, edgeR QL

看到最后一行没?limma-voom就是走准似然路线。说白了它比纯负二项更灵活一些,尤其当你的样本量不大或者有批次效应的时候,voom转换完再做经验贝叶斯,效果挺好。

批次效应是什么?为什么需要消除?

这个问题我得好好说一下。我在项目中遇到过很多次——样本明明处理方式一样,只是分了批次上机测序,结果差异基因全跟着批次走,跟处理条件没半毛钱关系。

注意:批次效应不是异常值,它是系统性偏差。比如两个批次的文库制备用了不同试剂盒,或者不同天跑测序仪,都会引入批次效应。不消除它,你的差异分析结果可能就是垃圾。

我个人的经验是:实验设计阶段考虑批次,比后期用什么算法都重要。能随机化就随机化,不要把全部对照组放在Batch1,全部处理组放在Batch2——那叫混淆,神仙也救不了。

消除批次效应的常见策略

做法有好几种,我大致列一下:

  • ComBat:基于贝叶斯框架,调整表达值
  • limma中的removeBatchEffect:在线性模型中去掉批次变量
  • RUVseq (Remove Unwanted Variation):用内部对照基因估算“不想管的变异”
  • limma-voom + 批次作为协变量:直接在模型中包含批次因子

咱们这个课程重点讲的就是最后一种——在limma-voom框架里把批次当作协变量放进去。为什么选它?因为voom本身把count数据转换成了近似正态的log2-CPM值,再加个线性模型里的批次项,干净利落,结果容易解释。

小技巧:如果你做探索性数据可视化(比如PCA、聚类图),可以用removeBatchEffect先去除批次对表达量的影响再画图。但在差异检验阶段,我个人习惯还是把批次放在模型里,而不是预先调整表达值——后者可能会导致统计检验的p值偏差。

本章知识框架

下面这张SVG图把本章的核心概念串了一遍。你看一遍,后面动手做的时候脑子里会清楚很多。

高通量测序数据与差异表达分析 知识框架 原始FASTQ数据 表达定量矩阵 (Counts) 过滤 标准化 差异表达分析核心 统计建模 + 假设检验 负二项模型 edgeR / DESeq2 准似然 + voom limma-voom (本课程核心) 批次效应消除 协变量 / removeBatchEffect 输出:差异基因列表 + 统计检验量 (logFC, p-value, FDR) 注意 批次与处理 条件勿混淆

图里的逻辑很清楚:从原始FASTQ开始,拿到定量矩阵,预处理以后进入差异表达分析核心。三种主流路线,咱们选的是limma-voom加批次效应消除这条。最终输出差异基因列表——但要记住,这只是第一步,后面还要做功能注释和生物学验证。

怎么评估差异表达结果的好坏?

好问题。我在项目里常用的几项指标:

  • p值分布:如果p值直方图在0附近有个尖峰,其余区域平坦,说明模型合理。如果p值整体往1偏移,可能模型有问题。
  • MA图:差异基因应该大致对称分布在横轴两侧。如果全偏向一边,可能是标准化没做好。
  • 主成分分析:先看主成分图,检查批次效应明显不明显。如果batch1和batch2把样本分开了,赶紧想办法。

经验之谈:我习惯拿到表达矩阵后,第一件事不是跑差异分析,而是先做PCA+热图。花10分钟看看数据长得怎么样。如果对照和处理组混在一起,先别急着找原因,检查样本标签有没有弄反——我吃过这个亏。

从RNA-seq到差异分析,我建议你记住这几条

嗯,总结一下吧,不啰嗦:

  1. counts数据不等于表达量——必须经过标准化(如CPM、TPM、RPKM)才能做样本间比较。
  2. 批次效应是真实存在的——不是你分析能力的问题,是实验设计的问题。接纳它,处理它。
  3. 没有完美的模型——edgeR、DESeq2、limma-voom各有适用场景。选工具前先搞清楚你的数据特点:样本量、离散度、批次数量。
  4. 差异分析只是过程,不是终点——最后你还得回答生物学问题。