bulk RNA-seq 实践教程
bulk RNA-seq 实践教程
bulk RNA-seq 把一份组织或一群细胞打成混合样本测序,得到的是每个基因在样本里的平均表达量。多数实验室的转录组项目仍然围绕它展开:几十个样本、两三个处理组、一篇文章的主线分析。
本专栏打算把 bulk RNA-seq 从"测完序之后怎么办"这一步开始讲,按真实项目常见的顺序走一遍:质控、比对或准比对、定量、差异分析、富集解释。尽量给出能在自己电脑上跑完的数据和脚本,而不是只列工具名。
bulk vs 单细胞 vs 空间:什么时候选哪个
在动手之前先回答一个问题:你的科学问题真的需要 bulk RNA-seq 吗?
| 问题 | 推荐技术 | 理由 |
|---|---|---|
| 两组样本之间整体差异 | bulk RNA-seq | 便宜、统计成熟、3-5 个样本就够 |
| 不同细胞类型的响应不同 | 单细胞 RNA-seq | bulk 看到的是各类细胞的加权平均,细节被抹掉 |
| 表达定位(哪一块组织在做什么) | 空间转录组 | bulk 和单细胞都没有空间信息 |
| 稀有亚群(< 5%)的变化 | 单细胞 | bulk 里 5% 的信号被 95% 稀释 |
| 大样本 + 临床/流行病学问题 | bulk RNA-seq | TCGA 上千样本量级,单细胞做不起 |
| 转录起始位点 / 可变剪接 | bulk + 长读长 | 标准 bulk 也能做,但 Iso-seq / Nanopore 直接 |
bulk 还是大多数项目的默认起点:便宜、流程成熟、统计学经过 20 年验证、可以做大样本。除非你的问题明显需要细胞分辨率或空间信息,否则先做 bulk。
一个项目大致是什么样子
假设你做了一个时间点比较的实验:对照组三个样本、处理组三个样本、每个样本一次双端测序。下机之后你会拿到 12 个 FASTQ 文件,加起来可能有几十 GB。
从这里到"一张火山图 + 一张 GO 富集结果 + 一句能写进论文的结论"之间,要经过的步骤大致是:
| 步骤 | 典型产物 | 常用工具 |
|---|---|---|
| 原始数据质控 | 每个样本的 QC 报告 | FastQC、MultiQC |
| 比对到参考基因组 | 每个样本的 BAM | STAR、HISAT2 |
| 基因或转录本定量 | counts 矩阵 或 TPM 矩阵 | featureCounts、Salmon、kallisto |
| 样本层面检查 | PCA 图、样本相关性 | DESeq2、edgeR、limma |
| 差异表达分析 | 差异基因表 | DESeq2、edgeR、limma-voom |
| 功能富集 | GO、KEGG、GSEA 结果 | clusterProfiler、fgsea |
| 结果交付 | 表格、图、方法段 | R Markdown、Quarto |
"比对 + featureCounts" 和 "Salmon/kallisto 准比对" 是两条常见路线。前者产出 BAM、对可视化和变异分析都友好;后者跳过显式比对,直接估计转录本丰度,速度快、磁盘友好。新项目里如果只关心基因层面的差异表达,用 Salmon 是更经济的选择。
常见工具栈
在 BioF3 的例子里会优先使用下面这套组合,原因是文档、社区和版本都比较稳定:
| 阶段 | 工具 | 运行环境 |
|---|---|---|
| 质控 | FastQC、MultiQC | bash |
| 比对 | STAR、HISAT2 | bash |
| 准比对定量 | Salmon、tximport | bash + R |
| 差异分析 | DESeq2、edgeR、limma-voom | R |
| 富集分析 | clusterProfiler、fgsea | R |
| 可视化 | ggplot2、ComplexHeatmap、EnhancedVolcano | R |
其他工具(Kallisto、RSEM、StringTie、pheatmap 等)都是合理替代,但这套组合能覆盖大部分教学和小型真实项目。
推荐公开数据集
学这个专栏不一定要用自己的测序数据。下面这几份公开数据都能用来练手,且每份都有配套文献可对照。
| 数据集 | 规模 | 适合 | 入口 |
|---|---|---|---|
| Pasilla(果蝇 RNA-seq) | 7 个样本 | 最小差异分析例子,Bioconductor 官方包 pasilla 里直接带 |
pasilla |
| airway(人肺上皮,4 对照 + 4 处理) | 8 个样本 | DESeq2 官方教程数据,做 glucocorticoid 处理 | airway |
| GTEx 子集 | 可选子集 | 多组织 / 多样本练习归一化和批次 | GTEx |
| Recount3 项目 | 任选一个 SRP | 预处理好的 counts 矩阵,跳过比对 | Recount3 |
前两个数据集在 R 里装一下包就能直接用,不需要下载 FASTQ,非常适合当作入门。GTEx 和 Recount3 的优点是真实样本量足够做归一化和批次演示。
最小可跑的例子
下面这段代码从安装 DESeq2 到跑出一份差异基因结果一共不到 20 行,数据就是上面 airway 公共数据集。把它粘到 RStudio 里,装好包就能跑:
# 一次性安装依赖(如果还没装)
if (!requireNamespace("BiocManager", quietly = TRUE)) install.packages("BiocManager")
BiocManager::install(c("DESeq2", "airway"))
library(DESeq2)
library(airway)
# 加载示例数据:8 个样本 x ~64000 个基因的 counts 矩阵
data(airway)
se <- airway
se$dex <- relevel(se$dex, ref = "untrt")
# 构建 DESeq 对象并拟合模型
dds <- DESeqDataSet(se, design = ~ cell + dex)
dds <- DESeq(dds)
# 提取差异基因(trt vs untrt)
res <- results(dds, contrast = c("dex", "trt", "untrt"))
summary(res)
# 看一下最显著的几个基因
head(res[order(res$padj), ])
运行之后 summary(res) 会告诉你上下调基因各多少个,head(res[order(res$padj), ]) 会列出按校正 p 值排的前几个基因。把这几行读懂,基本就知道 bulk RNA-seq 差异分析是在做什么了。
真实项目比这段要多两件事:样本多、要考虑批次和协变量;定量步骤之前还有比对和质控。这也是后面几个模块要展开讲的内容。
专栏模块规划
| 模块 | 主题 | 状态 |
|---|---|---|
| 01 | 项目结构、数据入口与 Salmon 定量 | 已上线 |
| 02 | DESeq2 差异表达分析 | 已上线 |
| 03 | GO / KEGG / GSEA 富集分析 | 已上线 |
| 04 | 火山图、热图与富集可视化 | 已上线 |
| 05 | 多时间点与 LRT 检验 | 已上线 |
| 06 | 批次效应:ComBat / SVA / batch-in-design | 已上线 |
| 07 | DESeq2 / edgeR / limma-voom 三工具对比 | 已上线 |
| 08 | 可复现分析报告与结果交付 | 已上线 |
所有 8 个模块都已上线,前七个模块带一份可以直接跑的 R 脚本。
推荐前置知识
单细胞项目里的质控、归一化和差异分析思路和 bulk 有重叠,已经看过单细胞实践教程的读者会觉得很多概念上手更快。
常见误区
新手做 bulk RNA-seq 经常掉的几个坑:
误区 1:只做差异分析就交付
差异基因列表 ≠ 完整结果。至少还要补:PCA / 样本距离的 QC 图、富集分析、关键基因的表达分布图。只给一份 padj 排序的 csv 给合作者,对方看不出哪些是真信号、哪些是边缘 noise。
误区 2:不看 PCA 直接跑差异
PCA 是"测序质量 + 设计是否合理"的总体检查。PC1 不分组 = 处理效应弱(或者 design 错了);某个样本远离同组其他样本 = 该样本可能有问题。这两件事不解决,跑出来的差异基因没法解释。
误区 3:把 |LFC| > 1 当成生物学显著的硬标准
|log2FC| > 1 即 fold change > 2 倍。这个阈值在不同项目里意义完全不同:转录因子表达 1.5 倍可能就是大事,组织特异性基因 10 倍变化才有意义。先看自己数据的整体分布,再选阈值。
误区 4:富集结果只看 top 5 通路
GO / KEGG 跑出来几十条通路,只看 top 5 容易被冗余 term("细胞增殖" / "正向调控细胞增殖" / "细胞周期"基本是同一件事)误导。用 cnetplot / emapplot 把通路网络化,看真正的几个独立模块。
误区 5:发表前不锁版本
DESeq2 / clusterProfiler / Salmon 半年一更,包升级有时会改算法默认值。发表后审稿人或读者重跑结果不一致就麻烦。用 renv 或 conda env.yaml 锁版本,08 章会展开。