首先,我们设置标签传输模型:

knn_transformer = sca.utils.knn.weighted_knn_trainer(    train_adata=ref_emb,    train_adata_emb="X",     n_neighbors=15,)

执行标签传输:

labels, uncert = sca.utils.knn.weighted_knn_transfer(    query_adata=adata_emb,    query_adata_emb="X",     label_keys="cell_type",  # (start of) obs column name(s) for which to transfer labels    knn_model=knn_transformer,    ref_adata_obs=ref_emb.obs,)

储存结果:

adata_emb.obs["transf_cell_type"] = labels.loc[adata_emb.obs.index, "cell_type"]adata_emb.obs["transf_cell_type_unc"] = uncert.loc[adata_emb.obs.index, "cell_type"]

将对象传输到最初的查询对象中,以便于后续的umap可视化:

adata.obs.loc[adata_emb.obs.index, "transf_cell_type"] = adata_emb.obs[    "transf_cell_type"]adata.obs.loc[adata_emb.obs.index, "transf_cell_type_unc"] = adata_emb.obs[    "transf_cell_type_unc"]

接下来可视化看一下传输后的标签:

sc.set_figure_params(figsize=(5, 5))sc.pl.umap(adata, color="transf_cell_type", frameon=False)

自己数据的 UMAP 中可视化传输的标签

在单细胞分析中,每个细胞通常被标记为某种特定的细胞类型(例如巨噬细胞、T细胞等)。这种标记可以基于转录组数据的相似性和注释数据库的比对。邻居关系是通过降维(如t-SNE或UMAP)和聚类分析构建的,邻近的单元格通常具有相似的基因表达模式,因此可能属于同一类型。如果一个单元格的邻居大多属于同一种类型,我们可以更确定该单元格也属于该类型。如果一个单元格的邻居属于多种不同类型,则其类型分配的不确定性增加,因为它没有明显倾向于某一类型。不确定性分数反映了一个单元格的类型标注的“可信度”。比如:一个单元格的邻居类型越单一,分数越低(确定性高);邻居类型越多样化,分数越高(确定性低)。通过这种方式,我们可以评估转移标签的可靠性。例如,在跨物种或跨数据集的单元格类型注释中,了解标签的可信程度有助于提高注释的准确性。可信度低的标签可能需要进一步验证。为了直观了解每个单元格的确定性,可以在降维图(如UMAP或t-SNE)上用颜色标记不确定性分数。颜色变化显示哪些单元格的标签是可靠的,哪些可能存在争议,从而指导进一步分析。

可视化不确定性分数:

sc.pl.umap(adata, color="transf_cell_type_unc", frameon=False)

不确定分数可视化

让我们检查每种细胞类型标签的标签转移不确定性水平有多高。这让我们对哪些注释更具争议性/需要更多的手动检查有一个第一印象:

fig, ax = plt.subplots(figsize=(8, 3))ct_order = (    adata.obs.groupby("transf_cell_type")    .agg({"transf_cell_type_unc": "median"})    .sort_values(by="transf_cell_type_unc", ascending=False))sns.boxplot(    adata.obs,    x="transf_cell_type",    y="transf_cell_type_unc",    color="grey",    ax=ax,    order=ct_order.index,)ax.tick_params(rotation=90, axis="x")

不确定分数箱线图

为了将这些不确定性信息合并到我们转移的标签中,我们可以将不确定性分数高于 0.2 的单元格设置为“未知”:

adata.obs["transf_cell_type_certain"] = adata.obs.transf_cell_type.tolist()adata.obs.loc[    adata.obs.transf_cell_type_unc > 0.2, "transf_cell_type_certain"] = "Unknown"

过滤后可视化:

sc.pl.umap(adata, color="transf_cell_type_certain", frameon=False)

只展示unknown:

Python单细胞分析-映射到引用的注释(下)
sc.pl.umap(adata, color="transf_cell_type_certain", groups="Unknown")

不确定性分析不仅能帮助我们识别算法难以明确分类的细胞区域(例如,当细胞位于两种注释表型的边界之间),还可以揭示潜在的未知细胞类型或新的细胞状态。例如,如果参考数据集主要来源于健康样本,而查询数据集则来自患病样本,不确定性评分能够突出显示可能具有疾病特异性的细胞状态,因为这些细胞的邻居可能并不属于参考数据集中单一明确的细胞类型。

尤其是当参考数据基于大量异质数据集时,不确定性分数可以用来标记查询数据中值得进一步研究的部分,从而指导分析方向。因此,基于参考的标签传递不仅在注释数据中具有重要价值,还能够加速对数据的探索与理解。然而,需要注意的是,与任何指标一样,不确定性分数也并非完美无缺。在某些情况下,它可能未能准确地突出显示新的细胞类型或状态。