本文的代码来自Seurat官方网站的空转教程。
1.R包和数据准备
r
rm(list = ls())
library(Seurat)
library(SeuratData)
library(ggplot2)
library(patchwork)
library(dplyr)
数据来自10X官方网站,也可以从SeuratData获取。InstallData会安装R包,如果已安装,运行这句代码不会导致重复安装。
r
InstallData("stxBrain")
r
brain <- LoadData("stxBrain", type = "anterior1")
brain
plain
## An object of class Seurat
## 31053 features across 2696 samples within 1 assay
## Active assay: Spatial (31053 features, 0 variable features)
## 1 layer present: counts
## 1 spatial field of view present: anterior1
这个示例数据是直接Load的,正常的空转数据需要用Load10X_Spatial()读取,目录树组织形式如下:
plain
GSM7980860/
├── filtered_feature_bc_matrix/ # 表达矩阵文件夹
│ ├── barcodes.tsv.gz # Spot 编号
│ ├── features.tsv.gz # 基因信息
│ └── matrix.mtx.gz # 稀疏表达矩阵
│
└── spatial/ # 空间信息文件夹
├── tissue_positions_list.csv # 空间坐标文件
├── scalefactors_json.json # 图像缩放比例参数
└── tissue_hires_image.png # 高清HE染色组织切片图
查看空转的Seurat对象结构
r
str(brain,max.level = 2)
plain
## Formal class 'Seurat' [package "SeuratObject"] with 13 slots
## ..@ assays :List of 1
## ..@ meta.data :'data.frame': 2696 obs. of 5 variables:
## ..@ active.assay: chr "Spatial"
## ..@ active.ident: Factor w/ 1 level "anterior1": 1 1 1 1 1 1 1 1 1 1 ...
## .. ..- attr(*, "names")= chr [1:2696] "AAACAAGTATCTCCCA-1" "AAACACCAATAACTGC-1" "AAACAGAGCGACTCCT-1" "AAACAGCTTTCAGAAG-1" ...
## ..@ graphs : list()
## ..@ neighbors : list()
## ..@ reductions : list()
## ..@ images :List of 1
## ..@ project.name: chr "anterior1"
## ..@ misc : list()
## ..@ version :Classes 'package_version', 'numeric_version' hidden list of 1
## ..@ commands : list()
## ..@ tools : list()
其中图像信息存储在了"images"部分。
2.数据预处理
受组织结构、密度的影响,加上技术性问题,同一个样本中的测序深度存在显著的异质性,需要有效的标准化处理来消除。
r
plot1 <- VlnPlot(brain, features = "nCount_Spatial", pt.size = 0.1) + NoLegend()
plot2 <- SpatialFeaturePlot(brain, features = "nCount_Spatial") + theme(legend.position = "right")
wrap_plots(plot1, plot2)

SCTransform相当于经典流程里面的
NormalizeData(),FindVariableFeatures(),ScaleData()三个函数的合体,是空转流程中推荐的标准化方式。
r
brain <- SCTransform(brain, assay = "Spatial", verbose = FALSE)
3.指定的基因表达量的可视化
r
SpatialFeaturePlot(brain, features = c("Hpca", "Ttr"))

pt.size.factor参数可以调节点的大小
alpha表示对不同表达量的值设置不同的透明度,低表达的点会更加透明。
r
p1 <- SpatialFeaturePlot(brain, features = "Ttr", pt.size.factor = 1)
p2 <- SpatialFeaturePlot(brain, features = "Ttr", alpha = c(0.1, 1))
p1 + p2

4.降维聚类和可视化
降维聚类和可视化与单细胞转录组类似。
r
brain <- RunPCA(brain, assay = "SCT", verbose = FALSE)
brain <- FindNeighbors(brain, reduction = "pca", dims = 1:30)
brain <- FindClusters(brain, verbose = FALSE)
brain <- RunUMAP(brain, reduction = "pca", dims = 1:30)
调了个漂亮一点的颜色。
r
library(paletteer)
my_colors <- paletteer_d("ggsci::nrc_npg")
library(RColorBrewer)
my_colors <- colorRampPalette(my_colors)(nlevels(brain))
p1 <- DimPlot(brain, reduction = "umap", label = TRUE) +
scale_color_manual(values = my_colors, name = "Cluster")+
coord_fixed()+
NoLegend()
p2 <- SpatialDimPlot(brain, label = TRUE, label.size = 3) +
scale_fill_manual(values = my_colors, name = "Cluster")
p1 + p2

可以在组织切片上面高亮特定簇(例如0、1)的细胞,看的更加清楚。
r
SpatialDimPlot(brain,
cells.highlight = CellsByIdentities(object = brain,
idents = c(0,1)),
facet.highlight = TRUE,
ncol = 2) &
theme(plot.margin = unit(c(1, 1, 1, 1), "mm"))

5.识别空间高变基因
Seurat提出了两种方法来识别与组织内空间位置相关的基因。一种是差异表达分析,熟悉的FindMarkers。
r
de_markers <- FindMarkers(brain, ident.1 = 5, ident.2 = 7)
SpatialFeaturePlot(object = brain, features = rownames(de_markers)[1:3], alpha = c(0.1, 1), ncol = 3)

另一种方法是FindSpatiallyVariableFeatures,用莫兰指数作为度量指标。有一些新的算法可以替代它,例如Spark-X和HEARTSVG,且听下回分解。
r
#install.packages('Rfast2')
brain <- FindSpatiallyVariableFeatures(brain,
features = VariableFeatures(brain)[1:1000],
selection.method = "moransi")
推荐安装Rfast2这个包,可以加快FindSpatiallyVariableFeatures计算的速度。
通过该方法得到的前6个基因的组织分布如下。
r
top.features <- head(SpatiallyVariableFeatures(brain, method = "moransi"), 6)
SpatialFeaturePlot(brain, features = top.features,
ncol = 3, alpha = c(0.1, 1)) &
theme(plot.margin = unit(c(1, 1, 1, 1), "mm"))

6.提取区域子集
这里是想要根据聚类结果和脑部实际结构,近似提取前额叶皮层的子集,划定区域的工作通常需要由经验丰富的病理医生完成。
r
brain_sub <- subset(brain, idents = c(1, 2, 3, 4, 6, 7))
SpatialDimPlot(brain_sub, label = T, crop = T, label.size = 3) + NoLegend() +
SpatialDimPlot(brain_sub, label = T, crop = F, label.size = 3)

显示坐标轴文字,来大致确定选取的坐标范围。
r
theme_axis_labels <- theme(axis.text.x = element_text(size = 10),
axis.text.y = element_text(size = 10),
axis.title.x = element_text(size = 10),
axis.title.y = element_text(size = 10))
SpatialDimPlot(brain_sub, label = T, label.size = 3, crop = T) + theme_axis_labels

可以用Crop函数实现矩形切割
r
brain_sub[["anterior1"]] <- Crop(brain_sub[["anterior1"]],
x = c(150, 500),
y = c(0, 425))
#切完之后的图
SpatialDimPlot(brain_sub)

这里是想要排除1簇的右下角的细胞,因为他们不属于前额叶皮层。
官方代码在这里没有解释咋弄的,我来画张图你就明白了。
下面这段具体的代码不用看,直接看结果。
r
# 官方示例定义的斜率和截距,仅适用于当前示例数据
m <- 0.6
b <- -550
p <- SpatialDimPlot(brain_sub)
panel <- ggplot_build(p)$layout$panel_params[[1]]
x_view <- panel$x.range
y_view <- -rev(panel$y.range)
y_line <- -(m * x_view + b)
p <- p +
annotate("segment", x = x_view[1],y = y_line[1],
xend = x_view[2],yend = y_line[2],color = "yellow",
linetype = "dashed", linewidth = 1.2) +
coord_fixed(xlim = x_view,ylim = y_view,
expand = FALSE,clip = "on")
p

就是说画了个斜线,纵坐标在斜线以上的细胞才会被保留下来。如果是自己的数据,截距和斜率必须自己调整,不能全盘照搬。
r
m <- 0.6
b <- -550
# 提取线以上的spot
cortex_coords <- GetTissueCoordinates(brain_sub, scale = "lowres") %>%
subset(-y >= (m * x + b))
cortex <- subset(brain_sub,
cells = cortex_coords$cell)
ncol(cortex)
plain
## [1] 1071
r
SpatialDimPlot(cortex, label = T, label.size = 3, crop = T)

再次画个斜线上去,线以下确实没有点了。说明我说的是对滴。
r
library(ggplot2)
library(Seurat)
p <- SpatialDimPlot(cortex)
# 获取当前图的坐标范围
x_auto <- ggplot_build(p)$layout$panel_params[[1]]$x.range
y_view_auto <- -rev(ggplot_build(p)$layout$panel_params[[1]]$y.range) # 补充 y 的范围
y_auto <- -(m * x_auto + b)
p <- p +
annotate("segment", x = x_auto[1], y = y_auto[1],
xend = x_auto[2], yend = y_auto[2], color = "yellow",
linetype = "dashed", linewidth = 1.2) +
coord_fixed(xlim = x_auto, ylim = y_view_auto,
expand = FALSE, clip = "on")
p

仅画出选中的群,第一张图是放大的,第二张图不放大。
r
c1 <- SpatialDimPlot(cortex, images = "anterior1", crop = T, label = T)
c1

将前额叶皮层和整个切片地Seurat对象各自存为rds,以备后续分析使用。
r
saveRDS(cortex,file = "cortex.rds")
saveRDS(brain,file = "brain.rds")