1. 课程导论与 RNA-seq 基础
各位同学,欢迎来到《零基础搭建 RNA-seq 差异分析 Pipeline 指南》。
我是这门课的主讲。做生信分析有些年头了,踩过的坑不少,攒下来的经验也有一点。今天咱们从最基础的东西聊起,把 RNA-seq 到底是怎么回事,彻底讲清楚。
你可能会问:“我一个零基础的小白,能学会搭 Pipeline 吗?”
我的回答是:能。但前提是——你得先搞懂 RNA-seq 的原理。不懂原理就去跑流程,你会发现自己永远在瞎调参数。嗯,这事我干过,所以不想让你们再走一遍弯路。
1.1 RNA-seq 技术原理:它到底在测什么?
说白了,RNA-seq 就是给细胞里的 RNA 分子 做一次大规模"人口普查"。你想想看,DNA 是遗传信息的"总蓝图",但真正干活的是各种 RNA,尤其是 mRNA(信使 RNA)。
一个细胞里,不同基因的表达水平差别很大。有的基因很"勤奋",几千几万份拷贝;有的基因很"悠闲",可能就几份。RNA-seq 能告诉你:每个基因此刻正在表达多少。
具体流程是:先把 RNA 打断成小片段,反转录成 cDNA(互补 DNA),然后测序仪把这些 cDNA 片段的碱基序列读出来。我们拿到的原始数据就是一堆几百万到几亿条的短序列(reads),每条长度大约 50-150 bp。
个人经验:我早期项目里总纠结于"reads 为什么长度不一致"。后来才意识到,不同测序平台、不同 run 模式下出的数据长度本身就有波动。你应该关注的是 质量分数,而不是死磕长度。
1.2 两种主流方法:全长 vs 标签
| 对比维度 | 全长 RNA-seq | 3' Tag 计数 RNA-seq |
|---|---|---|
| 核心原理 | 覆盖整条转录本 | 只测转录本 3'端标签 |
| 数据特点 | 基因表达 + 可变剪切 + 融合基因 | 高精度基因计数,无法分析剪切 |
| 代表平台 | Illumina TruSeq, NEBNext | 10x Genomics, CEL-seq2 |
| 分析难点 | 比对复杂度高,需要 splice-aware 比对 | 比对简单,但需要 UMI 去重 |
| 我的建议 | 想做转录本完整研究的首选 | 只关心基因表达量的最优解 |
我个人习惯是:刚开始做差异分析时,尽量用 3' Tag 计数 的数据。为什么?因为它的分析流程更稳定,假阳性率更低。你想想看,如果比对这一步就出了偏差,后续的差异基因列表基本就废了。
1.3 分析流程概览:一张图看懂全链路
这是我亲手画的一张全流程框架图。你可以把它当作整个课程的"路线图"。每个方块都是一个重要步骤,我们后面会逐一攻克。
1.4 常用平台与数据格式
目前市面上测序仪基本被 Illumina 垄断。它出的数据是 FASTQ 格式。我跟你讲,FASTQ 里每四条记录是一组:第一行以 @ 开头是序号,第二行是碱基序列,第三行以 + 开头,第四行是质量分数。
你看一下实际数据长啥样:
@EAS56_59:5:84:908:1650/1
AAAGCTCACTGAAATGCAGAACGTCCTGGCATCCTGGGGCCTGTGA
+
JJJIIIIIIIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJJJJJJJ
第四行的符号是质量分数的 ASCII 编码。每个字符对应一个 Phred 分数,分数越高,这个碱基越可靠。我在项目中处理过一个极端案例——实验室送来的 FASTQ 里,46% 的碱基质量分数低于 Q20,这意味着每 100 个碱基里可能有 1 个以上是错的。如果不做质控,后面的差异分析全是垃圾。
1.5 三个核心应用场景
- 疾病 vs 正常对照:差异表达基因 (DEGs) + GSEA 富集分析,找潜在标志物。
- 时间序列分析:不同处理时间点取样,看基因表达如何动态变化。
- 单细胞 RNA-seq:虽然单细胞的基础逻辑与大块组织一致,但数据处理要更细,多了降维、聚类、细胞注释这些步骤。嗯,那个我们后面会单独讲。
避坑指南:经常有人问我:“我跑完了差异分析,怎么 list 里一个基因都没出来?” 我通常会反问:“你检查过低表达基因过滤参数吗?” 说白了,RNA-seq 数据里大量基因表达量极低(比如平均 CPM < 0.5),如果没做过滤,你会被多重假设检验的校正打回原形。这部分我在第 7 章会细讲,先记着就行。
1.6 课程实战环境速览
咱们这门课全程用 R / RStudio + DESeq2 / edgeR 走下来。我给你的建议是:不用一上来就装各种包,先把 R 环境配好。后面每章都会给出最简代码,你跟着跑就行。
先看一眼差异分析的"hello world"命令——跑一个最简的 DESeq2 流程:
library(DESeq2)
# 载入表达矩阵 (counts: 基因 × 样本)
countData <- read.csv("counts.csv", row.names=1)
# 载入样本信息 (包含 condition 列)
colData <- read.csv("colData.csv", row.names=1)
# 构建 DESeq2 对象
dds <- DESeqDataSetFromMatrix(
countData = countData,
colData = colData,
design = ~ condition
)
# 执行差异分析
dds <- DESeq(dds)
# 提取结果
res <- results(dds, contrast=c("condition","tumor","normal"))
⚠️ 重要提醒:DESeq2 要求输入的是 原始整数计数(raw counts),不能是归一化后的 TPM/FPKM。如果你给进去的是浮点数,DESeq2 会报错,结果也是错的。我有个学员按网上教程用了 TPM 做输入,跑出来 1800 个"显著"基因,结果全是假阳性。所以这一步千万要注意。
1.7 本章小测验
在进入下一节之前,我建议你先回答这几个问题:
- FASTQ 文件的第四行代表什么?
- 差异分析为什么必须用原始计数而不是 TPM?
- 如果我的测序数据质量很差,直接跳过质控行不行?
这三个问题想明白,第一章你就真的理解了。