跳转至

空间转录组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特有的空间基因表达文件格式
CellBinSAW内置的图像处理模块,实现单细胞级别的分割
Bin策略bin1/bin50/bin100/bin200,不同聚合粒度的分析单元
StereopyPython分析包,专为Stereo-seq设计的下游分析工具
对比VisiumStereo-seq分辨率更高(500nm vs 55μm)、视野更大(厘米级)、但数据量更大
SAW V8.1.32025年3月发布的最新版本,自包含安装无需配置环境
FaST2025年发布的替代管线,适用于Stereo-seq等亚细胞分辨率数据

各步骤详解

第一步:实验原理理解

白话解释: 想象一张超大的"邮票纸"(Stereo-seq芯片),纸上密密麻麻排列着数十亿个带条形码的小点。把一片组织切片贴上去,组织中的mRNA就会被最近的小点"抓住"。每个小点的条形码记录了"位置信息",这样测序后就知道每个mRNA来自组织的哪个位置。

与Visium对比:

Visium:   55μm分辨率 → 每个spot含1-10个细胞 → 约5,000 spots
Stereo-seq: 500nm分辨率 → 真正亚细胞级 → 可达数十亿DNB

第二步: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 errorGEF文件损坏或版本不兼容确认SAW版本与GEF文件版本一致
Stereopy import errorPython版本或依赖不对使用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等轻量级替代管线。