前面我们演示了R语言里面的最流行的Seurat的单细胞流程是如何导入标准10x技术空间单细胞文件, 虽然说也有其它空间单细胞技术可以产出各式各样的数据。详见:10x的空间单细胞文件格式详解,但是我们粗浅的可以认为空间单细胞约等于10x技术。不过Seurat官网确实是给出来了两个分类:
- Analysis of spatial datasets (Sequencing-based),比如: 10x Visium and Slide-seq v2.
- Analysis of spatial datasets (Imaging-based),比如: MERSCOPE, Xenium, CosMx SMI, and CODEX.
为什么现在才强推空间单细胞转录组呢
老实说,过去的三年虽然说我一直在朋友圈刷到有空间单细胞的cns文章,但我实际上是瞧不起这个技术的。首先它仅仅是给大红大紫的单细胞转录组续命而已,其次它根本就不是真正的单细胞水平,所以绝大部分数据分析哦度非常粗糙,仅仅是蹭热点。。。。
但是,从今天开始,一切变天了。因为真正的空间单细胞确实是来了,起码朋友圈可以看到各种动态了,我也非常期待!
而且这个变革对数据分析人员来说其实是非常友好,因为公司还是10x,所以绝大部分大家耳熟能详的数据格式,分析流程都是原模原样的,而且因为是真正的空间单细胞所以没必要在各种去卷积工具层面浪费时间精力啦。大家看到的各种各样的教程:CARD, RCTD, cell2location, DestVI,SpatialDWLS, SPOTlight, STRIDE, CellDART, Celloscope, DSTG和Stereoscope
都可以直接丢弃了 , 太开心了。就好像是大家做单细胞转录组的降维聚类分群,其实没有人去关心pca怎么弄,tsne和umap如何弄,因为一个Seurat全部打通,而且都是默认参数默认结果,大家需要做的是数据分析结果图表的解读,赋予生物学意义,这才是真正的技术应该发挥的作用!
权威资料:Seurat官网
而且Seurat官网居然有对这些全部的数据的示范的读取案例,非常棒!所以单细胞数据分析教程优先应该是看Seurat官网以及10x公司的官网。
但是技术太多就会导致数据处理环节的教程很难写,所以我们仍然是专注于10x的空间哦,而且呢实际情况下绝大部分10x的空间单细胞文件都不标准,因为大家并不是从fq文件开始走Space Ranger。这个就是初学者的拦路虎,值得我们重点讲解。另外就是我们接下来(2023年12月30日之后)的教程都是基于Seurat的V5版本哦:
需要理解Seurat包的一些跟10x技术空间单细胞文件的导入相关的函数,比如:
Read10X Load in data from 10X
Read10X_h5 Read 10X hdf5 file
Read10X_Image Load a 10X Genomics Visium Image
Load10X_Spatial Load a 10x Genomics Visium Spatial Experiment into a 'Seurat' object
如果你走Space Ranger拿到了全部的文件,那么 Load10X_Spatial 函数就最方便了,它会一起读取h5格式的表达量矩阵以及spatial文件夹里面的图片文件哦 。这些细节都可以在:https://rdrr.io/github/satijalab/seurat/src/R/preprocessing.R 里面找到:
首先是导入表达量矩阵(等同于常规单细胞转录组数据)
表达量矩阵可以是csv或者txt这样的文本文件,也可以是前面提到的Market Exchange Format (MEX) 和 Hierarchical Data Format (HDF5) 这两个来源于 spaceranger count 定量流程的 格式。
如果是Market Exchange Format (MEX) 表达量矩阵形式,那么使用Read10X函数读取对应的文件夹即可,每个文件夹里面的3个文件名字是固定的哦。如果是Hierarchical Data Format (HDF5) 格式,那么当然是Read10X_h5啦,如果是其它格式,比如csv或者txt这样的文本文件,取决于制作这样的文件的人是如何安排里面的行列信息的,每个人都不一样哦。参考前面的单细胞转录组表达量矩阵文件读取教程即可:
这个时候其实并不需要理会单细胞空间转录组技术,因为还没有涉及到空间相关信息。而且这个时候没有空间信息的矩阵其实可以完完全全参考我们前面的单细胞转录组数据分析代码哦,没有如何特殊的地方。
其次是导入空间信息
空间信息最方便的当然是图片文件啦,其中tissue_hires_image.png
and tissue_lowres_image.png
,都可以读取。需要使用的就是Read10X_Image函数啦,它有两种方式,如果你的spatial文件夹是标准的,或者说里面的图片文件是齐全的, 如下所示:
ls -lh GSE158328_RAW/A1/spatial/ |cut -d" " -f 7-
1.6M Feb 20 2020 aligned_fiducials.jpg
1.8M Feb 20 2020 detected_tissue_image.jpg
163B Feb 20 2020 scalefactors_json.json
4.6M Feb 20 2020 tissue_hires_image.png
496K Feb 20 2020 tissue_lowres_image.png
180K Feb 20 2020 tissue_positions_list.csv
那么最简单的函数就是:
img <- Read10X_Image(image.dir = file.path("./GSE158328_RAW/A1/",
"spatial"), filter.matrix = TRUE)
img
这个函数会去这个 GSE158328_RAW/A1/spatial/ 文件夹里面找自己需要的图片文件进行读取,如果你想自己指定图片文件,也是可以的;
d="./GSE158328_RAW/A1/spatial/"
list.files(d)
image2 = Read10X_Image(d,"tissue_hires_image.png")
如果作者什么都不给,比如:《Spatially Resolved Multi-Omics Single-Cell Analyses Inform Mechanisms of Immune Dysfunction in Pancreatic Cancer. Gastroenterology 2023 Oct;165(4):891-908.e14. PMID: 37263303》文章里面的数据集是GSE205354,它就仅仅是提供了表达量矩阵没有然后空间信息,那就不可能把它当做是空间单细胞转录组数据处理了,只能说是走普通单细胞转录组的降维聚类分群流程。
接着是整合单细胞表达量矩阵和空间信息
上面我们读取了表达量矩阵命名为ct这个变量,它是一个稀疏矩阵,然后读取了图片文件命名为img变量,接下来就可以把这两个变量整合成为Seurat的空间单细胞对象,全部的代码如下所示:
# https://rdrr.io/github/satijalab/seurat/src/R/preprocessing.R
sceP <- CreateSeuratObject(counts = ct, assay = "Spatial")
img <- img[Cells(x = sceP)]
DefaultAssay(sceP = img) <- "Spatial"
sceP[['slice1']] <- img
读取好的对象就可以走后面的降维聚类分群流程啦,前提是认真了解这个Seurat的空间单细胞对象,详见:认识Seurat的空间单细胞对象结构 :
> sceP
An object of class Seurat
33538 features across 4992 samples within 1 assay
Active assay: Spatial (33538 features, 0 variable features)
1 layer present: counts
1 image present: slice1
读取坐标文件作为空间信息
但是也有些时候作者并不公开图片文件,也可以是 tissue_positions.csv
这样的文本文件里面记录了空间单细胞的每个spot的坐标信息。这个时候这个坐标文件很容易读取,因为就是普通的文本文件,然后就有两个方法把坐标文件作为的空间信息整合到前面的表达量矩阵后成为Seurat的空间单细胞对象,也是需要认真了解这个Seurat的空间单细胞对象,详见:认识Seurat的空间单细胞对象结构 ,就是需要修改对象里面的空间信息(images元素)。这个我们后面再分享
最后是走空间单细胞基本流程
就是降维聚类分群啦,参考:https://satijalab.org/seurat/articles/spatial_vignette.html