空间转录组Stereo-seq分析¶
一句话概述¶
Stereo-seq是BGI华大智造开发的空间转录组技术,能在厘米级视野下实现500nm纳米级分辨率——白话说就是:既能看到整个器官的全景,又能精确到单个细胞,是目前"看得最广又看得最细"的空间转录组技术。
核心知识点表格¶
| 知识点 | 说明 |
|---|---|
| Stereo-seq原理 | 用特制芯片(Stereo-seq chip)上的DNA纳米球(DNB)捕获组织mRNA,分辨率达500nm |
| SAW流程 | Stereo-seq Analysis Workflow,官方分析管线,从原始数据到空间表达矩阵 |
| GEF格式 | Gene Expression File,Stereo-seq特有的空间基因表达文件格式 |
| CellBin | SAW内置的图像处理模块,实现单细胞级别的分割 |
| Bin策略 | bin1/bin50/bin100/bin200,不同聚合粒度的分析单元 |
| Stereopy | Python分析包,专为Stereo-seq设计的下游分析工具 |
| 对比Visium | Stereo-seq分辨率更高(500nm vs 55μm)、视野更大(厘米级)、但数据量更大 |
| SAW V8.1.3 | 2025年3月发布的最新版本,自包含安装无需配置环境 |
| FaST | 2025年发布的替代管线,适用于Stereo-seq等亚细胞分辨率数据 |
各步骤详解¶
第一步:实验原理理解¶
白话解释: 想象一张超大的"邮票纸"(Stereo-seq芯片),纸上密密麻麻排列着数十亿个带条形码的小点。把一片组织切片贴上去,组织中的mRNA就会被最近的小点"抓住"。每个小点的条形码记录了"位置信息",这样测序后就知道每个mRNA来自组织的哪个位置。
与Visium对比:
第二步:SAW上游分析¶
白话解释: SAW(Stereo-seq Analysis Workflow)是官方分析流水线,功能类似于Visium的Space Ranger。它把测序数据和芯片位置信息对应起来,输出空间基因表达矩阵。
安装SAW(V8.1.3+):
# SAW V8.0+已经是自包含的tar.gz,解压即可使用
# 从STOmics官方GitHub下载:https://github.com/STOmics/SAW
# 下载SAW(以V8.1.3为例)
wget https://github.com/STOmics/SAW/releases/download/v8.1.3/SAW_v8.1.3.tar.gz # 下载SAW
# 解压安装
tar -xzf SAW_v8.1.3.tar.gz # 解压,无需额外配置
cd SAW_v8.1.3 # 进入目录
export PATH=$PWD:$PATH # 添加到环境变量
SAW核心分析流程:
# ========== SAW分析五大步骤 ==========
# 第一步:Reads分析(比对和基因表达矩阵生成)
# mapping:将FASTQ中的reads与芯片空间信息对应
saw mapping \ # reads比对
--fq1 sample_R1.fastq.gz \ # Read1文件(含空间barcode)
--fq2 sample_R2.fastq.gz \ # Read2文件(含cDNA序列)
--genomeDir /ref/STAR_index/ \ # STAR基因组索引目录
--mask /data/chip_mask.h5 \ # 芯片mask文件(含DNB位置信息)
--outSAMtype BAM \ # 输出BAM格式
--threads 16 # 线程数
# 第二步:组织区域识别与基因表达提取
# tissueCut:自动识别组织覆盖区域
saw tissueCut \ # 组织分割
--input mapping_output.gef \ # 上一步生成的GEF文件
--output tissue.gef \ # 输出只含组织区域的GEF
--binSize 200 # bin200粒度分析
# 第三步:空间聚类分析(bin200级别)
saw spatialCluster \ # 空间聚类
--input tissue.gef \ # 输入组织区域GEF
--binSize 200 \ # bin200粒度
--resolution 0.8 \ # 聚类分辨率
--output cluster_result # 输出目录
# 第四步:CellBin单细胞分割(需要染色图像)
# cellCut:基于显微图像进行细胞核分割
saw cellCut \ # 细胞分割
--input tissue.gef \ # 输入GEF文件
--image tissue_staining.tif \ # 组织染色图像(ssDNA/DAPI/HE)
--output cellbin.gef # 输出单细胞级GEF
# 第五步:单细胞级聚类
saw cellCluster \ # 细胞级聚类
--input cellbin.gef \ # 单细胞GEF
--resolution 1.0 \ # 聚类分辨率
--output cell_cluster_result # 输出目录
第三步:Bin策略理解¶
白话解释: Stereo-seq数据量巨大(一张芯片可能有上亿个DNB)。直接分析每个DNB不现实,所以把相邻的DNB合并成更大的"格子"(bin)。bin50就是50×50个DNB合并,bin200就是200×200个合并。格子越大,信息越粗略但分析越快。
bin1 → 500nm × 500nm → 最精细,数据量巨大(适合局部分析)
bin50 → 25μm × 25μm → 接近亚细胞(适合精细空间分析)
bin100 → 50μm × 50μm → 类似Visium的spot大小
bin200 → 100μm × 100μm → 常用起始分析粒度(速度快)
CellBin → 单细胞级别 → 基于图像分割,最有生物学意义
第四步:Stereopy下游分析(Python)¶
白话解释: Stereopy是专门为Stereo-seq设计的Python分析包,类似于Scanpy对单细胞数据的角色。
# 安装Stereopy
# pip install stereopy # pip安装
import stereo as st # 导入Stereopy
import numpy as np # 数组操作
# 读取GEF文件
data = st.io.read_gef(
file_path="tissue.gef", # GEF文件路径
bin_size=100 # bin100粒度
)
# 也可以读取为AnnData格式(兼容Scanpy)
# data = st.io.read_gef_to_anndata("tissue.gef", bin_size=100)
# 质控过滤
data.tl.cal_qc() # 计算质控指标
data.plt.violin(gene_names=["total_counts", "n_genes_by_counts"]) # 小提琴图
# 归一化
data.tl.normalize_total(target_sum=1e4) # 总量归一化到10000
data.tl.log1p() # log(x+1)转换
# 高变基因选择
data.tl.highly_variable_genes(
n_top_genes=3000, # 选择top 3000高变基因
min_mean=0.0125, # 平均表达量下限
max_mean=3 # 平均表达量上限
)
# PCA降维
data.tl.pca(
use_highly_genes=True, # 只用高变基因
n_pcs=50 # 计算50个主成分
)
# 邻近图和聚类
data.tl.neighbors(n_pcs=30) # 构建30维的近邻图
data.tl.leiden(resolution=1.0) # Leiden聚类
# UMAP降维可视化
data.tl.umap() # 运行UMAP
data.plt.umap(color="leiden") # 按聚类着色的UMAP图
# 空间可视化(核心!)
data.plt.spatial_scatter(
color="leiden" # 按聚类在空间上着色
)
# 差异表达分析
data.tl.rank_genes_groups(
groupby="leiden", # 按聚类分组
method="wilcoxon" # Wilcoxon检验
)
第五步:GEF转AnnData(与Scanpy/Seurat互通)¶
白话解释: GEF是Stereo-seq自己的格式。要用Scanpy或Seurat分析,需要转换成h5ad或RDS格式。
import stereo as st # 导入Stereopy
import scanpy as sc # 导入Scanpy
# GEF → AnnData(Scanpy格式)
adata = st.io.read_gef_to_anndata(
file_path="tissue.gef", # GEF文件
bin_size=100 # bin大小
)
# 保存为h5ad(Scanpy标准格式)
adata.write("stereo_seq_data.h5ad") # 保存
# 之后可以用Scanpy的全部功能分析
sc.pp.normalize_total(adata, target_sum=1e4) # Scanpy归一化
sc.pp.log1p(adata) # log转换
sc.pp.highly_variable_genes(adata) # 高变基因
sc.tl.pca(adata) # PCA
sc.pp.neighbors(adata) # 构建图
sc.tl.leiden(adata) # 聚类
sc.pl.spatial(adata, color="leiden") # 空间可视化
常见报错与解决¶
| 报错 | 原因 | 解决方案 |
|---|---|---|
SAW: mask file not found | 芯片mask文件路径错误 | 确认mask文件路径,通常从STOmics官方获取 |
Memory Error 内存不足 | Stereo-seq数据量极大 | 使用更大bin(bin200),或分块处理 |
CellBin: image registration failed | 图像与芯片对不上 | 检查图像方向,确保trackline可识别 |
GEF read error | GEF文件损坏或版本不兼容 | 确认SAW版本与GEF文件版本一致 |
Stereopy import error | Python版本或依赖不对 | 使用Python 3.8-3.10,pip install stereopy |
spatialCluster: too few bins | 组织区域太小 | 减小binSize或检查tissueCut结果 |
速查表¶
# ========== Stereo-seq分析速查 ==========
# SAW核心命令
saw mapping --fq1 R1.fq --fq2 R2.fq --genomeDir REF --mask MASK # 比对
saw tissueCut --input map.gef --output tissue.gef --binSize 200 # 组织分割
saw spatialCluster --input tissue.gef --binSize 200 # 聚类
saw cellCut --input tissue.gef --image stain.tif # 细胞分割
# Stereopy (Python) 核心流程
data = st.io.read_gef("tissue.gef", bin_size=100) # 读取
data.tl.normalize_total(target_sum=1e4) # 归一化
data.tl.log1p() # log转换
data.tl.pca(use_highly_genes=True) # PCA
data.tl.neighbors(n_pcs=30) # 建图
data.tl.leiden() # 聚类
data.plt.spatial_scatter(color="leiden") # 空间可视化
# 格式转换
adata = st.io.read_gef_to_anndata("file.gef", bin_size=100) # → AnnData
adata.write("output.h5ad") # → h5ad
面试高频问题¶
Q1: Stereo-seq和Visium的主要区别是什么?
核心区别有三个:(1) 分辨率:Stereo-seq 500nm vs Visium 55μm,相差100倍;(2) 视野:Stereo-seq可达厘米级全景,Visium约6.5mm×6.5mm;(3) 数据格式:Stereo-seq用GEF格式和SAW流程,Visium用Space Ranger。Stereo-seq是目前唯一同时实现厘米级视野和细胞级分辨率的技术。
Q2: Stereo-seq的bin策略是什么?怎么选择bin大小?
bin是把相邻DNB聚合的策略。bin200(100μm×100μm)适合初步探索,速度快;bin50(25μm)适合精细空间分析;CellBin基于图像分割,最有生物学意义但需要高质量染色图像。一般先用bin200快速看整体,再用CellBin做精细分析。
Q3: SAW流程的核心步骤有哪些?
SAW有五步:(1) mapping——将reads与空间位置对应;(2) tissueCut——识别组织覆盖区域;(3) spatialCluster——空间聚类分析;(4) cellCut/CellBin——基于图像的单细胞分割;(5) cellCluster——单细胞级聚类。SAW V8.0+是自包含安装包,解压即用。
Q4: Stereo-seq数据怎么和Scanpy/Seurat互通?
Stereopy提供
read_gef_to_anndata()函数将GEF转为AnnData(h5ad),可以直接用Scanpy分析。转RDS格式给Seurat目前还在开发中。也可以先转h5ad,再在R中用SeuratDisk转为Seurat对象。
Q5: 处理Stereo-seq数据有什么计算挑战?
最大挑战是数据量。一张Stereo-seq芯片可能产生数十亿DNB的数据,远超Visium的5000个spot。解决方案:(1) 使用bin策略降低分辨率;(2) 分区域处理;(3) 使用GPU加速;(4) SAW V8+优化了内存使用。2025年还出现了FaST等轻量级替代管线。