1. RNA-seq 差异分析简介

1.1 什么是 RNA-seq 差异分析

RNA-seq 差异分析,说白了就是比较不同条件下基因表达到底变了多少。你拿到一批测序数据,想知道处理组和对照组之间哪些基因上调了、哪些下调了,这就是差异分析要回答的核心问题。

我 刚开始接触RNA-seq时,总觉得这步就是个统计检验,跑个软件就行。后来才发现,理解背后的逻辑比敲命令更重要。你想想看,一个基因在样本A里表达量是100,在样本B里是200,这算不算差异?如果A和B各只有两个重复,这个差异到底靠不靠谱?这些都需要差异分析来回答。

差异分析的应用场景其实很广:

  • 疾病 vs 正常:找致病基因或标志物
  • 给药 vs 对照:评估药物靶点和药效
  • 不同发育阶段:研究调控机制
  • 敲除 vs 野生型:验证基因功能

核心概念:差异表达分析(Differential Expression Analysis)是通过统计假设检验,识别在不同实验条件下表达水平有显著差异的基因。它的输出通常是一个基因列表,包含 fold change、p-value、adjusted p-value 等关键指标。

你可能会问,为什么不直接用倍数变化来筛选?嗯,这里有个坑。我 以前做过一个项目,用纯 fold change 筛基因,结果挑出来的全是低表达基因,噪声极大。后来才明白,必须结合统计检验,用 p-value 和 FDR 来控制假阳性。

1.2 差异分析的核心工作流

差异分析不是从原始数据直接跳到基因列表。它背后有一套完整的工作流。我 个人习惯 把流程分成六个阶段,每一步都影响最终结果的质量。

RNA-seq差异分析工作流 RNA-seq 差异分析核心工作流 原始测序数据 FASTQ 格式 质量控制 FastQC / MultiQC 序列比对 STAR / HISAT2 基因定量 featureCounts / HTSeq 差异分析 DESeq2 / edgeR 结果可视化 MA图 / 火山图 / 热图 每个步骤都有相应的工具和检查点

每个阶段都有自己的关键任务:

  1. 原始数据:FASTQ 格式,包含 reads 序列和质量分数
  2. 质控:检查数据质量,过滤低质量 reads,去除接头
  3. 比对:将 reads 比对到参考基因组或转录组
  4. 定量:统计每个基因的 read 计数,生成表达矩阵
  5. 差异分析:使用统计模型识别差异表达基因
  6. 可视化:用图形展示结果,辅助解读

我的经验:质控这一步千万别省。我 曾经遇到过 一批数据,差异分析结果很奇怪,折腾了两天才发现是接头污染导致的。后来我养成了习惯,每次拿到数据先跑 FastQC,再跑 MultiQC 汇总,一目了然。

1.3 常用差异分析工具

目前主流的差异分析工具就那么几个,但各有各的脾气。我先列个表,再一个个聊。

工具 方法原理 适用场景 优点 注意点
DESeq2 负二项分布 + 收缩估计 小样本、多重复 稳健、假阳性控制好 对异常值敏感
edgeR 负二项分布 + 经验贝叶斯 中等样本量 速度快、灵活 需手动归一化
limma 线性模型 + 经验贝叶斯 大样本、微阵列出身 计算快、易扩展 对 count 数据需转换
DEXSeq 外显子级别模型 差异外显子使用 精度高 计算耗时长

说实话,我最常用的是 DESeq2。为什么?因为它对新手最友好。归一化、差异检验、多重检验校正一条龙,代码量少,出图也方便。我 用过的工具中,DESeq2 的文档也是最清楚的。

但 edgeR 也有它的优势。比如你要自定义对比矩阵、做复杂的实验设计,edgeR 的灵活性就体现出来了。我 记得有个项目 需要做 time-course 分析,edgeR 的 glm 框架用起来很顺手。

至于 limma,它本来是为芯片数据设计的,后来也支持 RNA-seq。它最大的优点是快,适合样本量大的场景。但你得先用 voom 把 count 数据转成 logCPM,这一步很多人会忽略。

来看一个 DESeq2 的基本用法:

library(DESeq2)

# 构建 DESeq2 对象
dds <- DESeqDataSetFromMatrix(
  countData = count_matrix,
  colData = col_data,
  design = ~ condition
)

# 运行差异分析
dds <- DESeq(dds)

# 提取结果
res <- results(dds, contrast = c("condition", "treated", "control"))
res <- as.data.frame(res)

# 筛选差异基因
deg <- subset(res, padj < 0.05 & abs(log2FoldChange) > 1)

选型建议:我个人习惯是,样本量少(< 8 个)用 DESeq2,样本量大(> 20 个)用 limma,需要灵活建模用 edgeR。当然,这不是绝对的,还得结合数据特点来定。

1.4 可视化——让差异"看得见"

差异分析跑完后,你会得到一个基因列表,里面有上千个基因的 p-value 和 fold change。但光看表格,你很难快速判断数据质量、整体分布和生物学意义。这时候就需要可视化登场了。

我 在项目中经常遇到 这样的情况:统计检验结果很显著,但一看可视化图,发现数据分布有问题或者存在批次效应。所以可视化不只是"画图交差",它是分析质量的"照妖镜"。

最常见的几种差异可视化手段:

  • MA 图:展示表达量(A)与倍数变化(M)的关系,用来判断数据整体分布
  • 火山图(Volcano plot):结合 fold change 和 p-value,直观展示差异基因
  • 热图(Heatmap):展示差异基因的表达模式,做样本聚类
  • PCA 图:在差异分析前使用,评估样本分组和批次效应

举个简单的例子,画一张火山图:

library(ggplot2)

# 准备数据
res$gene <- rownames(res)
res$significant <- "No"
res$significant[res$padj < 0.05 & res$log2FoldChange > 1] <- "Up"
res$significant[res$padj < 0.05 & res$log2FoldChange < -1] <- "Down"

# 绘图
ggplot(res, aes(x = log2FoldChange, y = -log10(padj), color = significant)) +
  geom_point(alpha = 0.6, size = 1.5) +
  scale_color_manual(values = c("Up" = "#e74c3c", "Down" = "#3498db", "No" = "#bdc3c7")) +
  theme_minimal() +
  labs(title = "Volcano Plot", x = "log2(Fold Change)", y = "-log10(adjusted p-value)")

避坑提醒:我 曾经踩过的一个坑:用 p-value 而不是 adjusted p-value 来画火山图。结果出来一堆假阳性,差点把无关基因当成重要靶点。后来导师一眼就看出来了,说"你这个 p-value 没校正吧?" 场面一度很尴尬。所以,一定用 padj 或 FDR,别偷懒。

可视化的真正价值在于:它能把枯燥的数字变成直观的模式。好的可视化能让你一眼看出数据质量好不好、分组是否合理、差异基因是否集中在某些通路。这些信息,光看表格是看不出来的。

所以,差异分析和可视化是"一条龙"的关系。分析结果需要可视化来验证和解读,而可视化又能反过来指导分析策略的调整。两者缺一不可。