1. 课程介绍与目标
大家好,我是你们这趟旅程的向导。在开始敲代码之前,我想先聊聊:为什么这门课值得你花时间?
单细胞转录组分析,说白了就是把每个细胞当作一个独立的个体,看它里面哪些基因在活跃表达。这跟传统的 bulk RNA-seq 不同——那只能看一群细胞的平均表达量,细节全被抹平了。我个人习惯把单细胞数据想象成一张“细胞家族照”,每个细胞都有自己的表情和状态。
但你想想看,当实验批次不同——比如今天做的样本、下周补测的样本,甚至不同实验室的数据——这些技术噪声就会混进去,让本该相似的细胞被强行分开,或者让本不相关的细胞被错误地拉在一起。这就是批次效应。我一开始处理单细胞数据时就在这上面栽过跟头——明明是同一种细胞,就因为批次不同,在降维图上分成了两团,差点让我以为发现了新细胞类型。后来才意识到,问题出在批次上,而不是生物学差异。
批次效应到底长什么样?
用一个最简单的例子说明:
| 批次 | 细胞类型 A | 细胞类型 B |
|---|---|---|
| 批次 1(今天测) | 表达量 100 | 表达量 200 |
| 批次 2(下周测) | 表达量 80 | 表达量 180 |
注意看上表:A 和 B 在各自批次内的差异是 100 vs 200(A 低、B 高)。但批次 1 的 B(200)和批次 2 的 A(80)数值接近?不,它们只是受到不同实验条件的影响。如果不做校正,聚类算法很可能会把批次 1 的某些细胞误判成另一类。
Scanpy 和 Harmony 的分工
我们这门课的主角有两个:
- Scanpy:Python 生态下最流行的单细胞分析框架。从读取数据、质量控制、标准化到降维聚类,它都能搞定。我在项目中用它处理过百万级别的细胞数据,性能还不错。
- Harmony:一个专门用于批次校正的算法。它不改变原始数据,而是在主成分空间里把不同批次的细胞尽量“拉近”,同时保留生物学差异。我特别喜欢它的一个点:它不需要指定哪些细胞属于同一类型,算法自己会去学习。
简单说:Scanpy 负责“把数据整理好”,Harmony 负责“让数据变得更干净”。
⚠️ 避坑指南:我曾经在一个项目里直接跳过批次校正,结果后续的差异基因分析完全是噪声。等你发现时,可能已经浪费了几天时间。所以这一步千万别省。
下面这张图可以一目了然地看到整体流程:
你看上面这个流程,Harmony 处于降维之后、聚类之前的位置。它不碰原始数据,只调整主成分。这样既保留了数据完整性,又解决了批次问题。
安装环境一把梭
在开始之前,确保你的 Python 环境已经准备好。我个人推荐用 conda 新建一个干净环境:
conda create -n sc_tutorial python=3.9
conda activate sc_tutorial
pip install scanpy[leiden] harmonypy
这里的 harmonypy 是 Harmony 的 Python 接口,完全兼容 scanpy 的 AnnData 对象。
💡 小提示:我曾经遇到过版本冲突——scanpy 1.9 与早期版本的 harmonypy 不兼容。建议安装时指定版本:pip install scanpy==1.9.1 harmonypy==0.0.9。
课程目标一览
经过这 30 章的学习,你将能够:
- 独立完成从原始数据到批次校正的完整流程
- 理解 Harmon y 背后的数学原理(但不会让你背公式,放心)
- 用 Scanpy + Harmony 处理多批次数据,并验证校正效果
- 避免我踩过的那些坑(嗯,至少 80% 的坑)
什么时候该用 Harmony?什么时候不适合?
| 场景 | 建议 |
|---|---|
| 不同实验批次合并 | 优先考虑 Harmony |
| 不同测序平台(10x vs. Smart-seq2) | Harmony 可以做,但效果有限;建议先试试更硬核的方法 |
| 不同物种数据整合 | Harmony 不推荐——需要先通过基因同源映射 |
| 只有单个批次 | 不需要校正,跳过 Harmony |