1. 课程导论:从一块组织切片说起
大家好,欢迎来到这门课。
先聊个我自己的事。几年前我还在做传统转录组分析,说白了就是把一堆细胞磨碎了提RNA,然后测序。结果呢?得到了整个组织的平均基因表达。可我们都知道,心脏的心肌细胞和成纤维细胞挨在一起,功能天差地别。把混在一起的数据拿来分析,就好像把一锅乱炖的菜拿去化验——你能知道里面有什么食材,但绝对分不出每块肉原本在哪。
所以,空间转录组学就出来了。它的核心目标很简单:在保留细胞原位位置信息的前提下,测量基因表达。嗯,这个“原位”非常关键。
1.1 空间转录组学的背景
传统转录组学(bulk RNA-seq 和 scRNA-seq)告诉我们“谁”在里面,但没说“谁”在“哪”。组织发育是一个高度空间化的过程——细胞在三维空间里迁移、分化、信号交流。没有空间信息,我们根本讲不清发育的完整故事。
我个人习惯把空间转录组学技术分成几代:
| 技术代际 | 代表方法 | 空间分辨率 | 通量 |
|---|---|---|---|
| 第一代 | LCM(激光显微切割) | 区域级别 | 低 |
| 第二代 | MERFISH, seqFISH | 单细胞/亚细胞 | 中 |
| 第三代 | 10x Visium, Slide-seq | 多细胞(点级别) | 高 |
你想想看,不同技术给出的空间粒度差别很大。MERFISH 能看清单个细胞内mRNA的分布,但通常只能测几十到几百个基因。而 10x Visium 可以测全转录组,但每个“点”覆盖了大约一到十个细胞。没有绝对的好坏,只有合不合适的场景。
我的一点经验: 做项目前先问自己两个问题:
1. 我需要单细胞分辨率吗?
2. 我需要全基因组的广度吗?
如果答案是“都要”,那要考虑数据整合方法。如果答案有取舍,选技术方向会清晰很多。
1.2 空间特异性特征到底是什么?
好,背景讲完了。那什么是空间特异性特征?
说白了,就是某些基因的表达模式,或者某种细胞状态,只在组织的特定空间区域出现,在其他地方看不到或者不一样。比如,神经管闭合时,腹侧区域的Shh信号通路高度活跃,而背侧则完全不同。这种差异,就是空间特异性。
我把它拆解成三个层次:
- 全局差异: 整个组织不同区域的大尺度表达差异。比如皮层和髓质。
- 局部斑点: 某个小区域内的特异性表达模式。比如心脏发育中的传导系统形成灶。
- 微环境梯度: 细胞在几个细胞的范围内形成的信号梯度。比如形态素浓度梯度。
为什么要关注这个?因为在发育生物学里,很多关键事件都发生在局部。一个细胞是否决定分化为神经元,很大程度上取决于它周围的邻居怎么说。这就是你讲的“组织微环境”的力量。
核心观点: 空间特异性特征是连接“基因表达”和“空间位置”的桥梁。没有这道桥,我们看到的只是一个二维或三维的基因热力图,而不是发育过程的逻辑。
1.3 课程目标
学完这门课,我希望你能做到以下几件事:
- 理解数据: 空间转录组数据长什么样?怎么读?有哪些坑?
- 掌握方法: 从数据预处理、降维聚类,到空间斑点检测和空间变量基因识别。
- 实战应用: 用 Python 生态(尤其是 SpaCET、Squidpy、Scanpy 等工具)跑通完整的分析流程。
- 做出解释: 面对一张满是斑点的空间转录组数据图,能讲出发育背后的生物学故事。
注意,这不是一门纯理论课。每个模块我都会带代码示例,而且我会尽量用我自己在项目中踩过的坑来提醒你。
避坑指南: 我曾经在一次项目里,用标准的Seurat流程处理空间数据,结果发现聚类结果和组织的病理区域完全对不上。后来才发现是没做正确的空间协方差校正。嗯,这个教训很深。所以在你跑第一个模型前,务必做好预处理。
1.4 学习路径
整门课分成一个大的知识结构。你可以对照这张图来把握节奏:
这张图展示了课程的主线。你看,我们先打好基础(Python、图像、统计),然后深入理解空间数据,接着学习核心分析方法,最终目标是识别组织中特异的空间模式。
1.5 你需要准备什么
先别急着装软件。我个人建议按这个清单来准备:
- Python 3.9+,最好是 3.10 或 3.11
- 核心库: Scanpy、Squidpy、SpaCET、matplotlib、numpy、pandas
- 可选但推荐: PyTorch(后面章节用深度学习模型时会用到)
- 数据集: 我会用公开数据集(比如 10x Visium 的小鼠脑切片数据),你也可以自己准备
安装小贴士: 建议用 conda 创建一个虚拟环境,避免和已有的包冲突。
conda create -n spatx python=3.10
conda activate spatx
pip install scanpy squidpy pandas numpy matplotlib
1.6 一个简单示例感受数据
在正式开课前,先看一眼空间转录组数据长什么样。下面是一小段代码,用来加载一个标准的 Visium 数据集(假设你已经下载好):
import scanpy as sc
adata = sc.read_visium('path/to/your/spatial/data')
# 看看基本结构
print(adata)
print(adata.obs.head())
print(adata.obsm['spatial'].head()) # 空间坐标
这段代码会输出 AnnData 对象的信息,其中 obsm['spatial'] 存放了每个斑点的 X、Y 坐标。这就是空间信息的来源。之后的课程里,我们会频繁操作这个对象。
一个小提醒: 不要把 obsm 和 obs 搞混了。obs 是细胞元数据,obsm 是多维结构的字典——长经验长的坑,我当年花了半天才搞明白为什么画不出空间图。