首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >CellHint自动化协调与整合不同scRNA-seq数据集的细胞类型注释

CellHint自动化协调与整合不同scRNA-seq数据集的细胞类型注释

作者头像
生信菜鸟团
发布2025-11-19 19:36:03
发布2025-11-19 19:36:03
290
举报
文章被收录于专栏:生信菜鸟团生信菜鸟团

Automatic cell-type harmonization and integration across Human Cell Atlas datasets 刊登日期:December 21, 2023 发表杂志:Cell IF:42.5

单细胞研究中,不同实验室对细胞类型的定义和命名存在差异,导致数据集之间难以直接比较和整合。CellHint 基于预测聚类树(PCT,predictive clustering tree)算法,跨数据集预测细胞之间的转录组相似性,将不同数据集中的细胞类型进行语义对齐,从而解决这一问题。

CellHint框架

1. 计算细胞-细胞类型不相似性矩阵(dissimilarity matrix)

输入:每个数据集的基因表达矩阵或低维空间。

每个细胞类型可以用该细胞类型中所有细胞的平均表达(即细胞质心,cell centroids)来表示。计算细胞与细胞类型之间的不相似性度量(可选 1-Pearson 相关系数或欧式距离),最终得到一个行为细胞,列为细胞类型,值为细胞与细胞类型之间不相似性的矩阵。

2. 构建预测聚类树PCT以及形成全局矩阵

第一步计算的是数据集内部的不相似性度量,而 PCT 可以预测跨数据集的细胞与细胞类型的不相似性。可以将数据集分为参考数据集(Reference)和查询数据集(Query)。首先在参考数据集上构建 PCT 树,该树使用参考数据集的基因表达数据,以参考数据集内部的不相似性矩阵作为训练目标。对于查询数据集中的每个细胞,将它的基因表达数据输入到已构建好的 PCT 树中,遍历树直到到达一个叶节点。将这个叶节点中所有参考细胞的平均不相似性度量定义为这个查询细胞与参考数据集上各个细胞类型的预测的不相似性。

重复上面的过程,让每个数据集都轮流作为参考数据集。对于数据集内部的细胞,使用第一步计算的不相似性;对于跨数据集的细胞,使用 PCT 预测的不相似性,最终形成一个庞大的、全局的“细胞-细胞类型”不相似性距离矩阵。

这种方法非常巧妙地避免了直接计算跨数据集的不相似性距离,从而减少了批次效应的影响。

3. 细胞类型协调图的构建

选择两个最相似的数据集,基于前面 PCT 预测的结果,分析它们的细胞类型是如何相互预测的(例如,数据集 A 中的细胞类型 X 大部分被预测为数据集 B 中的细胞类型 Y)。根据这些预测关系,定义细胞类型之间的语义关系(等价关系、包含关系等),然后迭代地将第三个、第四个,直至所有数据集都加入这个过程,不断扩展协调表/图。最终得到的输出结果有①协调图,行代表不同的细胞类型,列代表原始数据集;②细胞类型层次结构,高层次代表广泛的细胞类别,低层次代表更精细的细胞亚型。

4. 数据整合

利用上面产生的协调一致的细胞类型信息来指导多个数据集的整合,,从而在消除批次效应的同时更好地保留生物学结构。传统的整合方法在寻找一个细胞的最近邻时是在所有细胞中进行的,这里的改变在于,它寻找最近邻只在与这个细胞属于同一层细胞类型的细胞群里进行搜索,这样确保了细胞的最近邻在生物学上是相关的,避免了批次效应产生的错误连接,其他的和 bbknn 算法一致。

使用CellHint进行细胞类型的协调

1. 4个脾脏数据集的下载和处理

下载示例数据,这个数据里包含了 4 个数据集:

代码语言:javascript
复制
import scanpy as sc
代码语言:javascript
复制
adata = sc.read("cellhint_demo_folder/Spleen.h5ad", 
                backup_url = "https://celltypist.cog.sanger.ac.uk/Resources/Organ_atlas/Spleen/Spleen.h5ad")
adata
代码语言:javascript
复制
AnnData object with n_obs × n_vars = 200664 × 74369
    obs: 'Dataset', 'donor_id', 'development_stage', 'sex', 'suspension_type', 'assay', 'Original_annotation', 'CellHint_harmonised_group', 'cell_type', 'Curated_annotation', 'organism', 'disease', 'tissue'
    var: 'exist_in_Madissoon2020', 'exist_in_Tabula2022', 'exist_in_DominguezConde2022', 'exist_in_He2020'
    uns: 'schema_version', 'title'
    obsm: 'X_umap'
代码语言:javascript
复制
adata.obs.Dataset.value_counts()
代码语言:javascript
复制
Madissoon et al. 2020          92049
Dominguez Conde et al. 2022    70099
Tabula Sapiens 2022            34004
He et al. 2020                  4512
Name: Dataset, dtype: int64

这里 adata.X 存的是标准化后的数据,原始 count 数据存储在 adata.raw 里,虽然 CellHint 不是一定需要 count 数据,但在这里还是从 count 开始跑一个完整的流程:

代码语言:javascript
复制
adata = adata.raw.to_adata()

清理和简化一下数据结构,只需要保留 .X.obs 就好了:

代码语言:javascript
复制
del adata.var
del adata.uns
del adata.obsm
adata
代码语言:javascript
复制
AnnData object with n_obs × n_vars = 200664 × 74369
    obs: 'Dataset', 'donor_id', 'development_stage', 'sex', 'suspension_type', 'assay', 'Original_annotation', 'CellHint_harmonised_group', 'cell_type', 'Curated_annotation', 'organism', 'disease', 'tissue'

接下来执行标准的单细胞分析流程:

代码语言:javascript
复制
sc.pp.normalize_total(adata, target_sum = 1e4)
sc.pp.log1p(adata)
sc.pp.highly_variable_genes(adata, batch_key = 'Dataset', subset = True)
sc.pp.scale(adata, max_value = 10)
sc.tl.pca(adata)
sc.pp.neighbors(adata)
sc.tl.umap(adata)

可视化数据集来源和原始的注释结果:

代码语言:javascript
复制
sc.pl.umap(adata, color = 'Dataset')
sc.pl.umap(adata, color = 'Original_annotation')
2. 执行细胞类型对齐

接下来使用 cellhint.harmonize 函数来协调跨数据集的细胞类型。默认情况下,使用 PCA(X_pca)作为输入,这可能会因为批次效应未校正而引入噪声。不过 cellhint.harmonize 通常不会受此影响。也可以通过参数 use_rep 提供其他的用于计算距离的低维空间表示。

如果批次效应非常强,可以设置 use_pct = True 来预测。在 CellHint 里可以通过参数 dataset_order 指定数据集依次进行对齐的顺序。

代码语言:javascript
复制
import cellhint
alignment = cellhint.harmonize(adata, 'Dataset', 'Original_annotation')
代码语言:javascript
复制
Loading faiss with AVX2 support.
Could not load library with AVX2 support due to:
ModuleNotFoundError("No module named 'faiss.swigfaiss_avx2'")
Loading faiss.
Successfully loaded faiss.
👀 Detected PCA coordinates in the object, will use these to calculate distances
🏆 Reordering datasets
🖇 Harmonizing cell types of Dominguez Conde et al. 2022 and Madissoon et al. 2020
🖇 Harmonizing cell types of Tabula Sapiens 2022
🖇 Harmonizing cell types of He et al. 2020
🖋️ Reannotating cells
✅ Harmonization done!
代码语言:javascript
复制
alignment
代码语言:javascript
复制
Cross-dataset cell type alignment for 4 datasets
    base_distance: a cross-dataset distance object
    aligned_datasets: 'Dominguez Conde et al. 2022', 'Madissoon et al. 2020', 'Tabula Sapiens 2022', 'He et al. 2020'
    relation: data frame of the harmonization table
    reannotation: data frame of the reannotated cells ('dataset', 'cell_type', 'reannotation', 'group')

将对齐结果保存为 .pkl 文件:

代码语言:javascript
复制
alignment.write('cellhint_demo_folder/spleen_alignment.pkl')
3. 查看结果

加载先前保存的对齐结果:

代码语言:javascript
复制
alignment = cellhint.DistanceAlignment.load('cellhint_demo_folder/spleen_alignment.pkl')

协调表存在 .relation 中,每一行对应一个协调后的低层次细胞类型,也就是通过自动对齐可实现的最精细注释级别。高层次细胞类型由表格中完全连接的行定义,存在 .groups 中。

代码语言:javascript
复制
alignment.relation.head(10)
代码语言:javascript
复制
alignment.groups
代码语言:javascript
复制
array(['Group1', 'Group1', 'Group2', 'Group3', 'Group3', 'Group4',
       'Group5', 'Group6', 'Group7', 'Group8', 'Group9', 'Group10',
       'Group11', 'Group12', 'Group13', 'Group2', 'Group14', 'Group15',
       'Group16', 'Group17', 'Group18', 'Group19', 'Group19', 'Group20',
       'Group20', 'Group19', 'Group19', 'Group2', 'Group2', 'Group21',
       'Group21', 'Group21', 'Group22', 'Group22', 'Group19', 'Group19',
       'Group23', 'Group23', 'Group19', 'Group19', 'Group16', 'Group16',
       'Group16', 'Group22', 'Group24', 'Group25', 'Group26'],
      dtype=object)

可以结合 .relation.groups 来查看某个组包含哪些细胞类型:

代码语言:javascript
复制
alignment.relation[alignment.groups == 'Group22']

执行 cellhint.harmonize 的时候,重注释参数是默认 reannotate = True 的,结果存在 .reannotation 中:

代码语言:javascript
复制
alignment.reannotation.head(10)

如果需要的话可以将后两行存到 adata.obs 中:

代码语言:javascript
复制
adata.obs[['low_hierarchy', 'high_hierarchy']] = alignment.reannotation.loc[adata.obs_names, ['reannotation', 'group']]

可视化对齐结果:

代码语言:javascript
复制
cellhint.treeplot(alignment)
代码语言:javascript
复制
cellhint.treeplot(alignment, order_dataset = True)

详细的细节在 https://cellhint.readthedocs.io/en/stable/notebook/cellhint_tutorial_harmonisation.html 这里可以看,还有 meta-analysis 和数据整合的内容需要的话也可以关注一下。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-11-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信菜鸟团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • CellHint框架
    • 1. 计算细胞-细胞类型不相似性矩阵(dissimilarity matrix)
    • 2. 构建预测聚类树PCT以及形成全局矩阵
    • 3. 细胞类型协调图的构建
    • 4. 数据整合
  • 使用CellHint进行细胞类型的协调
    • 1. 4个脾脏数据集的下载和处理
    • 2. 执行细胞类型对齐
    • 3. 查看结果
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档