单细胞分析:多模态 reference mapping (2)

news2024/11/18 8:44:01

引言

本文[1]介绍了如何在Seurat软件中将查询数据集与经过注释的参考数据集进行匹配。我们展示了如何将来自不同个体的人类骨髓细胞(Human BMNC)的人类细胞图谱(Human Cell Atlas)数据集,有序地映射到一个统一的参考框架上。

我们之前利用参考映射的方法来标注查询数据集中的细胞标签。在Seurat v4版本中,大幅提高了执行集成任务,包括参考映射的速度和内存效率,并且还新增了将查询细胞投影到之前计算好的UMAP(Uniform Manifold Approximation and Projection,均匀流形近似和投影)可视化界面的功能。

内容

在本示例中,我们将展示如何利用一个已经建立的参考数据集来解读单细胞RNA测序(scRNA-seq)查询:

  1. 根据参考数据集定义的细胞状态集,对每个查询细胞进行标注。
  2. 将每个查询细胞投影到之前计算完成的UMAP可视化界面上。
  3. 估算在CITE-seq参考数据集中测量到的表面蛋白的预测水平。

要运行本示例,请确保安装了Seurat v4,该软件可在CRAN上下载。同时,您还需要安装SeuratDisk包。

library(Seurat)
library(ggplot2)
library(patchwork)

options(SeuratData.repo.use = "http://seurat.nygenome.org")

Example 2:绘制人类骨髓细胞图谱

Data

例如,我们将由人类细胞图谱项目生成的,来自八位不同捐献者的人类骨髓单核细胞(BMNC)数据集进行了映射。我们以之前使用加权最近邻分析(WNN)方法分析过的人类BMNC的CITE-seq参考集作为比对标准。

本文除了展示与之前PBMC案例相同的参考映射功能外,还进一步介绍了:

  • 如何构建一个监督的主成分分析(sPCA)转换。
  • 如何将多个不同的数据集依次映射到同一个参考集上。
  • 采取哪些优化措施来提高映射过程的速度。
# Both datasets are available through SeuratData
library(SeuratData)
#load reference data
InstallData("bmcite")
bm <- LoadData(ds = "bmcite")
#load query data
InstallData('hcabm40k')
hcabm40k <- LoadData(ds = "hcabm40k")

参考数据集构建了一个加权最近邻(WNN)图,该图体现了在本次CITE-seq实验中RNA和蛋白质数据的加权整合情况。

基于这个WNN图,我们可以生成一个UMAP(Uniform Manifold Approximation and Projection)的可视化表示。在计算过程中,我们设置参数return.modelTRUE,这样就可以将待查询的数据集映射到这个UMAP可视化空间中。

bm <- RunUMAP(bm, nn.name = "weighted.nn", reduction.name = "wnn.umap"
              reduction.key = "wnnUMAP_", return.model = TRUE)
DimPlot(bm, group.by = "celltype.l2", reduction = "wnn.umap"
alt

计算 sPCA 变换

如我们在论文中所述,我们首先执行一个“监督式”的主成分分析(PCA)。该分析旨在找出转录组数据的最佳转换方式,以最准确地反映加权最近邻(WNN)图中的结构特征。通过这种方法,我们可以将蛋白质和RNA的测量值进行加权组合,以“指导”PCA的计算过程,从而凸显出数据中最为重要的变异因素。一旦计算出这种转换,就可以将其应用到任何查询数据集上。尽管我们也可以计算并应用传统的PCA投影,但在处理通过WNN分析构建的多模态参考数据时,我们更推荐使用监督式PCA(sPCA)。

sPCA的计算过程只需进行一次,之后就可以快速地将其应用到每一个查询数据集上。

bm <- ScaleData(bm, assay = 'RNA')
bm <- RunSPCA(bm, assay = 'RNA', graph = 'wsnn')

计算缓存的邻居索引

鉴于我们需要将多个查询样本与同一个参考集进行比对,我们可以对那些仅与参考集相关的特定步骤进行缓存处理。这个步骤虽然是可选的,但在处理多个样本的映射时,它可以有效提升运算速度。

我们首先在参考集的监督式PCA(sPCA)空间内计算出前50个最近邻。然后,我们将这些信息保存在Seurat对象的spca.annoy.neighbors属性中,并通过设置cache.index = TRUE来缓存annoy索引数据结构。

bm <- FindNeighbors(
  object = bm,
  reduction = "spca",
  dims = 1:50,
  graph.name = "spca.annoy.neighbors"
  k.param = 50,
  cache.index = TRUE,
  return.neighbor = TRUE,
  l2.norm = TRUE
)
  • 如何保存和加载缓存的烦恼索引?

如果您需要保存或加载一个利用 "annoy" 方法和启用了缓存索引(通过设置 cache.index = TRUE)创建的 Neighbor 对象的缓存索引,可以使用 SaveAnnoyIndex() 和 LoadAnnoyIndex() 这两个函数来完成。需要注意的是,这个索引不能通过常规方式保存到 RDS 或 RDA 文件,这意味着它不会在 R 会话重新启动或使用 saveRDS/readRDS 函数保存和读取包含该索引的 Seurat 对象时被正确保留。因此,每次当 R 重新启动或者您从 RDS 文件加载参考 Seurat 对象时,都需要使用 LoadAnnoyIndex() 函数来重新将 Annoy 索引加载到 Neighbor 对象中。SaveAnnoyIndex() 函数生成的文件可以与参考 Seurat 对象一起分发,以便在需要时将其添加到参考对象中的 Neighbor 对象里。

bm[["spca.annoy.neighbors"]]

## A Neighbor object containing the 50 nearest neighbors for 30672 cells

SaveAnnoyIndex(object = bm[["spca.annoy.neighbors"]], file = "/brahms/shared/vignette-data/reftmp.idx")
bm[["spca.annoy.neighbors"]] <- LoadAnnoyIndex(object = bm[["spca.annoy.neighbors"]], file = "/brahms/shared/vignette-data/reftmp.idx")

查询数据集预处理

本节我们将展示如何将来自多位捐献者的骨髓样本与一个多模态骨髓参考集进行比对。这些待查询的数据集来源于人类细胞图谱(Human Cell Atlas,HCA)的免疫细胞图谱中的骨髓数据集,可以通过SeuratData包访问。提供的数据集是一个合并后的对象,涵盖了8位捐献者的数据。我们首先需要将这些数据拆分成8个独立的Seurat对象,对应每位捐献者,然后分别进行映射分析。

library(dplyr)
library(SeuratData)
InstallData('hcabm40k')
hcabm40k.batches <- SplitObject(hcabm40k, split.by = "orig.ident")

接下来,我们按照参考数据集的处理方式对查询数据集进行标准化处理。具体来说,参考数据集是通过NormalizeData()函数采用对数标准化的方法进行处理的。如果参考数据集是利用SCTransform()函数进行标准化的,那么查询数据集同样需要应用SCTransform()函数来进行标准化处理。

hcabm40k.batches <- lapply(X = hcabm40k.batches, FUN = NormalizeData, verbose = FALSE)

Mapping

接下来,我们在每位捐献者的数据集与多模态参考集之间确定锚点。为了缩短映射时间,我们采用了一种优化的命令,该命令通过输入预先计算好的参考邻居集合,并关闭锚点筛选功能来实现效率提升。

anchors <- list()
for (i in 1:length(hcabm40k.batches)) {
  anchors[[i]] <- FindTransferAnchors(
    reference = bm,
    query = hcabm40k.batches[[i]],
    k.filter = NA,
    reference.reduction = "spca"
    reference.neighbors = "spca.annoy.neighbors"
    dims = 1:50
  )
}

然后我们单独映射每个数据集。

for (i in 1:length(hcabm40k.batches)) {
  hcabm40k.batches[[i]] <- MapQuery(
    anchorset = anchors[[i]], 
    query = hcabm40k.batches[[i]],
    reference = bm, 
    refdata = list(
      celltype = "celltype.l2"
      predicted_ADT = "ADT"),
    reference.reduction = "spca",
    reduction.model = "wnn.umap"
  )
}

探索映射结果

现在映射已完成,我们可以可视化各个对象的结果

p1 <- DimPlot(hcabm40k.batches[[1]], reduction = 'ref.umap', group.by = 'predicted.celltype', label.size = 3)
p2 <- DimPlot(hcabm40k.batches[[2]], reduction = 'ref.umap', group.by = 'predicted.celltype', label.size = 3)
p1 + p2 + plot_layout(guides = "collect")
alt

我们还可以把所有的数据对象合并成一个统一的数据集。需要注意的是,这些数据对象都已经通过参考集被整合到了一个共同的分析空间中。之后,我们就能够将这些数据的分析结果一并展现出来。

# Merge the batches 
hcabm40k <- merge(hcabm40k.batches[[1]], hcabm40k.batches[2:length(hcabm40k.batches)], merge.dr = "ref.umap")
DimPlot(hcabm40k, reduction = "ref.umap", group.by =  "predicted.celltype", label = TRUE, repel = TRUE, label.size = 3) + NoLegend()
alt

我们可以对查询细胞中的基因表达模式、聚类预测得分以及(估算得到的)表面蛋白水平进行可视化展示:

p3 <- FeaturePlot(hcabm40k, features = c("rna_TRDC""rna_MPO""rna_AVP"), reduction = 'ref.umap'
                  max.cutoff = 3, ncol = 3)

# cell type prediction scores
DefaultAssay(hcabm40k) <- 'prediction.score.celltype'
p4 <- FeaturePlot(hcabm40k, features = c("CD16 Mono""HSC""Prog-RBC"), ncol = 3
                  cols = c("lightgrey""darkred"))

# imputed protein levels
DefaultAssay(hcabm40k) <- 'predicted_ADT'
p5 <- FeaturePlot(hcabm40k, features = c("CD45RA""CD16""CD161"), reduction = 'ref.umap',
                  min.cutoff = 'q10', max.cutoff = 'q99', cols = c("lightgrey""darkgreen") ,
                  ncol = 3)
p3 / p4 / p5
alt
Reference
[1]

Source: https://satijalab.org/seurat/articles/multimodal_reference_mapping

本文由 mdnice 多平台发布

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

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

相关文章

IP定位技术在打击网络犯罪中的作用

随着互联网的普及和信息技术的发展&#xff0c;网络犯罪日益猖獗&#xff0c;给社会治安和个人财产安全带来了严重威胁。而IP定位技术的应用为打击网络犯罪提供了一种有效手段。IP数据云将探讨IP定位技术在打击网络犯罪中的作用及其意义。 1. IP定位技术的原理 IP&#xff08…

【小白可懂】SpringBootWeb入门

web开发需要的技术栈&#xff1a; 前端web开发&#xff1a; html css javascript Vue Element Nginx 后端web开发&#xff1a; Maven SpringBoot Web 基础篇 MySOL SpringBoot Mybatis SpringBoot Web开发篇 SpringBoot web进阶篇 什么是spring&#xff1f; 官网&a…

静态分析-RIPS-源码解析记录-03

既然有源码可以debug&#xff0c;那么直接跑测试用例&#xff0c;来跟踪处理逻辑感觉比直接看代码理逻辑更快一些&#xff0c;尤其是涉及到了扫描阶段&#xff0c;不然不容易弄清某刻某个变量的取值。 对于所有漏洞而言&#xff0c;都是由sink点到source点检测是否有过滤函数&…

创作纪念日(一周年)

机缘 我进入CSDN成为创作者是去年2023年的五月份&#xff0c;当时是在学校报名了蓝桥杯单片机组的比赛&#xff0c;觉得单片机方面有许多精妙之处&#xff0c;并且自学初学单片机实在有许多奇巧的设计点&#xff0c;有许多编程与硬件实际运行需要磨合的地方&#xff0c;这些惊…

idea中使用git拉取代码详细操作

注意&#xff1a;解决 Git拉取代码和本地代码丢失问题请点这里查看 以textGit文件为例&#xff1a; 下图&#xff1a;本地刚拉取远程的代码 git上的代码 1、在本地对代码进行修改 2、在git上对代码进行修改&#xff0c;模拟其他人对此文件的提交修改 3、拉取远程代码 4、合并自…

栈实现队列

一、分析 栈的特点是先出再入&#xff0c;而队列的特点为先入先出&#xff0c;所以我们创造两个栈&#xff0c;一个用来存放数据&#xff0c;一个用来实现其它功能此时栈顶为队尾&#xff1b;当要找队头数据时将前n-1个数据移入到另一个栈中&#xff0c;此时剩余那个数据为队头…

多模态CLIP和BLIP

一、CLIP 全称为Contrastive Language-Image Pre-Training用于做图-文匹配&#xff0c;部署在预训练阶段&#xff0c;最终理解为图像分类器。 1.背景 以前进行分类模型时&#xff0c;存在类别固定和训练时要进行标注。因此面对这两个问题提出CLIP&#xff0c;通过这个预训练…

制造业如何选择合适的项目管理软件?(内含软件推荐)

近期&#xff0c;收到很多小伙伴的提问&#xff1a;“想了解制造行业如何选择到合适的项目管理软件&#xff1f;”在竞争激烈的市场环境中&#xff0c;有效的项目管理对于制造业的发展至关重要&#xff0c;而项目管理软件则是重要支撑&#xff0c;能帮助企业更好地规划和跟踪项…

ITMS-91053: Missing API declaration

1. 添加PrivacyInfo.xcprivacy File → New → File → App Privacy 2. 格式 3. 已知对应关系 NSPrivacyAccessedAPICategoryFileTimestamp 3B52.1: Files provided to app by user, per documentation&#xff1a;File Timestamp NSPrivacyAccessedAPICategoryDiskSpace …

BW4HANA混合建模 用ADSO的哪个视图?

写日志的ADSO除了1,2,3表之外。还会有6,7,8view。8view是上了BW4HANA2.0之后激活ADSO就会生成的。如果旧版本没有8&#xff0c;那就RSDG_ADSO_ACTIVATE激活一下。 如果勾了外部HANA视图&#xff0c;那就等于说还有一个HANA view。 首先咱知道ADSO是BW里面用来物理存储&#xf…

Web前端一套全部清晰 ⑦ day4 CSS.2 复合选择器、CSS特性、背景属性、标签的显示模式

别人的议论&#xff0c;那是别人的&#xff0c;你的人生&#xff0c;才是你的 —— 24.5.7 一、复合选择器 定义&#xff1a;由两个或多个基础选择器&#xff0c;通过不同的方式组合而成 作用&#xff1a;更准确、更高效的选择目标元素&#xff08;标签&#xff09; 1.后代选择…

选购洗地机有哪些技巧?2024洗地机全面解析,618洗地机综合对比

洗地机作为人们生活中智能清洁工具的代表&#xff0c;它自带清/污水箱&#xff0c;不用手洗滚刷&#xff0c;既可以吸尘也可以自动识别并清洗地板上的干湿垃圾和顽固污渍&#xff0c;它以多功能一体化的设计改善了家务清洁的效率和体验。那么如何在众多洗地机品牌中&#xff0c…

1016: 插入排序算法实现

解法&#xff1a; /* 插入排序 */ void insertionSort(vector<int>& nums) {// 外循环&#xff1a;已排序区间为 [0, i-1]for (int i 1; i < nums.size(); i) {int base nums[i], j i - 1;// 内循环&#xff1a;将 base 插入到已排序区间 [0, i-1] 中的正确位置…

VBA_MF系列技术资料1-605

MF系列VBA技术资料1-605 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧&#xff0c;我参考大量的资料&#xff0c;并结合自己的经验总结了这份MF系列VBA技术综合资料&#xff0c;而且开放源码&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-0…

iOS 安装cocoapds

注意 CocoaPods安装是基于ruby环境的&#xff0c;所以要安装CocoaPods先要安装Ruby环境&#xff0c;国内不能直接安装&#xff0c;只能通过VPN或淘宝的Ruby镜像来访问。 安装过程 gem sources --remove https://rubygems.org/ ** (注意是两个“-”&#xff0c;否则会移除失败) …

看马斯克与OpenAI的爱恨情仇,AGI之路会走向何方?

揭秘马斯克与OpenAI的决裂&#xff1a;AI的未来将何去何从&#xff1f; ©作者|Steven 来源|神州问学 引言 2024 年 3 月 1 日&#xff0c;时任OpenAI联合创始人的Elon Musk(下文简称&#xff1a;马斯克)将现任 CEO、创始人Sam Altman(下文简称&#xff1a;阿尔特曼)告上…

【C语言】—— 动态内存管理

【C语言】——动态内存管理 一、动态内存管理概述1.1、动态内存的概念1.2、动态内存的必要性 二、 m a l l o c malloc malloc 函数2.1、函数介绍2.2、应用举例 三、 c a l l o c calloc calloc 函数四、 f r e e free free 函数4.1、函数介绍4.2、应用举例 五、 r e a l l o …

如何将Hyper-V转VMware?反之亦可

为何要在Hyper-V和VMware之间进行转换呢&#xff1f; 尽管VMware和Microsoft Hyper-V都是当前流行的一类虚拟机监控程序&#xff0c;但它们并不相互兼容。VMware产品使用VMDK格式创建虚拟磁盘&#xff0c;而Hyper-V则使用VHD或VHDX格式创建虚拟磁盘。 有时您可能需要进行这种转…

【Qt-CMake】QT中cmak编译出现CMake Error: The source.. does not match the soused

QT中cmak编译出现CMake Error: The source… does not match the soused 分析 前提是该项目是从另一个路径的项目复制过来的&#xff0c;编写代码时发现无论怎样修改代码&#xff0c;运行后都没有任何变化&#xff0c;以为是qtbug&#xff0c;重构重启都没用&#xff0c;最后…

fatal: fetch-pack: invalid index-pack output

解决方案&#xff1a;git clone --depth1 要克隆的git地址 下载最近一次提交的代码 其他分支的内容都不下载 这样整体下载体量就变小了 执行命令&#xff1a;git clone --depth 1 https://gitlab.scm321.com/ufx/xxxx.git