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. 全局差异: 整个组织不同区域的大尺度表达差异。比如皮层和髓质。
  2. 局部斑点: 某个小区域内的特异性表达模式。比如心脏发育中的传导系统形成灶。
  3. 微环境梯度: 细胞在几个细胞的范围内形成的信号梯度。比如形态素浓度梯度。

为什么要关注这个?因为在发育生物学里,很多关键事件都发生在局部。一个细胞是否决定分化为神经元,很大程度上取决于它周围的邻居怎么说。这就是你讲的“组织微环境”的力量。

核心观点: 空间特异性特征是连接“基因表达”和“空间位置”的桥梁。没有这道桥,我们看到的只是一个二维或三维的基因热力图,而不是发育过程的逻辑。

1.3 课程目标

学完这门课,我希望你能做到以下几件事:

  • 理解数据: 空间转录组数据长什么样?怎么读?有哪些坑?
  • 掌握方法: 从数据预处理、降维聚类,到空间斑点检测和空间变量基因识别。
  • 实战应用: 用 Python 生态(尤其是 SpaCET、Squidpy、Scanpy 等工具)跑通完整的分析流程。
  • 做出解释: 面对一张满是斑点的空间转录组数据图,能讲出发育背后的生物学故事。

注意,这不是一门纯理论课。每个模块我都会带代码示例,而且我会尽量用我自己在项目中踩过的坑来提醒你。

避坑指南: 我曾经在一次项目里,用标准的Seurat流程处理空间数据,结果发现聚类结果和组织的病理区域完全对不上。后来才发现是没做正确的空间协方差校正。嗯,这个教训很深。所以在你跑第一个模型前,务必做好预处理。

1.4 学习路径

整门课分成一个大的知识结构。你可以对照这张图来把握节奏:

课程知识体系结构 组织发育空间特异性特征学习 基础能力建设 空间数据理解 分析方法 核心课程主线 Python与空间数据分析 图像处理基础 统计与机器学习 数据格式解析 质量控制与过滤 降维与聚类 空间变量基因鉴定 邻域富集分析 细胞-细胞互作推断 最终目标:发育中的空间特异性模式识别 从空间转录组数据中提取有生物学意义的空间特征

这张图展示了课程的主线。你看,我们先打好基础(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 是多维结构的字典——长经验长的坑,我当年花了半天才搞明白为什么画不出空间图。