1. 空间转录组学到底在解决什么问题
做单细胞测序的人都有一个共同的痛点:你把组织打碎成单个细胞之后,细胞的空间位置信息就彻底丢了。这就好比你拿到了一份城市居民的详细档案,知道每个人的职业、收入、兴趣爱好,但完全不知道他们住在城市的哪个区域。对于肿瘤研究、发育生物学、神经科学这些领域来说,位置信息往往和基因表达信息同等重要——你不仅想知道肿瘤细胞表达了什么,还想知道它周围的免疫细胞在干什么,它们之间隔了多远,谁在影响谁。
10X Visium空间转录组学就是冲着这个核心矛盾来的。它的基本思路是:不打碎组织,直接在切片上原位捕获mRNA。具体来说,把冷冻或FFPE组织切片贴在带有条形码捕获探针的载玻片上,切片经过透化处理后,mRNA被下方的探针捕获,然后进行逆转录和测序文库构建。每个捕获点(spot)的条形码序列是已知的,且对应载玻片上的固定坐标,因此测序完成后,你可以把每个spot的基因表达数据映射回原始组织切片的图像上。
这套方案的核心价值在于:保留空间坐标的同时获取全转录组数据。每个spot直径55微米,中心间距100微米,一个spot大约覆盖1到10个细胞,具体取决于组织类型。这意味着你拿到的不是单细胞分辨率,而是“局部区域”的表达谱。这一点非常关键,很多刚入门的人会误以为Visium是单细胞分辨率的空间转录组,实际上它是多细胞spot分辨率。理解这一点,后续所有的分析和解读才不会跑偏。
适合谁看这篇内容?如果你是做肿瘤微环境、组织发育、神经退行性疾病、免疫浸润相关研究的研究生或博后,正在考虑要不要上空间转录组,或者已经拿到了数据但不知道从哪下手,那这篇内容就是给你写的。我会从芯片结构讲起,一路讲到Space Ranger跑完、Seurat分析做完,中间踩过的坑和绕过的弯路都会说清楚。
2. Visium芯片结构与实验原理拆解
2.1 芯片上的捕获区域到底长什么样
Visium载玻片的核心区域是6.5mm × 6.5mm的捕获区,里面有大约5000个捕获spot。这些spot排列成六边形网格,不是正方形网格——这一点很重要,因为六边形排列在空间统计计算时会影响邻接矩阵的构建方式。每个spot直径55微米,相邻spot中心距100微米,所以spot之间是有间隙的,间隙区域没有捕获探针,不会产生数据。
每个spot上固定着大量捕获探针,这些探针包含三段关键信息:部分Read1测序引物序列、空间条形码(spatial barcode)、UMI(唯一分子标识符)以及poly-T尾巴。空间条形码是一段18个碱基的序列,每个spot的条形码组合是唯一的,5000个spot对应5000种不同的条形码。poly-T尾巴负责捕获mRNA的poly-A尾,这是真核生物mRNA的典型特征。
这里有一个容易忽略的细节:捕获探针的密度是有限的。每个spot上的探针数量大约在数百万级别,但实际捕获效率受到透化时间、组织类型、mRNA丰度等多重因素影响。如果你的目标基因表达量很低,可能需要增加测序深度来补偿。
2.2 组织切片与透化的关键参数
组织切片厚度通常建议在10微米左右,但这个数值不是绝对的。冷冻组织切片和FFPE组织切片的处理流程差异很大。冷冻切片需要经过固定、染色、成像、透化等步骤,而FFPE切片需要先脱蜡、抗原修复,然后才能进行透化。FFPE样本的RNA往往有降解,所以10X官方推荐使用专门针对FFPE的探针杂交方案,而不是依赖poly-A捕获。
透化时间是整个实验中最需要优化的参数。透化不足,mRNA释放不充分,捕获效率低;透化过度,mRNA扩散到邻近spot,造成空间信息模糊。10X官方建议通过透化时间优化实验来确定最佳时长,通常的做法是设置6分钟、12分钟、18分钟、24分钟、30分钟几个梯度,然后用荧光显微镜观察mRNA释放情况。我自己的经验是:小鼠脑组织冷冻切片12分钟比较合适,而人肿瘤组织可能需要18到24分钟,因为肿瘤组织纤维化程度高,细胞膜更坚韧。
注意:透化时间优化实验一定要用同批次、同类型的组织做,不同组织类型之间的透化条件不能直接套用。我见过有人用小鼠肝的透化条件直接做人肾,结果背景噪音高得没法看。
2.3 文库构建与测序策略
透化完成后,捕获探针上的poly-T已经抓到了mRNA,接下来进行逆转录,生成带有空间条形码和UMI的cDNA。然后进行第二链合成、末端修复、加A尾、连接测序接头,最后进行PCR扩增和文库质检。整个流程中,UMI的作用是区分原始mRNA分子和PCR扩增产物,避免重复计数。
测序策略方面,Visium文库通常采用双端测序,Read1读取空间条形码和UMI,Read2读取转录本序列。测序深度建议每个spot至少50,000 reads,如果要做低表达基因分析,建议提到100,000 reads以上。一个捕获区5000个spot,按50,000 reads/spot计算,需要2.5亿reads,也就是大约25G的测序数据量。这个数据量对于现在的测序平台来说不算大,但考虑到后续分析的计算资源,还是建议提前规划好存储和计算方案。
3. Space Ranger从原始数据到表达矩阵
3.1 Space Ranger的输入输出逻辑
Space Ranger是10X官方提供的Visium数据处理流程,输入是测序原始数据(FASTQ文件)和显微镜图像,输出是空间表达矩阵、组织图像、spot坐标信息。整个流程分为几个核心步骤:首先从Read1中提取空间条形码和UMI,然后与已知的条形码白名单进行比对,允许一个碱基的错配;接着从Read2中提取转录本序列,比对到参考基因组;最后进行UMI计数,生成每个spot的基因表达矩阵。
这里有一个关键点:Space Ranger需要显微镜图像来定义组织覆盖区域。只有被组织覆盖的spot才会被纳入分析,没有组织的spot会被标记为背景。图像的质量直接影响spot识别的准确性,所以拍照时一定要保证焦距清晰、光照均匀、组织边界分明。我建议在切片染色后、透化前拍照,这时候组织形态最完整。
3.2 参考基因组构建与比对参数
Space Ranger需要预先构建好的参考基因组索引,10X官方提供了人(GRCh38)和小鼠(mm10)的预构建索引,可以直接下载。如果你做的是非模式生物,需要用spaceranger mkref命令自己构建。构建时需要提供基因组FASTA文件和GTF注释文件,GTF文件中的基因注释要完整,特别是外显子边界要准确,否则会影响比对效率。
比对参数方面,Space Ranger默认使用STAR比对器,允许的错配数、剪接位点等参数都有默认值。对于大多数应用场景,默认参数已经足够。但如果你做的是FFPE样本,建议使用--probe-set参数指定探针集文件,因为FFPE样本的RNA降解严重,依赖poly-A捕获效率很低。
# Space Ranger基本运行命令示例 spaceranger count \ --id=my_sample \ --transcriptome=/path/to/refdata-gex-GRCh38-2020-A \ --fastqs=/path/to/fastq \ --sample=my_sample \ --image=/path/to/tissue_image.tif \ --slide=V19S13-xxx \ --area=A1 \ --localcores=16 \ --localmem=643.3 输出文件解读与质控指标
Space Ranger跑完之后,输出目录里有一堆文件,其中最重要的是filtered_feature_bc_matrix.h5和spatial文件夹。前者是过滤后的表达矩阵,只包含被组织覆盖的spot;后者包含spot的坐标信息和组织图像。还有一个raw_feature_bc_matrix.h5,包含所有spot的数据,包括背景spot,一般用不到。
质控指标方面,重点看几个数字:每个spot的UMI中位数、检测到的基因数中位数、线粒体基因比例。UMI中位数低于500的样本要警惕,可能是透化不足或测序深度不够。线粒体基因比例高于20%通常意味着组织质量差或透化过度。还有一个指标是spot利用率,也就是被组织覆盖的spot占总spot的比例,这个比例在30%到70%之间比较正常,太低说明组织切片太小或位置放偏了。
提示:Space Ranger的web_summary.html文件里有一个非常有用的可视化——spot覆盖图,可以直接看到组织在捕获区的位置和形状。如果组织明显偏在一侧,下次实验时调整切片位置。
4. Seurat空间数据分析实战
4.1 数据读入与初步质控
拿到Space Ranger的输出后,下一步就是导入Seurat进行下游分析。Seurat提供了Read10X()函数读取表达矩阵,然后用CreateSeuratObject()创建对象。空间信息通过Read10X_Image()函数读入,再用AddMetaData()把spot坐标添加到Seurat对象中。
library(Seurat) library(ggplot2) # 读入表达矩阵 counts <- Read10X("path/to/filtered_feature_bc_matrix") # 创建Seurat对象 seurat_obj <- CreateSeuratObject(counts = counts, project = "Visium", min.cells = 3, min.features = 200) # 读入空间图像 image <- Read10X_Image("path/to/spatial") seurat_obj[["slice1"]] <- image # 添加空间坐标到metadata seurat_obj$x <- seurat_obj[["slice1"]]@coordinates$imagerow seurat_obj$y <- seurat_obj[["slice1"]]@coordinates$imagecol初步质控和单细胞测序类似:过滤掉表达基因数过少或过多的spot,过滤掉线粒体基因比例过高的spot。但要注意,空间转录组的质控阈值不能照搬单细胞的标准。单细胞测序中,一个细胞检测到2000个基因算正常,但Visium一个spot覆盖多个细胞,检测到的基因数通常在3000到8000之间。如果某个spot检测到的基因数低于1000,可能是组织覆盖不全或透化失败。
4.2 标准化与特征选择
标准化这一步,Seurat默认使用LogNormalize方法,但空间转录组数据有一个特点:不同spot之间的捕获效率可能存在系统性差异,这种差异不仅来自测序深度,还可能来自组织本身的特性(比如某些区域细胞密度更高)。因此,除了标准的文库大小标准化,还可以考虑使用SCTransform方法,它通过负二项模型直接对UMI计数建模,能更好地处理技术噪音。
特征选择方面,FindVariableFeatures()函数默认选择2000个高变基因。对于空间转录组,我建议把nfeatures提高到3000,因为空间数据中很多基因的表达模式是空间特异性的,增加特征数有助于捕捉这些模式。但也不要太高,否则会引入噪音基因,影响后续聚类。
4.3 降维聚类与空间可视化
降维聚类是空间转录组分析的核心步骤。标准的流程是:PCA降维、选择主成分、构建KNN图、Louvain聚类。但空间转录组有一个独特的优势:你可以把聚类结果映射回组织图像上,直接观察不同cluster的空间分布。
# PCA降维 seurat_obj <- RunPCA(seurat_obj, npcs = 30) # 选择主成分 ElbowPlot(seurat_obj, ndims = 30) # 构建邻接图并聚类 seurat_obj <- FindNeighbors(seurat_obj, dims = 1:15) seurat_obj <- FindClusters(seurat_obj, resolution = 0.8) # UMAP降维 seurat_obj <- RunUMAP(seurat_obj, dims = 1:15) # 空间可视化 SpatialDimPlot(seurat_obj, label = TRUE, label.size = 3)这里有一个非常关键的参数:resolution。分辨率越高,聚类数越多。对于空间转录组,我建议从0.5开始尝试,逐步调整到1.0。太低的resolution会把空间上明显不同的区域合并在一起,太高的resolution会把同一区域切成碎片。判断标准是:聚类结果在空间上是否连续。如果某个cluster在空间上散落在多个不相邻的区域,可能是resolution太高了。
4.4 空间差异表达与区域注释
聚类完成后,下一步是找到每个cluster的标记基因,然后根据标记基因的功能注释cluster对应的生物学区域。比如,肿瘤样本中,上皮标记基因(EPCAM、KRT18)高表达的cluster可能是肿瘤区域,免疫标记基因(CD3D、CD79A)高表达的cluster可能是免疫浸润区域。
# 找到每个cluster的标记基因 markers <- FindAllMarkers(seurat_obj, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.5) # 查看top标记基因 top_markers <- markers %>% group_by(cluster) %>% top_n(n = 10, wt = avg_log2FC) # 空间特征图 SpatialFeaturePlot(seurat_obj, features = c("EPCAM", "CD3D", "COL1A1"))空间差异表达分析和普通差异表达分析有一个重要区别:空间数据存在空间自相关,相邻spot的表达值往往相似。这意味着标准的差异表达检验(如Wilcoxon秩和检验)可能会高估显著性,因为样本之间不独立。一种处理方法是使用空间感知的统计模型,比如SPARK或SpatialDE,这些工具专门针对空间数据的特性设计。如果只是做初步探索,标准方法也能用,但解读结果时要谨慎。
5. 常见问题与避坑指南
5.1 实验阶段的坑
组织切片位置偏移是最常见的问题之一。Visium捕获区只有6.5mm × 6.5mm,如果组织切片没有完全覆盖捕获区,或者偏在一角,会浪费大量spot。我的做法是:在切片前先用低倍镜确认组织大小,如果组织小于6.5mm × 6.5mm,尽量放在捕获区中央;如果组织大于捕获区,优先保证目标区域被覆盖。
透化过度导致信号扩散是另一个高频问题。透化过度的典型表现是:spot之间的表达相关性异常高,空间模式模糊,背景噪音升高。如果你在Space Ranger的web_summary里看到spot之间的中位基因数差异很小,同时线粒体基因比例普遍偏高,大概率是透化过头了。解决办法是缩短透化时间,或者降低透化温度。
RNA降解在FFPE样本中尤为常见。FFPE样本的RNA往往片段化严重,poly-A捕获效率很低。如果你做的是FFPE样本,强烈建议使用10X的FFPE探针杂交方案,而不是标准的poly-A捕获方案。探针方案针对每个基因设计多对探针,即使RNA片段化也能有效捕获。
5.2 数据分析阶段的坑
忽略spot分辨率的多细胞特性是新手最容易犯的错误。Visium一个spot覆盖1到10个细胞,所以你不能像单细胞分析那样,把每个spot当成一个独立细胞来解读。比如,如果你看到某个spot同时表达上皮标记和免疫标记,不要急着下结论说“上皮细胞和免疫细胞发生了融合”,更可能是这个spot里既有上皮细胞又有免疫细胞。
空间坐标与图像坐标混淆也是常见问题。Space Ranger输出的坐标是图像像素坐标,而Seurat的SpatialDimPlot默认使用这些坐标绘图。如果你想把表达数据映射到H&E染色图像上,需要确保图像文件和坐标文件的对应关系正确。我见过有人把不同样本的图像和坐标搞混了,结果空间分布图完全对不上。
聚类分辨率选择不当会直接影响生物学解读。分辨率太低,肿瘤区域和癌旁区域可能被合并成一个cluster;分辨率太高,同一肿瘤区域可能被切成多个cluster。我的经验是:先用低分辨率(0.3到0.5)看整体结构,再用高分辨率(0.8到1.2)看细节。最终选择哪个分辨率,取决于你的生物学问题——如果关注肿瘤和基质的边界,需要高分辨率;如果关注整体组织架构,低分辨率就够了。
5.3 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决方案 |
|---|---|---|---|
| spot利用率低于20% | 组织切片太小或位置偏移 | 查看web_summary的spot覆盖图 | 调整切片位置,确保组织覆盖捕获区中央 |
| 线粒体基因比例高于30% | 组织质量差或透化过度 | 检查透化时间优化实验结果 | 缩短透化时间,或使用新鲜组织 |
| 空间表达模式模糊 | 透化过度导致mRNA扩散 | 计算相邻spot的表达相关性 | 缩短透化时间,降低透化温度 |
| 聚类结果空间不连续 | resolution过高 | 尝试降低resolution | 从0.5开始逐步调整 |
| FFPE样本捕获效率低 | RNA降解严重 | 检查RNA完整性(RIN值) | 改用FFPE探针杂交方案 |
| 测序深度不足 | 每个spot reads数低于30,000 | 查看测序饱和度曲线 | 增加测序量或合并多个lane |
注意:空间转录组的数据分析没有“标准答案”,不同的组织类型、不同的生物学问题,最优的分析参数可能完全不同。上面表格里的建议是起点,不是终点。你需要根据自己的数据特点做调整。
6. 从数据到生物学故事的进阶思路
6.1 空间邻域分析
基础的聚类和差异表达做完之后,下一步可以考虑空间邻域分析。核心思路是:不仅看每个spot自身表达什么,还看它周围的spot表达什么。比如,你可以计算每个spot周围一圈spot的平均表达值,然后看这个“邻域表达谱”是否与spot自身的表达谱有差异。这种方法特别适合研究细胞间通讯和微环境梯度。
具体实现上,可以用Seurat的FindNeighbors()函数构建空间邻接图,然后计算邻域平均表达。或者使用专门的工具如Giotto或stLearn,它们提供了更丰富的空间统计功能。我自己的做法是:先用Seurat做基础分析,然后用Giotto做空间邻域富集分析,看看哪些基因在特定空间邻域中富集。
6.2 空间轨迹推断
如果你研究的是发育过程或疾病进展,空间轨迹推断会非常有价值。核心思路是:在空间上,细胞状态往往呈现梯度变化,比如从肿瘤核心到侵袭边缘,上皮-间质转化(EMT)相关基因的表达逐渐升高。你可以用Monocle3或Slingshot等工具,基于表达谱推断空间轨迹,然后把轨迹映射回组织图像上。
这里有一个关键点:空间轨迹不等同于时间轨迹。空间上的梯度可能反映的是微环境差异,而不是时间顺序。解读时要结合生物学背景,不要过度推断。
6.3 多切片整合与3D重建
如果你有同一个组织的多个连续切片,可以考虑做多切片整合。Seurat提供了IntegrateLayers()函数,可以把多个切片的表达数据整合到一个共同的空间中。更进一步,如果你有完整的连续切片序列,可以尝试3D重建,把多个2D切片堆叠成3D模型。这对于理解组织的三维结构非常有帮助,比如肿瘤的侵袭前沿在3D空间中是什么形状。
不过,多切片整合和3D重建对数据质量要求很高,切片之间的厚度要一致,染色要均匀,坐标对齐要准确。我建议先把单个切片分析做扎实,再考虑多切片整合。
6.4 与单细胞数据联合分析
空间转录组的一个经典应用场景是:用单细胞数据解卷积空间spot。因为Visium spot是多细胞混合,你可以用单细胞数据作为参考,推断每个spot中各种细胞类型的比例。常用的工具包括RCTD、SPOTlight、cell2location等。
# 使用SPOTlight进行解卷积的示例 library(SPOTlight) # 单细胞参考数据 sc_data <- readRDS("single_cell_reference.rds") # 空间数据 spatial_data <- seurat_obj # 解卷积 deconv_result <- SPOTlight( x = sc_data, y = spatial_data, groups = "cell_type", mgs = marker_genes, n_top = 100 ) # 可视化细胞类型比例 SpatialFeaturePlot(seurat_obj, features = deconv_result$mat)解卷积的结果可以帮助你理解:肿瘤区域中免疫细胞的比例是多少?侵袭边缘中成纤维细胞的比例是否升高?这些信息对于理解肿瘤微环境至关重要。但要注意,解卷积的准确性高度依赖单细胞参考数据的质量,如果参考数据中缺少某种细胞类型,解卷积结果就会有偏差。
7. 我踩过的那些坑和最后的建议
做了十几个Visium项目之后,我最大的体会是:实验阶段的质控比数据分析阶段的技巧重要得多。一个透化条件没优化好的样本,后续用再高级的算法也救不回来。所以,如果你刚开始做Visium,我建议先把透化时间优化实验做扎实,不要急着上正式样本。
另一个体会是:空间转录组的数据解读需要生物学背景。纯做数据分析的人很容易陷入“聚类-标记基因-通路富集”的套路,但空间转录组的真正价值在于把表达数据和空间位置结合起来,回答“谁在哪里、在做什么、和谁互动”的问题。如果你对组织学不够熟悉,建议找病理学家合作,一起看H&E图像和空间表达图,往往能发现纯数据分析看不到的模式。
最后分享一个小技巧:在Space Ranger跑完之后,先不要急着做下游分析,花半小时仔细看web_summary.html。这个文件里包含了所有关键的质控指标和可视化,包括spot覆盖图、测序饱和度曲线、基因表达分布等。很多问题在web_summary里就能发现,比如spot利用率低、线粒体基因比例高、测序深度不足等。提前发现这些问题,可以避免在后续分析中浪费时间。
空间转录组学还在快速发展,新的分析工具和方法层出不穷。但无论工具怎么变,核心逻辑是不变的:理解实验原理,做好质控,结合生物学背景解读数据。这三条做到了,你的空间转录组项目就成功了一大半。