跳转至

空间转录组Visium分析

一句话概述

10x Genomics Visium是目前最主流的空间转录组技术,通过在组织切片上捕获mRNA并保留空间位置信息,实现"基因表达地图"的绘制——白话说就是:不仅知道哪些基因在表达,还知道它们在组织的哪个位置表达。


核心知识点表格

知识点说明
Visium原理组织切片放在带有条形码的载玻片上,每个spot(约55μm直径)捕获该位置的mRNA
spot vs 单细胞每个spot包含1-10个细胞,不是真正的单细胞分辨率
Space Ranger10x官方上游分析软件,类似Cell Ranger,输出表达矩阵+空间坐标
SeuratR语言主流分析框架,v5支持空间数据分析、WNN、RCTD反卷积
SCTransformSeurat推荐的归一化方法,同时完成归一化和校正
空间可变基因(SVG)在空间上表达不均匀的基因,用Moran's I或SPARK-X检测
RCTD反卷积估计每个spot中不同细胞类型的比例,需要单细胞参考数据
CellChat基于空间信息进行细胞间通讯分析
STUtility基于Seurat的R包,支持多切片对齐和3D可视化
Visium HD / CytAssist新一代Visium产品,更高分辨率,传统Visium将于2026年3月停产

各步骤详解

第一步:上游处理(Space Ranger)

白话解释: Space Ranger就像Cell Ranger的"空间版",它把测序下机的数据和组织图像对应起来,告诉你每个spot捕获了多少哪些基因的mRNA。

技术细节: Space Ranger对FASTQ文件进行比对、去重、UMI计数,同时利用组织H&E染色图像进行配准。

# 安装Space Ranger(需要从10x Genomics官网下载)
# 下载地址:https://www.10xgenomics.com/support/software/space-ranger

# 运行spaceranger count(核心命令)
spaceranger count \                      # 主命令:计数分析
  --id=sample_01 \                       # 样本ID,自己命名
  --transcriptome=/ref/refdata-gex-GRCh38 \  # 参考基因组路径
  --fastqs=/data/fastqs/ \               # 测序FASTQ文件目录
  --sample=Sample1 \                     # FASTQ文件中的样本名
  --image=/data/tissue_image.tif \       # 组织H&E染色图像
  --slide=V19L01-041 \                   # 载玻片序列号
  --area=A1 \                            # 捕获区域编号
  --localcores=16 \                      # 使用CPU核心数
  --localmem=64                          # 最大内存(GB)

第二步:数据加载与质控(R/Seurat)

白话解释: 把Space Ranger的结果读入R,看看数据质量怎么样——比如每个spot检测到多少基因、有没有异常的spot。

# 安装必要的R包
# install.packages("Seurat")           # 安装Seurat(如果没有)
library(Seurat)                         # 加载Seurat包

# 加载Visium数据
# Load10X_Spatial()读取spaceranger输出,自动关联图像
spatial_data <- Load10X_Spatial(
  data.dir = "spaceranger_output/outs/",  # Space Ranger输出目录
  filename = "filtered_feature_bc_matrix.h5",  # 表达矩阵文件
  assay = "Spatial",                     # 检测类型命名为Spatial
  slice = "tissue_slice"                 # 切片名称
)

# 查看数据基本信息
spatial_data                             # 显示基因数、spot数等信息

# 质控:计算线粒体基因比例(高比例说明细胞可能受损)
spatial_data[["percent.mt"]] <- PercentageFeatureSet(
  spatial_data,                          # 输入Seurat对象
  pattern = "^MT-"                       # 线粒体基因以MT-开头
)

# 空间可视化质控指标
SpatialFeaturePlot(
  spatial_data,                          # Seurat对象
  features = "nCount_Spatial"            # 可视化每个spot的UMI总数
)

# 过滤低质量spot
spatial_data <- subset(
  spatial_data,                          # 原始数据
  subset = nFeature_Spatial > 200 &      # 至少检测到200个基因
    nFeature_Spatial < 6000 &            # 最多6000个基因(去除doublet)
    percent.mt < 20                      # 线粒体基因比例不超过20%
)

第三步:归一化与降维聚类

白话解释: 对数据做标准化处理(让不同spot之间可以比较),然后找出哪些spot的表达模式相似,把它们归为一类。

# SCTransform归一化(Seurat推荐方法)
# 白话:校正技术噪音,让生物学差异凸显出来
spatial_data <- SCTransform(
  spatial_data,                          # 输入Seurat对象
  assay = "Spatial",                     # 指定Spatial assay
  verbose = FALSE                        # 不显示冗余信息
)

# PCA降维(把高维数据压缩到少数几个主成分)
spatial_data <- RunPCA(
  spatial_data,                          # 输入数据
  assay = "SCT",                         # 使用SCTransform后的数据
  verbose = FALSE                        # 静默模式
)

# 构建近邻图 + 聚类
spatial_data <- FindNeighbors(
  spatial_data,                          # 输入数据
  reduction = "pca",                     # 基于PCA结果
  dims = 1:30                            # 使用前30个主成分
)
spatial_data <- FindClusters(
  spatial_data,                          # 输入数据
  verbose = FALSE,                       # 静默模式
  resolution = 0.8                       # 分辨率,越大cluster越多
)

# UMAP降维(用于可视化)
spatial_data <- RunUMAP(
  spatial_data,                          # 输入数据
  reduction = "pca",                     # 基于PCA
  dims = 1:30                            # 使用前30个主成分
)

# 在组织切片上可视化聚类结果
SpatialDimPlot(
  spatial_data,                          # Seurat对象
  label = TRUE,                          # 显示cluster编号
  label.size = 3                         # 标签字体大小
)

第四步:空间可变基因(SVG)鉴定

白话解释: 找出那些"在空间上表达不均匀"的基因——比如某个基因只在肿瘤区域高表达,在正常组织区域低表达。

# 使用Moran's I检测空间可变基因
# Moran's I衡量空间自相关性:值越高说明空间分布越不随机
spatial_data <- FindSpatiallyVariableFeatures(
  spatial_data,                          # 输入数据
  assay = "SCT",                         # 使用SCTransform后的数据
  features = VariableFeatures(spatial_data),  # 候选基因列表
  selection.method = "moransi"           # 使用Moran's I方法
)

# 查看top空间可变基因
top_svg <- head(
  SpatiallyVariableFeatures(spatial_data, selection.method = "moransi"),
  n = 6                                  # 前6个SVG
)
print(top_svg)                            # 打印结果

# 可视化空间可变基因的表达分布
SpatialFeaturePlot(
  spatial_data,                          # Seurat对象
  features = top_svg[1:4],               # 显示前4个SVG
  ncol = 2,                              # 每行2个图
  alpha = c(0.1, 1)                      # 透明度范围
)

第五步:反卷积分析(RCTD)

白话解释: 每个Visium spot里面有好几个细胞。反卷积就是"拆开"每个spot,推算里面各种细胞类型各占多少比例——就像知道一杯混合果汁里苹果汁、橙汁各占多少。

# 需要一个单细胞RNA-seq参考数据集
# 假设已有配套的scRNA-seq Seurat对象:sc_ref
# 1. 准备参考数据
library(spacexr)                         # 加载spacexr包(包含RCTD)

# 提取参考数据的计数矩阵和细胞类型信息
counts_ref <- GetAssayData(sc_ref, slot = "counts")  # 参考表达矩阵
cell_types <- sc_ref$celltype            # 每个细胞的类型标签
names(cell_types) <- colnames(sc_ref)    # 确保有细胞barcode名字

# 创建Reference对象
reference <- Reference(
  counts = counts_ref,                   # 参考表达矩阵
  cell_types = cell_types                # 细胞类型标签
)

# 2. 准备空间数据
counts_st <- GetAssayData(spatial_data, assay = "Spatial", slot = "counts")
coords <- GetTissueCoordinates(spatial_data)  # 获取空间坐标
query <- SpatialRNA(
  coords = coords,                       # 空间坐标
  counts = counts_st                     # spot表达矩阵
)

# 3. 运行RCTD
rctd <- create.RCTD(query, reference, max_cores = 8)  # 创建RCTD对象
rctd <- run.RCTD(rctd, doublet_mode = "doublet")      # 运行反卷积

# 4. 将结果加入Seurat对象
spatial_data <- AddMetaData(
  spatial_data,                          # 原始Seurat对象
  metadata = rctd@results$weights        # RCTD估计的细胞类型比例
)

常见报错与解决

报错原因解决方案
Error: Image not found图像路径不正确或格式不支持检查图像路径,确保是.tif或.png格式
Error in Load10X_Spatial: file not found目录结构不对确保有spatial/目录和filtered_feature_bc_matrix.h5文件
SCTransform error: no variable genes过滤太严格导致基因太少放宽过滤阈值,保留更多基因
FindSpatiallyVariableFeatures: 0 features候选基因列表为空先运行VariableFeatures()获取候选基因
spaceranger: slide ID not recognized载玻片序列号输错检查载玻片背面的序列号,或用--unknown-slide选项
RCTD: reference has too few cells参考数据细胞数不足确保每种细胞类型至少25个细胞
内存不足 (killed)数据量大,内存爆了用subsample减少数据量,或增加服务器内存

速查表

# ========== 快速命令速查 ==========

# Space Ranger流程
spaceranger count --id=ID --transcriptome=REF --fastqs=DIR --image=IMG --slide=SN --area=A1

# R分析核心流程(6步)
data <- Load10X_Spatial("outs/")         # 1. 加载
data <- SCTransform(data, assay="Spatial")  # 2. 归一化
data <- RunPCA(data)                     # 3. PCA
data <- FindNeighbors(data, dims=1:30)   # 4. 建图
data <- FindClusters(data, resolution=0.8)  # 5. 聚类
SpatialDimPlot(data, label=TRUE)         # 6. 可视化

# 空间可变基因
FindSpatiallyVariableFeatures(data, selection.method="moransi")

# 关键可视化函数
SpatialFeaturePlot(data, features="GENE")  # 单基因空间表达图
SpatialDimPlot(data)                     # 聚类空间分布图

面试高频问题

Q1: Visium的空间分辨率是多少?和单细胞有什么区别?

Visium标准版每个spot直径55μm,间距100μm(中心到中心),一张切片约5000个spot。每个spot包含1-10个细胞,所以不是真正的单细胞分辨率。如果需要单细胞分辨率,可以用Visium HD(2μm)或10x Xenium(原位杂交技术)。

Q2: 什么是空间可变基因(SVG),怎么检测?

SVG是指在空间上表达模式不均匀的基因。比如一个基因只在肿瘤核心区域高表达,而在周围正常组织低表达。常用Moran's I(衡量空间自相关)或SPARK-X(非参数方法)来检测。Moran's I值越接近1,说明空间聚集性越强。

Q3: Visium数据的反卷积是什么?为什么需要?

因为每个spot含多个细胞,直接分析只能得到"混合信号"。反卷积就是用单细胞参考数据,推算每个spot中各细胞类型的比例。常用方法有RCTD(Seurat内置)、cell2location、SPOTlight等。需要一个高质量的配对单细胞数据集作为参考。

Q4: Seurat v5在空间分析方面有哪些新特性?

Seurat v5新增了:(1) 原生支持RCTD反卷积;(2) 支持Visium HD和Xenium等新平台;(3) Moran's I方法检测空间可变基因;(4) 多样本空间数据整合(结合Harmony进行批次校正);(5) 支持VisiumHD的几何下采样(geometric sketching)。

Q5: 空间转录组有哪些主要技术路线?各有什么优缺点?

主要分两大类:(1) 基于测序的:Visium(通量高但分辨率有限)、Slide-seq、MERFISH;(2) 基于原位杂交的:10x Xenium、Vizgen MERSCOPE(单细胞分辨率,但检测基因数有限)。选择取决于:分辨率需求、检测基因数、组织大小、成本预算。