空间转录组|Load10X_Spatial函数修改适配多形式数据 + 空转标准流程

本文涉及的产品
文档翻译,文档翻译 1千页
图片翻译,图片翻译 100张
文本翻译,文本翻译 100万字符
简介: 空间转录组|Load10X_Spatial函数修改适配多形式数据 + 空转标准流程

本文首发于“生信补给站”公众号  https://mp.weixin.qq.com/s/_HFYizD8vmYcXdwsfIErXQ


空间转录组|数据读入,标准数据形式外,还有哪些"天残地缺"可以读取提到了多种形式的数据读取,在原函数Load10X_Spatial的基础上进行了 “简陋”的修改,添加一些判断使之可以读取上文提到的多种数据形式。

后台回复 “函数” 既可以获取Load10X_Spatial_change.R 和 测试数据文件。第二部分为空转的Seurat标准分析流程,重点介绍了和单细胞转录组的差异。

Load10X_Spatial_change函数测试 


加载R包和函数,然后使用不用场景进行测试。


library(Seurat)
library(jsonlite)
library(png)
library(tidyverse)
library(ggpubr)
library(patchwork)
source("Load10X_Spatial_change.R")

1, 标准数据读取

含有h5文件 + spatial文件夹

T0 <- Load10X_Spatial_change(data.dir = ".\\outs\\",filename = "filtered_feature_bc_matrix.h5")
for (i in colnames((T0@images$slice1@coordinates))) {
  T0@images$slice1@coordinates[[i]] <- as.integer(T0@images$slice1@coordinates[[i]])
}
SpatialDimPlot(T0,alpha = 0)

注:循环修改integer 的操作,也许你的数据不需要

2,filtered_feature_bc_matrix文件夹 + spatial文件夹(无 h5文件)

data.dir = ".\\outs_noh5\\"
T1 <- Load10X_Spatial_change(data.dir = data.dir,
                             filename = "filtered_feature_bc_matrix")
for (i in colnames((T1@images$slice1@coordinates))) {
  T1@images$slice1@coordinates[[i]] <- as.integer(T1@images$slice1@coordinates[[i]])
}
p1 <- SpatialDimPlot(T1,alpha = 0)
p2 <- SpatialFeaturePlot(T1, features = "nFeature_Spatial",
                   pt.size.factor = 3)
p1 + p2

3, h5 + spatial文件夹(只有tissue_hires_image.png )

通过image.name指定使用的图片


data.dir = ".\\outs_onlyhires_h5\\"
T2 <- Load10X_Spatial_change(data.dir = data.dir,
                             filename = "filtered_feature_bc_matrix.h5",
                             #slice = "sli",
                             image.name = "tissue_hires_image.png")
for (i in colnames((T2@images[[1]]@coordinates))) {
  T2@images[[1]]@coordinates[[i]] <- as.integer(T2@images[[1]]@coordinates[[i]])
}
SpatialDimPlot(T2,alpha = 0)
SpatialFeaturePlot(T2, features = "nFeature_Spatial",
                   pt.size.factor = 8)


4, filtered_feature_bc_matrix + spatial文件夹(只有tissue_hires_image.png )


data.dir = ".\\outs_onlyhires\\"
T3 <- Load10X_Spatial_change(data.dir = data.dir,
                             filename = "filtered_feature_bc_matrix",
                             image.name = "tissue_hires_image.png")
for (i in colnames((T3@images$slice1@coordinates))) {
  T3@images$slice1@coordinates[[i]] <- as.integer(T3@images$slice1@coordinates[[i]])
}
SpatialDimPlot(T3,alpha = 0)
SpatialFeaturePlot(T3, features = "nFeature_Spatial",
                   pt.size.factor = 8)


二 空转标准分析


空转流程和单细胞转录组的流程有一些细微的区别,重点介绍这部分

1,数据预处理(过滤,NormalizeData)

关于空转数据是否进行质控过滤,以及根据哪些条件进行过滤差异“很大”,且都有较多文章支撑,这里仅列出过滤基因 以及 spot 的方式,是否过滤根据自己的数据情况确定。

注:Seurat的官网并未进行质控,直接SCT分析。

1)计算线粒体/核糖体/特定基因集的比例


mt.genes <- grep(pattern = "^MT-", x = rownames(T0), value = TRUE)
T0$percent.mito <- (Matrix::colSums(T0@assays$Spatial@counts[mt.genes, ])/Matrix::colSums(T0@assays$Spatial@counts))*100

如果想针对核糖体或者特定基因集合,只需进行对应的改即可。

2)过滤/保留基因

保留在所有spot中的表达量之和大于5的基因

genes_to_keep <- setdiff(names(which(Matrix::rowSums(T0@assays$Spatial@counts )>5)),mt.genes)

也可以是自定义的基因集合。

3)subset过滤spot

T0 <- subset(T0,
             features =genes_to_keep,  #针对基因
             subset = nFeature_Spatial > 300 & percent.mito < 30 #针对spots
            )
plot1 <- VlnPlot(T0, features = "nCount_Spatial", pt.size = 0.1) + NoLegend()
plot2 <- SpatialFeaturePlot(T0, features = "nCount_Spatial",pt.size.factor = 3) + 
  theme(legend.position = "right")
wrap_plots(plot1, plot2)

NormalizeData

相较于单细胞转录组LogNormalize,空转数据推荐使用SCTransform。下图是来源于Seurat官网(https://satijalab.org/seurat/articles/seurat5_spatial_vignette.html#gene-expression-visualization)的比较结果。


T0 <- SCTransform(T0, assay = "Spatial", verbose = FALSE)

2,基因可视化

空转的可视化函数扩充了SpatialFeaturePlot 和  SpatialDimPlot (以空转切片为背景) ,相较于单细胞的FeaturePlot,DimPlot函数。

通过pt.size.factor设置点的大小,仍然可以使用ggplot2进行一些图形的修饰(theme,legend等)。

SpatialFeaturePlot(T0, features = c("COL1A1", "EPCAM"),
                   pt.size.factor = 4)
library(ggplot2)
SpatialFeaturePlot(T0, features = c("COL1A1", "EPCAM"),pt.size.factor = 3) + 
  theme(legend.text = element_text(size = 0),
        legend.title = element_text(size = 20), 
        legend.key.size = unit(1, "cm"))




p1 <- SpatialFeaturePlot(T0, features = "COL1A1", pt.size.factor = 1)
p2 <- SpatialFeaturePlot(T0, features = "COL1A1", alpha = c(0.1, 1))
p1 + p2

3,降维聚类及可视化

和单细胞差异不大

T0 <- RunPCA(T0, assay = "SCT", verbose = FALSE)
T0 <- FindNeighbors(T0, reduction = "pca", dims = 1:30)
T0 <- FindClusters(T0, verbose = FALSE)
T0 <- RunUMAP(T0, reduction = "pca", dims = 1:30)
p1 <- DimPlot(T0, reduction = "umap", label = TRUE)
p2 <- SpatialDimPlot(T0, label = TRUE, label.size = 3)
p1 + p2

可以使用SpatialDimPlot 的cells.highlight参数, 只展示感兴趣的簇。

SpatialDimPlot(T0, 
               cells.highlight = CellsByIdentities(object = T0, 
                                                          idents = c(2, 0, 3)), 
               facet.highlight = TRUE, ncol = 3 ,pt.size.factor = 3 )

4,空间表达变量基因

由于空转的特殊性,Seurat提供了两种计算的方式 。

1)FindMarkers

根据定义好的cluster或者celltype进行计算(和scRNA类似)

#指定比较的group
de_markers <- FindMarkers(T0, ident.1 = 0, ident.2 = 3)
SpatialFeaturePlot(object = T0, features = rownames(de_markers)[1:3], 
                   alpha = c(0.1, 1), pt.size.factor = 3,
                   ncol = 3)
#全部比较,注意activate的ident
de_markers2 <- FindAllMarkers(T0)

注:FindAllMarkers函数注意当前activate的ident

2)FindSpatiallyVariableFeatures

没有cluster 或者 celltype等预先注释的情况下使用,倾向于返回在某些切片区域高表达的基因。

T0 <- FindSpatiallyVariableFeatures(T0, assay = "SCT", features = VariableFeatures(T0)[1:1000],
                                       selection.method = "moransi")
top.features <- head(SpatiallyVariableFeatures(T0, selection.method = "moransi"), 6)
SpatialFeaturePlot(T0, features = top.features, 
                   pt.size.factor = 3,
                   ncol = 3, alpha = c(0.1, 1))

两种之间会有一些overlap,但是也会有一些差异。

相关文章
|
17天前
|
运维 Serverless API
函数计算产品使用问题之创建层如何设置才能支持ffmpeg
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
17天前
|
存储 并行计算 Serverless
函数计算操作报错合集之在使用控制网 (ControlNet)时遇到报错,一般是什么导致的
在使用函数计算服务(如阿里云函数计算)时,用户可能会遇到多种错误场景。以下是一些常见的操作报错及其可能的原因和解决方法,包括但不限于:1. 函数部署失败、2. 函数执行超时、3. 资源不足错误、4. 权限与访问错误、5. 依赖问题、6. 网络配置错误、7. 触发器配置错误、8. 日志与监控问题。
|
2月前
GEE——Google dynamic world中在影像导出过程中无法完全导出较大面积影像的解决方案(投影的转换)EPSG:32630和EPSG:4326的区别
GEE——Google dynamic world中在影像导出过程中无法完全导出较大面积影像的解决方案(投影的转换)EPSG:32630和EPSG:4326的区别
66 0
|
1月前
|
机器学习/深度学习 自然语言处理 算法
【CV大模型SAM(Segment-Anything)】真是太强大了,分割一切的SAM大模型使用方法:可通过不同的提示得到想要的分割目标
【CV大模型SAM(Segment-Anything)】真是太强大了,分割一切的SAM大模型使用方法:可通过不同的提示得到想要的分割目标
|
2月前
|
机器学习/深度学习 缓存 文字识别
印刷文字识别产品使用合集之标注阶段设定了两个独立的字段,但在返回的信息中却合并成了一个字段如何解决
印刷文字识别(Optical Character Recognition, OCR)技术能够将图片、扫描文档或 PDF 中的印刷文字转化为可编辑和可搜索的数据。这项技术广泛应用于多个领域,以提高工作效率、促进信息数字化。以下是一些印刷文字识别产品使用的典型场景合集。
|
10月前
|
传感器 物联网 开发工具
项目资源太紧张了,如何根据map信息进行功能裁剪和优化?
项目资源太紧张了,如何根据map信息进行功能裁剪和优化?
67 1
|
9月前
|
自然语言处理 API 数据处理
面向低资源和增量类型的命名实体识别挑战赛PaddleNLP解决方案
面向低资源和增量类型的命名实体识别挑战赛PaddleNLP解决方案
64 0
|
10月前
|
安全
RxSwift特征序列Driver的使用,以及共享附加作用与非共享附加作用的区别?
RxSwift特征序列Driver的使用,以及共享附加作用与非共享附加作用的区别?
146 0
ENVI_IDL:批量重投影ModisSwath产品(调用二次开发接口)+解析
ENVI_IDL:批量重投影ModisSwath产品(调用二次开发接口)+解析
171 1
ENVI_IDL:批量重投影Modis Swath产品并指定范围输出为Geotiff格式+解析
ENVI_IDL:批量重投影Modis Swath产品并指定范围输出为Geotiff格式+解析
161 0