单细胞分析|整合 scRNA-seq 和 scATAC-seq 数据
bigegpt 2025-05-27 12:45 6 浏览
引言
单细胞转录组学极大地提升了对细胞状态进行分类的能力,但要深入理解生物学现象,不能仅仅停留在对细胞群的简单列举上。随着新方法的不断涌现,用于测量细胞的不同状态,一个关键的挑战是如何将这些数据集整合起来,以便更全面地理解细胞的特性和功能。
举例来说,研究人员可能在同一生物体系中进行单细胞RNA测序(scRNA-seq)和单细胞ATAC测序(scATAC-seq)实验,并希望用同一套细胞类型标签来一致性地注释这两个数据集。这种分析尤其困难,因为scATAC-seq数据集的注释工作较为复杂,这不仅因为单细胞水平上收集的基因组数据较为稀疏,也因为scRNA-seq数据中缺少易于解释的基因标记。
在2019年由Stuart*, Butler*等人的研究中,引入了一种方法,用以整合来自同一生物体系的scRNA-seq和scATAC-seq数据集,并在本文[1]中展示了这些方法的应用。
分析要点
具体来说,展示了以下几项分析:
- 如何利用已注释的scRNA-seq数据集来标记scATAC-seq实验中的细胞
- 如何将scRNA-seq和scATAC-seq的细胞进行联合可视化(共同嵌入)
- 如何将scATAC-seq细胞映射到由scRNA-seq实验生成的UMAP空间中
本文大量使用了Signac软件包,这是一个新近开发的用于分析单细胞分辨率下收集的染色质数据集的工具,包括scATAC-seq数据。
采用了一个公开的约12,000个人类外周血单个核细胞(PBMC)的“多组学”数据集来演示这些方法,该数据集由10x Genomics公司提供。在这个数据集中,scRNA-seq和scATAC-seq的数据是在同一批细胞中同时获得的。为了本演示的目的,将这两个数据集视为来自两个独立的实验,并将它们进行了整合。由于这些数据原本是在相同细胞中测量的,因此为提供了一个基准,用以评估整合的准确性。在此强调,使用多组学数据集的目的是为了演示和评估,建议用户将这些方法应用于分别独立收集的scRNA-seq和scATAC-seq数据集。
加载数据并单独处理每种模式
外周血单个核细胞(PBMC)的多组学数据集可以通过10x Genomics公司获得。为了方便用户轻松地加载和探索数据,该数据集也被包含在的SeuratData包中。分别导入RNA和ATAC的数据,并假设这两组数据是分别在不同的实验中获得的。
library(SeuratData)
# install the dataset and load requirements
InstallData("pbmcMultiome")
library(Seurat)
library(Signac)
library(EnsDb.Hsapiens.v86)
library(ggplot2)
library(cowplot)
# load both modalities
pbmc.rna <- LoadData("pbmcMultiome", "pbmc.rna")
pbmc.atac <- LoadData("pbmcMultiome", "pbmc.atac")
pbmc.rna[["RNA"]] <- as(pbmc.rna[["RNA"]], Class = "Assay5")
# repeat QC steps performed in the WNN vignette
pbmc.rna <- subset(pbmc.rna, seurat_annotations != "filtered")
pbmc.atac <- subset(pbmc.atac, seurat_annotations != "filtered")
# Perform standard analysis of each modality independently RNA analysis
pbmc.rna <- NormalizeData(pbmc.rna)
pbmc.rna <- FindVariableFeatures(pbmc.rna)
pbmc.rna <- ScaleData(pbmc.rna)
pbmc.rna <- RunPCA(pbmc.rna)
pbmc.rna <- RunUMAP(pbmc.rna, dims = 1:30)
# ATAC analysis add gene annotation information
annotations <- GetGRangesFromEnsDb(ensdb = EnsDb.Hsapiens.v86)
seqlevelsStyle(annotations) <- "UCSC"
genome(annotations) <- "hg38"
Annotation(pbmc.atac) <- annotations
# We exclude the first dimension as this is typically correlated with sequencing depth
pbmc.atac <- RunTFIDF(pbmc.atac)
pbmc.atac <- FindTopFeatures(pbmc.atac, min.cutoff = "q0")
pbmc.atac <- RunSVD(pbmc.atac)
pbmc.atac <- RunUMAP(pbmc.atac, reduction = "lsi", dims = 2:30, reduction.name = "umap.atac", reduction.key = "atacUMAP_")
现在绘制两种模式的结果。先前已根据转录组状态对细胞进行了注释。将预测 scATAC-seq 细胞的注释。
p1 <- DimPlot(pbmc.rna, group.by = "seurat_annotations", label = TRUE) + NoLegend() + ggtitle("RNA")
p2 <- DimPlot(pbmc.atac, group.by = "orig.ident", label = FALSE) + NoLegend() + ggtitle("ATAC")
p1 + p2
plot <- (p1 + p2) & xlab("UMAP 1") & ylab("UMAP 2") & theme(axis.title = element_text(size = 18))
ggsave(filename = "../output/images/atacseq_integration_vignette.jpg", height = 7, width = 12, plot = plot,
quality = 50)
识别 scRNA-seq 和 scATAC-seq 数据集之间的anchors
为了在单细胞RNA测序(scRNA-seq)和单细胞ATAC测序(scATAC-seq)实验之间找到相互关联的“锚点”,首先利用Signac软件包中的GeneActivity()函数,通过计算2kb启动子区域和基因体内的ATAC-seq测序计数,来估算每个基因的转录活性。
接下来,使用scATAC-seq数据得到的基因活性评分,与scRNA-seq中的基因表达量数据一起,作为典型相关性分析的输入。对scRNA-seq数据集中所有被鉴定为变异性高的基因进行这样的量化分析。
# quantify gene activity
gene.activities <- GeneActivity(pbmc.atac, features = VariableFeatures(pbmc.rna))
# add gene activities as a new assay
pbmc.atac[["ACTIVITY"]] <- CreateAssayObject(counts = gene.activities)
# normalize gene activities
DefaultAssay(pbmc.atac) <- "ACTIVITY"
pbmc.atac <- NormalizeData(pbmc.atac)
pbmc.atac <- ScaleData(pbmc.atac, features = rownames(pbmc.atac))
# Identify anchors
transfer.anchors <- FindTransferAnchors(reference = pbmc.rna, query = pbmc.atac, features = VariableFeatures(object = pbmc.rna),
reference.assay = "RNA", query.assay = "ACTIVITY", reduction = "cca")
通过标签转移注释 scATAC-seq 细胞
确定锚点之后,能够将单细胞RNA测序(scRNA-seq)数据集上的细胞类型注释应用到单细胞ATAC测序(scATAC-seq)的细胞上。这些注释保存在seurat_annotations字段里,并作为参考数据输入到refdata参数中。最终的输出结果会是一个矩阵,其中包含了每个ATAC-seq细胞的预测分类和置信度分数。
celltype.predictions <- TransferData(anchorset = transfer.anchors, refdata = pbmc.rna$seurat_annotations,
weight.reduction = pbmc.atac[["lsi"]], dims = 2:30)
pbmc.atac <- AddMetaData(pbmc.atac, metadata = celltype.predictions)
- 为什么会选用不同的(非默认设置的)参数值来进行降维和权重调整?
在执行FindTransferAnchors()函数时,通常会在单细胞RNA测序(scRNA-seq)数据集间进行数据转移时,将参考数据集的PCA(主成分分析)结构映射到查询数据集上。但是,在不同技术平台间进行数据转移时,发现典型相关分析(CCA)能更准确地捕捉到共享特征之间的相关性结构,因此在这里选择将降维方法设置为'cca'。
此外,在TransferData()函数中,默认情况下会利用相同的PCA映射结构来计算局部锚点邻域的权重,这些锚点对每个细胞的预测结果有影响。特别是在从scRNA-seq转移到scATAC-seq的过程中,会采用在ATAC-seq数据上通过计算LSI(潜语义索引)得到的低维空间来计算这些权重,因为这种方法能更好地反映ATAC-seq数据的内在结构特征。
完成注释转移后,ATAC-seq的细胞获得了预测的细胞类型标签,这些标签源自scRNA-seq数据集,并存储在predicted.id字段中。鉴于这些细胞是通过多组学试剂盒进行测量的,还拥有一套真实的细胞类型标签,可以用来进行评估。可以观察到,预测得出的细胞类型标签与实际的标签极为相似。
pbmc.atac$annotation_correct <- pbmc.atac$predicted.id == pbmc.atac$seurat_annotations
p1 <- DimPlot(pbmc.atac, group.by = "predicted.id", label = TRUE) + NoLegend() + ggtitle("Predicted annotation")
p2 <- DimPlot(pbmc.atac, group.by = "seurat_annotations", label = TRUE) + NoLegend() + ggtitle("Ground-truth annotation")
p1 | p2
以本例而言,通过单细胞RNA测序(scRNA-seq)数据的整合,单细胞ATAC测序(scATAC-seq)的细胞类型注释正确预测的准确率可达约90%。另外,prediction.score.max字段用于衡量预测注释的不确定性。可以观察到,正确注释的细胞通常伴随着较高的预测分数(超过90%),而错误注释的细胞则通常伴随着显著较低的预测分数(低于50%)。此外,错误的分类往往涉及到非常相似的细胞类型,例如中间态B细胞与原始B细胞之间的区分。
predictions <- table(pbmc.atac$seurat_annotations, pbmc.atac$predicted.id)
predictions <- predictions/rowSums(predictions) # normalize for number of cells in each cell type
predictions <- as.data.frame(predictions)
p1 <- ggplot(predictions, aes(Var1, Var2, fill = Freq)) + geom_tile() + scale_fill_gradient(name = "Fraction of cells",
low = "#ffffc8", high = "#7d0025") + xlab("Cell type annotation (RNA)") + ylab("Predicted cell type label (ATAC)") +
theme_cowplot() + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1))
correct <- length(which(pbmc.atac$seurat_annotations == pbmc.atac$predicted.id))
incorrect <- length(which(pbmc.atac$seurat_annotations != pbmc.atac$predicted.id))
data <- FetchData(pbmc.atac, vars = c("prediction.score.max", "annotation_correct"))
p2 <- ggplot(data, aes(prediction.score.max, fill = annotation_correct, colour = annotation_correct)) +
geom_density(alpha = 0.5) + theme_cowplot() + scale_fill_discrete(name = "Annotation Correct",
labels = c(paste0("FALSE (n = ", incorrect, ")"), paste0("TRUE (n = ", correct, ")"))) + scale_color_discrete(name = "Annotation Correct",
labels = c(paste0("FALSE (n = ", incorrect, ")"), paste0("TRUE (n = ", correct, ")"))) + xlab("Prediction Score")
p1 + p2
共同嵌入 scRNA-seq 和 scATAC-seq 数据集
除了能够在不同技术平台间传递细胞标签,还能够在同一个图表中同时展示单细胞RNA测序(scRNA-seq)和单细胞ATAC测序(scATAC-seq)的细胞分布。需要指出的是,这一步骤主要用于图形展示,并不是必须执行的。
通常情况下,在进行scRNA-seq与scATAC-seq数据集之间的整合分析时,主要集中于上述的标签传递工作。在下文中展示了如何进行细胞数据的共同嵌入,并再次强调,这仅用于示范,特别是在本案例中,scRNA-seq和scATAC-seq的数据实际上是从同一批细胞中获得的。
为了实现共同嵌入,会首先基于之前计算得到的锚点,对scATAC-seq细胞进行RNA表达量的“估算”,然后将这些数据集进行合并。
# note that we restrict the imputation to variable genes from scRNA-seq, but could impute the
# full transcriptome if we wanted to
genes.use <- VariableFeatures(pbmc.rna)
refdata <- GetAssayData(pbmc.rna, assay = "RNA", slot = "data")[genes.use, ]
# refdata (input) contains a scRNA-seq expression matrix for the scRNA-seq cells. imputation
# (output) will contain an imputed scRNA-seq matrix for each of the ATAC cells
imputation <- TransferData(anchorset = transfer.anchors, refdata = refdata, weight.reduction = pbmc.atac[["lsi"]],
dims = 2:30)
pbmc.atac[["RNA"]] <- imputation
coembed <- merge(x = pbmc.rna, y = pbmc.atac)
# Finally, we run PCA and UMAP on this combined object, to visualize the co-embedding of both
# datasets
coembed <- ScaleData(coembed, features = genes.use, do.scale = FALSE)
coembed <- RunPCA(coembed, features = genes.use, verbose = FALSE)
coembed <- RunUMAP(coembed, dims = 1:30)
DimPlot(coembed, group.by = c("orig.ident", "seurat_annotations"))
[1]Source: https://satijalab.org/seurat/articles/seurat5_atacseq_integration_vignette
- 上一篇:乳腺上皮细胞单细胞亚群
- 下一篇:Go-INI - 超赞的Go语言INI文件操作库
相关推荐
- php-fpm的配置和优化
-
目录概述php-fpm配置php-fpm进程优化配置慢日志查询配置php7进阶到架构师相关阅读概述这是关于php进阶到架构之php7核心技术与实战学习的系列课程:php-fpm的配置和优化学习目标:理...
- 成功安装 Magento2.4.3最新版教程「技术干货」
-
外贸独立站设计公司xingbell.com经过多次的反复实验,最新版的magento2.4.3在oneinstack的环境下的详细安装教程如下:一.vps系统:LinuxCentOS7.7.19...
- 十分钟让你学会LNMP架构负载均衡
-
业务架构、应用架构、数据架构和技术架构一、几个基本概念1、pv值pv值(pageviews):页面的浏览量概念:一个网站的所有页面,在一天内,被浏览的总次数。(大型网站通常是上千万的级别)2、u...
- php从远程URL获取(mp4 mp3)音视频的流媒体数据
-
/***从远程URL中获取媒体(如mp4mp3)的内容*@parammixed$file_url*@parammixed$media_type...
- Zabbix5.0安装部署
-
全盘展示运行状态,减轻运维人员的重复性工作量,提高系统排错速度,加速运维知识学习积累。1.png1、环境安装关闭SELinux并重启系统2.png安装httpd、mariadb、php运行yum-...
- php 常见配置详解
-
以下是PHP常见的配置项及其含义:error_reporting:设置错误报告级别,可以控制PHP显示哪些错误。例如,设置为E_ALL将显示所有错误,而设置为0将禁止显示任何错误。displa...
- 实践分享|基于基石智算 DeepSeek API + WordPress 插件自动生成访客回复
-
基石智算举办的DeepSeek案例大赛汇集了不少基于CoresHubDeepSeekAPI服务或模型部署服务的精彩实践。本次我们将分享个人实践:通过DeepSeekAPI+Word...
- 如何在Eclipse中搭建Zabbix源码的调试和开发环境
-
Zabbix是一款非常优秀的企业级软件,被设计用于对数万台服务器、虚拟机和网络设备的数百万个监控项进行实时监控。Zabbix是开放源码和免费的,这就意味着当出现bug时,我们可以很方便地通过调试源码来...
- MySQL自我保护参数
-
#头条创作挑战赛#之前(MySQL自我保护工具--pt-kill)提到用pt-kill工具来kill相关的会话,来达到保护数据库的目的,本文再通过修改数据库参数的方式达到阻断长时间运行的SQL的目...
- Python闭包深度解析:掌握数据封装的高级技巧
-
闭包作为Python高级编程特性之一,为开发者提供了一种优雅的方式来实现数据封装和状态保持。这一概念源于函数式编程理论,在现代Python开发中发挥着重要作用。理解和掌握闭包的使用不仅能够提升代码的表...
- Java服务网格故障注入与熔断实战
-
在分布式系统的高可用性挑战中,服务网格的故障注入与熔断机制是检验系统韧性的终极试金石。以下是10道逐步升级的"地狱关卡",每个关卡都对应真实生产环境中可能遇到的致命场景,并附具体场景示...
- MySQL数据库性能优化全攻略:程序员必知的七大核心策略
-
作为程序员,我们每天都要与数据库打交道。当系统用户量突破百万级时,数据库往往成为性能瓶颈的首要怀疑对象。本文将深入探讨MySQL优化的七大核心策略,并提供可直接落地的优化方案,助您构建高效稳定的数据库...
- 如何在 Windows 11 上使用单个命令安装 XAMPP
-
XAMPP是一种广泛使用的软件,用于在Windows操作系统上快速运行LAMP服务器包,包括Windows11。尽管LAMP通常用于Linux系统,但XAMPP并不使用Li...
- uTorrent怎样将bt种子转换为磁力
-
如何用uTorrent把BT种子转为磁力链接?以下方法希望能帮到你。1、在uTorrent窗口里,点击工具栏的按钮,所示。2、在打开窗口里,选取要转为磁力的种子文件,然后点击打开按钮,参照图示操作...
- 支持向量机SVM 分类和回归的实例
-
支持向量机(SupportVectorMachine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本、非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数拟合等其他...
- 一周热门
- 最近发表
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- resize函数 (64)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- mybatis大于等于 (64)
- xcode-select (66)
- mysql授权 (74)
- 下载测试 (70)
- skip-name-resolve (63)
- linuxlink (65)
- httperror403.14-forbidden (63)
- logstashinput (65)
- hadoop端口 (65)
- vue阻止冒泡 (67)
- oracle时间戳转换日期 (64)
- jquery跨域 (68)
- php写入文件 (73)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)