ingest和BBKNN进行单细胞整合(2)

简介: ingest和BBKNN进行单细胞整合(2)

引言

本系列讲解 使用Scanpy分析单细胞(scRNA-seq)数据教程,持续更新,欢迎关注,转发!

BBKNN

BBKNN 可以很好地解决批次效应。

%%time
sc.external.pp.bbknn(adata_all, batch_key="batch")

sc.tl.umap(adata_all)

sc.pl.umap(adata_all, color=["batch", "celltype"])

如果有人更倾向于从一个参考数据集开始迭代工作,可以使用 ingest。

使用 ingest 映射到参考批次

选择一个参考批次来训练模型并建立邻域图(这里使用 PCA),并分离出所有其他批次。

和之前一样,训练于参考批次的模型将解释其中观察到的生物学变异。

adata_ref = adata_all[adata_all.obs["batch"] == "0"].copy()

在参考数据上计算 PCA和 UMAP。

sc.pp.pca(adata_ref)
sc.pp.neighbors(adata_ref)
sc.tl.umap(adata_ref)

参考批次包含了所有批次中 19 种细胞类型中的 12 种。

sc.pl.umap(adata_ref, color="celltype")

迭代地将参考数据中的标签(如 “celltype”)和嵌入(如 “X_pca” 和 “X_umap”)映射到查询批次。

adatas = [adata_all[adata_all.obs["batch"] == i].copy() for i in ["1", "2", "3"]]

sc.settings.verbosity = 2  # a bit more logging
for iadata, adata in enumerate(adatas, 1):
    print(f"... integrating batch {iadata}")
    adata.obs["celltype_orig"] = adata.obs["celltype"]  # save the original cell type
    sc.tl.ingest(adata, adata_ref, obs="celltype")

现在每个查询批次都带有与 adata_ref 相关联的注释。通过合并,我们可以一起查看它们。

adata_concat = anndata.concat([adata_ref, *adatas], label="batch", join="outer")

adata_concat.obs["celltype"] = (
    adata_concat.obs["celltype"]
    .astype("category")
    .cat.reorder_categories(adata_ref.obs["celltype"].cat.categories)
)
# fix category coloring
adata_concat.uns["celltype_colors"] = adata_ref.uns["celltype_colors"]

sc.pl.umap(adata_concat, color=["batch", "celltype"])

与 BBKNN 的结果相比,这种方法在保持聚类方面表现得更为明显。如果已经观察到期望的连续结构(例如在造血数据集中),ingest 可以轻松地保持这种结构。

评估一致性

我们先将数据限定在查询批次中。

adata_query = adata_concat[adata_concat.obs["batch"].isin(["1", "2", "3"])].copy()

接下来的图表有点难以阅读,因此我们转而查看下面的混淆矩阵。

sc.pl.umap(adata_query, color=["batch", "celltype", "celltype_orig"], wspace=0.4)

跨批次保留的细胞类型

我们首先关注与参考数据一致的细胞类型,以便简化混淆矩阵的阅读。

# intersected categories
conserved_categories = adata_query.obs["celltype"].cat.categories.intersection(
    adata_query.obs["celltype_orig"].cat.categories
)
# intersect categories
obs_query_conserved = adata_query.obs.loc[
    adata_query.obs["celltype"].isin(conserved_categories)
    & adata_query.obs["celltype_orig"].isin(conserved_categories)
].copy()
# remove unused categories
obs_query_conserved["celltype"] = obs_query_conserved[
    "celltype"
].cat.remove_unused_categories()
# remove unused categories and fix category ordering
obs_query_conserved["celltype_orig"] = (
    obs_query_conserved["celltype_orig"]
    .cat.remove_unused_categories()
    .cat.reorder_categories(obs_query_conserved["celltype"].cat.categories)
)

pd.crosstab(obs_query_conserved["celltype"], obs_query_conserved["celltype_orig"])

总体而言,保留的细胞类型也如预期般被映射。主要的例外是一些在原始注释中表现为腺泡细胞的腺泡细胞。然而,参考数据本身就存在一个包含腺泡细胞和导管细胞的聚类,这解释了这种差异,并暗示了初始注释可能存在潜在的不一致性。

所有细胞类型

现在我们来看所有细胞类型。

pd.crosstab(adata_query.obs["celltype"], adata_query.obs["celltype_orig"])

我们发现,胰腺星状细胞(PSC)实际上只是被不一致地注释了,并且正确地映射到了 “activated_stellate” 细胞上。

此外,看到 “间充质” 和 “间充质的” 细胞都被映射到了同一个类别上,这是很有趣的。然而,那个类别又是 “activated_stellate”,可能并不正确。

跨批次的可视化

通常,批次对应于人们想要比较的实验。Scanpy 为此提供了两种便捷的可视化方式。

一种是密度图,另一种是在嵌入中对类别/组的一个子集的部分可视化。

密度图

sc.tl.embedding_density(adata_concat, groupby="batch")

sc.pl.embedding_density(adata_concat, groupby="batch")

在嵌入中对一个组的子集的部分可视化

import matplotlib.pyplot as plt

fig, axes = plt.subplots(1, 3, figsize=(15, 5))
for batch, ax in zip(["1", "2", "3"], axes):
    sc.pl.umap(adata_concat, color="batch", groups=[batch], ax=ax, show=False)

相关文章
|
24天前
|
关系型数据库 MySQL 分布式数据库
Super MySQL|揭秘PolarDB全异步执行架构,高并发场景性能利器
阿里云瑶池旗下的云原生数据库PolarDB MySQL版设计了基于协程的全异步执行架构,实现鉴权、事务提交、锁等待等核心逻辑的异步化执行,这是业界首个真正意义上实现全异步执行架构的MySQL数据库产品,显著提升了PolarDB MySQL的高并发处理能力,其中通用写入性能提升超过70%,长尾延迟降低60%以上。
|
26天前
|
人工智能 边缘计算 Serverless
震惊!CDN都进化到可以用MCP写游戏了吗?
《2048》是一款风靡全球的数字益智小游戏,玩家通过移动和合并相同数字完成2048即为通关。传统开发需数小时甚至数月,而使用ESA MCP Server只需1分钟“0代码”即可实现网页全球部署。ESA MCP Server是开源的Model Context Protocol服务实现,连接AI模型与边缘安全加速服务。结合阿里云边缘函数(ER),支持秒级全球节点部署,降低延迟,提升响应速度。环境搭建简单,仅需配置API密钥与插件,向AI提出需求即可快速生成并部署应用。
88 10
|
20天前
|
人工智能 运维 Serverless
语音生成+情感复刻,Cosyvoice2.0 极简云端部署
语音合成技术正快速发展,广泛应用于智能座舱、儿童教育等领域。CosyVoice2凭借多语言生成、零样本生成等优势,成为企业优选。然而,企业仍面临GPU算力依赖、部署运维复杂及成本高等挑战。阿里云函数计算Function AI推出Serverless化语音合成方案,支持CosyVoice2一键部署与弹性扩容,简化调试与运维流程,显著降低成本,助力企业高效落地AI语音应用。
224 18
|
人工智能 运维 持续交付
AI大模型运维开发探索第五篇:GitOps 智能体
本文探讨了 Manus 智能体的设计及其与传统智能体的差异,重点分析了 CodeAct 机制对智能体执行效率的提升。作者通过《基于LLM的数据仓库》实验反思了交互接口选择的重要性,并提出操作系统和文件系统作为良好的自反馈交互系统。文章进一步结合 GitOps 和持续集成(CICD)理念,设计了一种低成本、可观测性强的智能体运行方案,包括计划智能体(Planner)和执行智能体(Executor)的协作流程。通过实际案例对比,展示了 GitOps 智能体与 Manus 的相似效果,并总结了其在记忆增强、推理可观测性、低成本部署及跨环境适配等方面的优势。最后提供了相关代码路径和参考材料。
223 17
|
24天前
|
Kubernetes Cloud Native 安全
云原生机密计算新范式 PeerPods技术方案在阿里云上的落地和实践
PeerPods 技术价值已在阿里云实际场景中深度落地。
|
25天前
|
人工智能 运维 数据挖掘
一站式智能分析引擎,快速构建企业级数据分析 Agent
本文介绍了一种基于阿里云实时数仓 Hologres 和百炼大模型服务的智能数据分析解决方案。通过 Function AI 提供的 Serverless 平台,企业可快速构建从多源数据接入到业务洞察的端到端流程。方案支持实时数据分析、湖仓直连加速、智能预处理及按需付费模式,大幅降低运维成本并提升效率。同时,文章详细描述了实践部署步骤,包括专有网络配置、Hologres 实例创建、公共数据集导入及应用部署验证等环节,并提供了资源清理指南与参考链接,确保用户能够顺利实施和管理方案。
|
弹性计算 安全 API
大模型终于能“听懂”云操作了?
本文通过 MCP Server 和大模型的结合,实现云产品管理的自然语言操作,极大提升开发者的操作效率和用户体验。
116 17
|
存储 运维 开发工具
警惕日志采集失败的 6 大经典雷区:从本地管理反模式到 LoongCollector 标准实践
本文探讨了日志管理中的常见反模式及其潜在问题,强调科学的日志管理策略对系统可观测性的重要性。文中分析了6种反模式:copy truncate轮转导致的日志丢失或重复、NAS/OSS存储引发的采集不一致、多进程写入造成的日志混乱、创建文件空洞释放空间的风险、频繁覆盖写带来的数据完整性问题,以及使用vim编辑日志文件导致的重复采集。针对这些问题,文章提供了最佳实践建议,如使用create模式轮转日志、本地磁盘存储、单线程追加写入等方法,以降低日志采集风险,提升系统可靠性。最后总结指出,遵循这些实践可显著提高故障排查效率和系统性能。
246 20
|
5天前
|
机器学习/深度学习 人工智能 算法
Wi-Fi老是卡?不如试试让“深度学习”来当网络管家!
Wi-Fi老是卡?不如试试让“深度学习”来当网络管家!
115 68