【TOP生物信息】使用R包Symphony自动注释细胞类型

news2024/10/6 14:34:37

扫码关注下方公粽号,回复推文合集,获取400页单细胞学习资源!

在这里插入图片描述

本文共计1884字,阅读大约需要6分钟,目录如下:

  • Symphony 包基本介绍

  • Symphony 包安装

  • Symphony 包使用

    • 1.使用已有的参考数据集进行细胞注释
    • 2.使用自定义的参考数据集进行细胞注释
  • 小结

  • 获取本文数据和代码

  • 代码参考

  • 往期单细胞系统教程


Symphony 包基本介绍

Symphony 最早发表于 2021 年 Nature Communications 杂志上的一篇文章,文章题目为"Efficient and precise single-cell reference atlas mapping with Symphony"。发表该文章的 Raychaudhuri Lab 曾于 2019 年在 Nature Methods 杂志上发表单细胞数据整合算法 Harmony

Symphony 算法首先将 Reference 数据集嵌入 UMAP 空间中,再将 Query 数据集(待注释数据集)嵌入到与 Reference 数据集相同的 UMAP 空间,接着使用 KNN 算法,根据 Reference 数据集,计算距离 Query 细胞最近的 K 个 Reference 细胞邻居,确定最可能的 cell type。

Symphony 具体流程如下:

图片

图 1 Symphony工作流程图(来源:Nat Commun 12, 5890 (2021).)

Symphony 包安装

# 方法一
install.packages("symphony")

# 方法二
# install.packages("devtools")
devtools::install_github("immunogenomics/symphony")

Symphony 包使用

注:

  1. 读入数据均为 log(CP10k+1)处理过的 logCounts 矩阵。
  2. 需要保证 Query 数据集与 Reference 数据集处理流程一致。

1.使用已有的参考数据集进行细胞注释

Symphony 包提供以下 8 个参考数据集

图片

图 2 Symphony提供的参考数据集

  • 下载地址:Symphony pre-built single-cell reference atlases | Zenodo

    https://zenodo.org/record/5090425#.YOqe_hNKhTY

  • 读入方法:readRDS(参考数据集文件路径)

注:如果想要将 Query 数据 Map(映射)到 Reference 数据集的 UMAP 空间中,则需要下载对应的 UMAP 计算模型uwot_model

  • 通过reference$save_uwot_path查看uwot_model存放路径,需要将下载的uwot_model放入指定路径

在本次示例中,Reference 数据集由 4 项研究中的人类胰岛细胞构成。Query 数据集来自于 Baron et al. (2016)的人类胰岛细胞数据 。

# 载入相关R包
suppressPackageStartupMessages({
 library(symphony)
 library(tidyverse)
 library(data.table)
 library(matrixStats)
 library(Matrix)
 library(plyr)
 library(dplyr)

 ## 画图包
 library(ggplot2)
 library(ggthemes)
 library(ggrastr)
 library(RColorBrewer)
 library(patchwork)
 library(ggrepel)
})

source("colors.R")  # 定义绘图颜色
ref_pancreas = readRDS("data/pancreas_plate-based_reference.rds")
## 绘制参考数据集UMAP图
p = plotReference(
 reference = ref_pancreas,              # 参考数据集
 as.density = F,                        # True则绘制密度图,False则绘制散点图
 title = "Symphony Reference",
 color.by = "cell_type",
 celltype.colors = pancreas_colors,     # 指定颜色
 show.legend = T,
 show.labels = T,
 show.centroids = F
)

图片

图 3 人类胰岛细胞参考数据集UMAP分布

## 读入query数据集
human_exp_norm = readRDS("data/pancreas_baron_human_exp.rds")
human_metadata = readRDS("data/pancreas_baron_human_metadata.rds")
## 将Query数据集映射到参考数据集
ref_pancreas$save_uwot_path  # 查看uwot_model保存路径
query = mapQuery(
 exp_query = human_exp_norm,
 metadata_query = human_metadata,
 ref_obj = ref_pancreas,
 vars = c("dataset", "species", "species_donor"),
 do_normalize = F,  # 是否需要logNormalize
 do_umap = T  # map到参考数据集的UMAP空间
)

## 根据reference数据集进行注释
query = knnPredict(query, reference, reference$meta_data$cell_type, k = 5)

## 查看Query数据集自动注释结果
colnames(query$umap) = c("UMAP1", "UMAP2")
umap_labels = cbind(query$meta_data, query$umap)

p1 = umap_labels %>%
 sample_frac(1L) %>%
 ggplot(aes(x = UMAP1, y = UMAP2, col = cell_type_pred_knn)) +
 geom_point_rast(size = 0.3, stroke = 0.2, shape = 16) +
 theme_bw() +
 labs(title = 'Query after Symphony', color = '') +
 theme(plot.title = element_text(hjust = 0.5)) +
 theme(
  legend.position = "none",
  legend.text = element_text(size=11),
  legend.title = element_text(size = 12)
 ) +
 scale_colour_manual(values = pancreas_colors) +
 guides(colour = guide_legend(override.aes = list(size = 3), ncol = 5)) +
 theme(strip.text.x = element_text(size = 14))
p1 + p

图片

图 4 待注释数据集(Query)注释结果UMAP分布(左);参考数据集UMAP分布(右)

## 与Query数据集提供的注释信息比较
cell_type <- query$meta_data$cell_type
cell_type_pred_knn <- query$meta_data$cell_type_pred_knn
cell_type <- as.character(cell_type)
cell_type_pred_knn <- as.character(cell_type_pred_knn)
table(cell_type == cell_type_pred_knn)

# FALSE  TRUE
#   351  8218

2.使用自定义的参考数据集进行细胞注释

本次示例中,将来自 10x 3’v1 和 3’v2 测序的 PBMCs 数据集作为 Reference 数据集,将来自 10x 5’测序的 PBMCs 作为 Query 数据集。

# 读入R包
suppressPackageStartupMessages({
 # Analysis
 library(symphony)
 library(harmony)
 library(irlba)
 library(tidyverse)
 library(data.table)
 library(matrixStats)
 library(Matrix)
 library(plyr)
 library(dplyr)
 library(tibble)

 # Plotting
 library(ggplot2)
 library(ggthemes)
 library(ggrastr)
 library(RColorBrewer)
 library(patchwork)
 library(ggpubr)
 library(scales)
})

source('utils.R') # 颜色和绘图函数封装
# 读入数据
exprs_norm = readRDS("data/exprs_norm_all.rds")
metadata = read.csv("data/meta_data_subtypes.csv", row.names = 1)

idx_query = which(metadata$donor == "5'")  # 将来自5'测序的数据作为Query数据集

# 构建Reference数据集
ref_exp_full = exprs_norm[, -idx_query]
ref_metadata = metadata[-idx_query, ]

# 构建Query数据集
query_exp = exprs_norm[, idx_query]
query_metadata = metadata[idx_query, ]
# 将Reference构造成Symphony Reference对象
## 筛选高变基因,取高变基因的子集
var_genes = vargenes_vst(
 ref_exp_full,
 groups = as.character(ref_metadata[["donor"]]), # 按照groups条件分别寻找HVGs,再汇总
 topn = 2000)
ref_exp = ref_exp_full[var_genes, ]  # 过滤非高变基因

## 计算并保存每个基因表达量的均值和方差
vargenes_means_sds = tibble(symbol = var_genes, mean = Matrix::rowMeans(ref_exp))
vargenes_means_sds$stddev = symphony::rowSDs(ref_exp, vargenes_means_sds$mean)

## 使用算出的基因表达量均值和标准差对数据正态化
ref_exp_scaled = symphony::scaleDataWithStats(
 ref_exp, vargenes_means_sds$mean,
 vargenes_means_sds$stddev,
 1
)

## Run SVD,保存gene loadings
set.seed(0)
s = irlba(ref_exp_scaled, nv = 20)
Z_pca_ref = diag(s$d) %*% t(s$v)  # 每个细胞的主成分
loadings = s$u

## Harmony整合
set.seed(0)
ref_harmObj = harmony::HarmonyMatrix(
 data_mat = t(Z_pca_ref),  # 细胞的pca embedding矩阵
 meta_data = ref_metadata,
 theta = c(2),             # harmony 校正参数theta,值越大校正强度越大
 vars_use = c("donor"),    # 批次来源
 nclust = 100,
 max.iter.harmony = 20,
 return_object = T,        # True时返回完整的Harmony对象,False时仅返回校正后的PCA embeddings
 do_pca = F                # 是否对输入计算PCA
)

## 将harmony对象转换成Symphony Reference对象
reference = symphony::buildReferenceFromHarmonyObj(
 ref_harmObj,           # HarmonyMatrix()函数的输出对象
 ref_metadata,          # 对应的metadata
 vargenes_means_sds,    # 基因名、表达量均值和方差
 loadings,              # 高变基因的PCA embedding矩阵,行为基因,列为主成分PCs
 verbose = T,           # Console进度可视化输出
 do_umap = T,           # 是否进行UMAP降维
 save_uwot_path = "./testing_uwot_model_1"  # UMAP降维模型的保存路径
)

reference$normalized_method = "log(CP10k+1)"  # 记录标准化方法
## 可视化reference的UMAP
color_cluster = group.colors[6:12]
names(color_cluster) = unique(ref_metadata$cell_type)

umap_labels = cbind(ref_metadata, reference$umap$embedding)
umap_labels %>% ggplot(aes(UMAP1, UMAP2, color = cell_type)) +
 geom_point_rast(size = 0.3, stroke = 0.2, shape = 16) +
 scale_color_manual(values = color_cluster) +
 theme_bw() +
 theme(
  legend.title = element_text(size = 14),
  legend.text = element_text(size = 12),
  strip.text.x = element_text(size = 20),
  plot.title = element_text(hjust = 0.5)
 ) +
 ggtitle(element_text("reference", hjust = 0.5)) +
 guides(colour = guide_legend(override.aes = list(size = 8)))

图片

图 5 Reference数据集UMAP分布

# 将Query数据集MAP到Reference数据集上
query = mapQuery(
 query_exp,        # Query数据集的基因表达矩阵 (genes, cells)
 query_metadata,   # metadata (cell, attributes)
 reference,        # Symphony Reference对象
 do_normalize = F, # 是否执行log(CP10k+1)标准化
 do_umap = T       # 是否将Query数据集map到Reference数据集的UMAP空间
)
## 使用KNN算法预测cell type
query = knnPredict(query, reference, reference$meta_data$cell_type, k = 5)
## 根据knn_prob调整cell_type_pred_knn
query_umap_labels = cbind(query$meta_data, query$umap)
query_umap_labels$cell_type_pred_knn = as.character(query_umap_labels$cell_type_pred_knn)
query_umap_labels$cell_type_pred_knn[query_umap_labels$cell_type_pred_knn_prob <= 0.5] = "unknown"
## 绘图
p1 <- query_umap_labels %>% ggplot(aes(UMAP1, UMAP2, color = cell_type_pred_knn)) +
 geom_point_rast(size = 0.3, stroke = 0.2, shape = 16) +
 scale_color_manual(values = color_cluster) +
 theme_bw() +
 theme(
  legend.position = "none",
  strip.text.x = element_text(size = 20),
  plot.title = element_text(hjust = 0.5)
 ) +
 ggtitle(element_text("query", hjust = 0.5)) +
 guides(colour = guide_legend(override.aes = list(size = 8)))
p1 + p

图片

图 6 待注释数据集(Query)注释结果UMAP分布(左);参考数据集UMAP分布(右)

## 与Query数据集提供的注释信息比较
cell_type <- query$meta_data$cell_type
cell_type_pred_knn <- query$meta_data$cell_type_pred_knn
cell_type <- as.character(cell_type)
cell_type_pred_knn <- as.character(cell_type_pred_knn)
table(cell_type == cell_type_pred_knn)

# FALSE  TRUE
#    82  7615

小结

可以看出,symphony 包注释结果较为可观。不过在本次分享,Query 和 Reference 数据集均来自同种组织,当使用不同组织的 Reference 数据集进行注释时,结果可能会不太乐观,最好根据自己的样本去搜集相关数据集构建同种的 Reference 数据集。

获取本文数据和代码

关注公粽号后,搜索推文【使用R包Symphony自动注释细胞类型】获取本文代码和数据
在这里插入图片描述

代码参考

https://github.com/immunogenomics/symphony/blob/main/vignettes/prebuilt_references_tutorial.ipynb

https://github.com/immunogenomics/symphony/blob/main/vignettes/pbmcs_tutorial.ipynb


往期单细胞系统教程

单细胞分析实录(1): 认识Cell Hashing

单细胞分析实录(2): 使用Cell Ranger得到表达矩阵

单细胞分析实录(3): Cell Hashing数据拆分

单细胞分析实录(4): doublet检测

单细胞分析实录(5): Seurat标准流程

单细胞分析实录(6): 去除批次效应/整合数据

单细胞分析实录(7): 差异表达分析/细胞类型注释

推荐几个细胞注释网站

如何批量查询marker基因(对应的蛋白)会不会在膜上表达?

单细胞分析实录(8): 展示marker基因的4种图形(一)

单细胞分析实录(9): 展示marker基因的4种图形(二)

单细胞分析实录(10): 消除细胞周期的影响

单细胞分析实录(11): inferCNV的基本用法

单细胞分析实录(12): 如何推断肿瘤细胞

单细胞分析实录(13): inferCNV结合UPhyloplot2分析肿瘤进化

单细胞分析实录(14): 细胞类型注释的另一种思路 — CellID

单细胞分析实录(15): 基于monocle2的拟时序分析

单细胞分析实录(16): 非负矩阵分解(NMF)检测细胞异质性

单细胞分析实录(17): 非负矩阵分解(NMF)代码演示

单细胞分析实录(18): 基于CellPhoneDB的细胞通讯分析及可视化 (上篇)

单细胞分析实录(19): 基于CellPhoneDB的细胞通讯分析及可视化 (下篇)

一个对接CellPhoneDB的R包

【代码更新】单细胞分析实录(20): 将多个样本的CNV定位到染色体臂,并画热图

【代码更新】单细胞分析实录(21): 非负矩阵分解(NMF)的R代码实现,只需两步,啥图都有

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/609030.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LinuxC编程——文件IO

目录 一、概念⭐⭐二、特点⭐⭐⭐三、函数⭐⭐⭐⭐3.1 打开文件 open3.2 关闭文件 close3.3 读写操作3.4 定位操作 lseek 四、文件IO与标准IO的对比脑图 在C语言的标准IO库中的库函数&#xff0c;如fclose、fopen,、fread、fwrite&#xff0c;提供的是高层服务&#xff1b;而Li…

数据在内存中的存储(超详细讲解)

目录 浮点数家族 浮点数类型在内存中的存储 一.为什么说整型和浮点数在内存中存储方式不同&#xff08;证明&#xff09; 二.浮点数的存储规则 浮点数在计算机内部的表示方法 1.对于M的存储和取出规则 2.对于E的存储和取出时的规则 对前面代码结果进行解释&#xff1a; …

Kubernetes_APIServer_证书_03_四个静态Pod Yaml文件解析

文章目录 前言一、APIServer Yaml文件解析APIServer证书文件APIServer三种探针启动探针可读性探针生存性探针 APIServer其他参数APIServer其他配置项 二、Scheduler Yaml文件解析Scheduler证书配置Scheduler两个探针启动探针生存性探针 Scheduler其他参数Scheduler其他配置项 三…

测试各种变量是否是线程安全的

前提条件,把这个类设成是单例模式,也就是说,这个类只能创建一个对象,然后多个线程在一个对象中去争抢资源. 1.int类型的成员变量number, (private int number) 线程共享 public class Stu {private int number;private String age;private String math;private i…

【sentinel】漏桶算法在Sentinel中的应用

漏桶算法 漏桶算法介绍 漏桶算法&#xff0c;又称leaky bucket。 从图中我们可以看到&#xff0c;整个算法其实十分简单。首先&#xff0c;我们有一个固定容量的桶&#xff0c;有水流进来&#xff0c;也有水流出去。对于流进来的水来说&#xff0c;我们无法预计一共有多少水…

内存池技术

为了学习池化技术以及后续自行实现一个仿tcmalloc的线程池&#xff0c;我们先浅浅的学习一下池化的概念&#xff0c;以及简单的实现一个定长的内存池。 文章目录 一&#xff1a;池化技术二&#xff1a;内存池三&#xff1a;内存池主要解决的问题四&#xff1a;malloc五&#x…

原地顺时针旋转矩阵(leetcode 48.选择图像)

本题目在leetcode上有原题48. 旋转图像 详细讲解 顺时针旋转90&#xff0c;横变竖&#xff0c;竖变横。按圈分解&#xff0c;一圈圈的单独转&#xff0c;由外圈到内圈&#xff0c;不断分解。 每一圈转到位了&#xff0c;整个矩阵就旋转好了。 那么&#xff0c;问题来了&…

Photoshop史上最强更新,动动手指就能让AI替你修图

Photoshop 在最新的 Beta 版本中&#xff0c;融入了 Firely 智能 AI 创意填充功能&#xff0c;只要对图片进行简单地框选&#xff0c;就能实现生成对象、生成背景、扩展图像、移除对象以及更多创意功能&#xff0c;支持用自然语言输入指令&#xff0c;让 AI 替你完成创意填充。…

Jmeter常用的两大性能测试场景你都知道吗?

目录 一、阶梯式场景 二、波浪式场景 一、阶梯式场景 该场景主要应用在负载测试里面&#xff0c;通过设定一定的并发线程数&#xff0c;给定加压规则&#xff0c;遵循“缓起步&#xff0c;快结束”的原则&#xff0c;不断地增加并发用户来找到系统的性能瓶颈&#xff0c;进而有…

SpringCloud:分布式缓存之Redis分片集群

1.搭建分片集群 主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决&#xff1a; 海量数据存储问题 高并发写的问题 使用分片集群可以解决上述问题&#xff0c;如图: 分片集群特征&#xff1a; 集群中有多个master&#xff0c;每个master保存不同数据 …

管道通信详解

目录 一、进程通信原理 二、什么是管道 三、创建一个匿名管道 四、fork共享管道的原理 五、管道的特点 六、4中场景 七、命名管道 八、命名管道通信的原理 九、创建一个命名管道 十、上实例 一、进程通信原理 我们知道进程间相互独立&#xff0c;具有独立性。那么我们…

编译原理 SLR(1) 语法分析器的构建

编译原理 SLR(1) 语法分析器的构建 在我的博客查看&#xff1a;https://chenhaotian.top/study/compilation-principle-slr1/ 实验三 自底向上语法分析器的构建 项目代码&#xff1a;https://github.com/chen2438/zstu-study/tree/main/%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%8…

冈萨雷斯DIP第10章知识点

文章目录 10.2 点、线和边缘检测10.2.2 孤立点的检测10.2.3 线检测10.2.4 边缘模型 10.3 阈值处理10.3.4 使用图像平滑改进全局阈值处理10.3.5 使用边缘改进全局阈值处理10.4 使用区域生长、区域分离与聚合进行分割 分割依据的灰度值基本性质是&#xff1a;不连续性和相似性。本…

计算机网络第二章——物理层(下)

提示&#xff1a;君子可内敛不可懦弱&#xff0c;面不公可起而论之 文章目录 2.1.7 数据交换方式为什么要进行数据交换数据交换的方式电路交换电路交换的优缺点报文交换报文交换的优缺分组交换分组交换的优缺点数据交换方式的选择数据报方式虚电路方式虚电路方式的特点数据报VS…

HJ29 字符串加解密

描述 对输入的字符串进行加解密&#xff0c;并输出。 加密方法为&#xff1a; 当内容是英文字母时则用该英文字母的后一个字母替换&#xff0c;同时字母变换大小写,如字母a时则替换为B&#xff1b;字母Z时则替换为a&#xff1b; 当内容是数字时则把该数字加1&#xff0c…

深入理解设计原则之依赖反转原则(DIP)【软件架构设计】

系列文章目录 C高性能优化编程系列 深入理解软件架构设计系列 深入理解设计模式系列 高级C并发线程编程 DIP&#xff1a;依赖反转原则 系列文章目录1、依赖反转原则的定义和解读2、稳定的抽象层3、依赖倒置原则和控制反转、依赖注入的联系小结 1、依赖反转原则的定义和解读 …

多线程事务回滚方法

多线程事务回滚方法 介绍案例演示线程池配置异常类实体类控制层业务层mapper工具类验证 解决方案使用sqlSession控制手动提交事务SqlSessionTemplate注入容器中改造业务层验证成功操作示例业务层改造 介绍 1.最近有一个大数据量插入的操作入库的业务场景&#xff0c;需要先做一…

Matcher: Segment Anything with One Shot Using All-Purpose Feature Matching 论文精读

Matcher: Segment Anything with One Shot Using All-Purpose Feature Matching 论文链接&#xff1a;[2305.13310] Matcher: Segment Anything with One Shot Using All-Purpose Feature Matching (arxiv.org) 代码链接&#xff1a;aim-uofa/Matcher: Matcher: Segment Anyt…

STM32 HAL库开发——基础篇

目录 一、基础知识 1.1 Cortex--M系列介绍 1.2 什么是stm32 1.3 数据手册查看 1.4 最小系统和 IO 分配 1.4.1 电源电路 1.4.2 复位电路 1.4.3 BOOT 启动电路 1.4.4 晶振电路 1.4.5 下载调试电路 1.4.6 串口一键下载电路 1.4.7 IO 分配 1.4.8 总结 1.5 开发工…

Spring:Spring框架中的核心类 ③

一、解读思想 1、用轮廓解读体系。 2、关注细节&#xff0c;不执着细节。 二、核心类设计 1、 容器接口和实现类 ApplicationContext 接口&#xff08;容器&#xff09; ①.读取配置文件 ②.注解形成bean 哪种形式的bean统一核心管理使用中心类。 2、 ApplicationCont…