跳至章节信息跳至正文
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

注释

🧠 关键要点
⚙️ 环境设置
步骤
yml
  1. 安装 conda:

    • 在创建环境之前,请确保 conda 已安装在你的系统中。

  2. 保存 yml 内容:

    • 将 yml 选项卡中的内容保存为文件 environment.yml。

  3. 创建环境:

    • 打开终端或命令提示符。

    • 运行以下命令:

      conda env create -f environment.yml
  4. 激活环境:

    • 创建好环境后,使用以下命令激活它:

      conda activate <environment_name>
    • 请将 <environment_name> 替换为 environment.yml 文件中指定的环境名称。该名称在 yml 文件中如下所示:

      name: <environment_name>
  5. 验证安装:

    • 通过运行以下命令,检查环境是否创建成功:

      conda env list
🗄️ 获取数据和笔记本

本书使用 lamindb 存储、共享和加载数据集与笔记本,托管实例为 theislab/sc-best-practices。感谢提供免费托管的 Lamin Labs。

  1. 安装 lamindb

    • 安装 lamindb Python 软件包:

    pip install lamindb
  2. 可选择创建 Lamin 账户

  3. 验证你的设置

    • 下面用 Python API 检查连接;命令行方式可使用 lamin connect:

    import lamindb as ln
    
    ln.Artifact.connect("theislab/sc-best-practices").df()

    运行后应显示最多 100 条已保存的数据集记录。

  4. 访问数据集(Artifact)

    import lamindb as ln
    af = ln.Artifact.connect("theislab/sc-best-practices").get(key="key_of_dataset", is_latest=True)
    obj = af.load()

    加载后的对象可直接在内存中分析。如需指定数据版本,可调整 lamindb.Artifact.connect("theislab/sc-best-practices").get("SOMEIDXXXX") 中的 ID。

  5. 访问笔记本(Transform)

    lamin load <notebook url>

    该命令将笔记本下载到当前工作目录。与 Artifacts 类似,可通过指定 ID 获取旧版本。

研究动机

抗体衍生标签(Antibody-Derived Tags, ADTs)提供表面蛋白信息,可补充单细胞 RNA 测序(Single-Cell RNA Sequencing, scRNA-seq)的细胞类型注释(cell type annotation),尤其适合具有成熟表面标记体系的免疫细胞。RNA 测量可能出现漏检(dropout),即存在的转录本因采样或检测限制而未被记录;部分蛋白标记在 ADT 中信号更稳定,但 ADT 也有背景与检测局限。例如,多种免疫细胞表达 CD45 蛋白,而编码它的 PTPRC 转录本在个别细胞中可能较低或未检出,蛋白信息可帮助判断。

本章的手动注释(manual annotation)流程(workflow)沿用 Scanpy 的聚类(clustering)与可视化函数;不过,统计结果仍需按 ADT 的归一化(normalization)尺度解释,不能直接照搬 RNA 的全部假设。

环境设置

import warnings

import scanpy as sc

warnings.filterwarnings("ignore")
sc.settings.verbosity = 0
sc.set_figure_params(
    dpi=80,
    facecolor="white",
    frameon=False,
)

import lamindb as ln

ln.track()
→ connected lamindb: theislab/sc-best-practices
→ loaded Transform('BnpvfJLWjHuE0009', key='annotation.ipynb'), re-started Run('4qV0TQMofb5Skmfz') at 2026-07-29 14:38:23 UTC
→ notebook imports: lamindb-core==2.3.1 muon==0.1.9 scanpy==1.12.3
• recommendation: to identify the notebook across renames, pass the uid: ln.track("BnpvfJLWjHuE")

加载数据

加载前一章保存的 MuData 对象,参见 批次校正:

af = ln.Artifact.connect("theislab/sc-best-practices").get(
    key="surface-protein/cite_batch_correction.h5mu", is_latest=True
)
mdata = af.load()
mdata
Loading...

手动注释

先查看白细胞常用标记 CD45。
CD45 通过调节 Lck 的磷酸化状态参与 T 细胞受体(T-Cell Receptor, TCR)信号调控 Courtney et al., 2019。本例预期多种免疫细胞均具有 CD45 信号,红系细胞通常较低;不同白细胞群的相对水平仍应结合数据观察,不能仅由这条信号通路推断。

sc.pl.umap(mdata["prot"], frameon=False, color="CD45", vmax=20)
<Figure size 320x320 with 2 Axes>

数据中部分 ADT 名称可能因去重而带有后缀。var_names_make_unique 用于使变量名唯一,并不负责判断变量属于基因还是蛋白。蛋白名称可能出现 -1 等后缀;下面以 CD38 为例,在蛋白元数据中查找实际名称。

mdata["prot"].var[mdata["prot"].var.gene_ids.str.contains("CD38")]
Loading...

先以较低分辨率进行 Leiden 聚类,识别主要群体。若有足够的标记和证据,再提高分辨率探索更细的亚群。

sc.tl.leiden(
    mdata["prot"],
    resolution=0.08,
    flavor="igraph",
    n_iterations=2,
    directed=False,
    random_state=0,
)

使用 Scanpy 的 rank_genes_groups 对簇间蛋白差异排序,并在 dotplot 中展示每簇排名靠前的三个标记。这里函数名沿用 genes,但输入是蛋白。下方代码请求 logfoldchanges;该统计量的近似计算面向对数归一化 RNA,而本例使用可为负的 背景去噪与缩放(denoised and scaled by background, dsb) 数值,因此不能将其直接解释为可靠的蛋白 log 倍数变化。注释还需检查实际标记信号。

sc.tl.rank_genes_groups(mdata["prot"], groupby="leiden")
sc.tl.dendrogram(mdata["prot"], groupby="leiden")
sc.pl.rank_genes_groups_dotplot(
    mdata["prot"], n_genes=3, values_to_plot="logfoldchanges"
)
<Figure size 983.2x332 with 6 Axes>

CD3 支持将簇 0 和 1 初步识别为 T 细胞,CD19-1 支持将簇 6 识别为 B 细胞。接着在前面计算的 统一流形近似与投影(uniform manifold approximation and projection, UMAP) 上按簇着色。

sc.pl.umap(mdata["prot"], color="leiden")
<Figure size 320x320 with 1 Axes>

结合多个已知免疫标记,核对各簇的候选细胞类型。

# B cells
sc.pl.umap(mdata["prot"], frameon=False, color=["CD19-1"])
<Figure size 320x320 with 2 Axes>

簇 6 的 CD19 信号支持 B 细胞注释。

进一步结合 CD3、CD4 与 CD8,区分 CD4 和 CD8 T 细胞。

# T cells
sc.pl.umap(mdata["prot"], color=["CD3", "CD4-1", "CD8"])
<Figure size 1159.2x320 with 6 Axes>

随后检查自然杀伤细胞(Natural Killer Cells, NK cells)、CD14 单核细胞、树突状细胞(Dendritic Cells, DCs)和 CD16 单核细胞的候选标记。应组合解读:CD56 也可出现在部分 T 细胞中,CD3 与 CD56 双阳性本身不足以确证 NKT;CD11c 也并非 DC 专属标记。

# NK cells are CD3- and CD56+
# NKT cells are CD3+ and CD56+
sc.pl.umap(mdata["prot"], color=["CD56"], frameon=False)
<Figure size 320x320 with 2 Axes>
# CD14 Monocytes
sc.pl.umap(mdata["prot"], color=["CD11b", "CD14-1"], frameon=False, vmax=40)
<Figure size 772.8x320 with 4 Axes>
# Dendritic cells. CD123 and CD303 are expressed mostly in dendritic cells, while CD11c is expressed in myeloid cells, including dendritic cells.
sc.pl.umap(mdata["prot"], color=["CD123", "CD303", "CD11c"], frameon=False, vmax=30)
<Figure size 1159.2x320 with 6 Axes>
# CD16 is expressed in NK cells and in CD16 monocytes, which are CD14-, CD16+ and CD11c+
sc.pl.umap(mdata["prot"], color="CD16", frameon=False)
<Figure size 320x320 with 2 Axes>

根据标记组合,将簇编号替换为候选细胞类型名称。下方代码映射的是 0–8 共九个簇;其中两个簇都标为 DC。包括红系在内的各标签仍应由相应标记支持,不能仅凭单一阴性标记判断。

sc.pl.umap(mdata["prot"], color="leiden")
<Figure size 320x320 with 1 Axes>
mdata["prot"].obs["celltype"] = mdata["prot"].obs.leiden.copy()
mdata["prot"].obs.celltype.replace(
    {
        "0": "CD4 T",
        "1": "CD8 T",
        "2": "Erythroid",
        "3": "CD14 Mono",
        "4": "NK",
        "5": "DC",
        "6": "B",
        "7": "DC",
        "8": "CD16 Mono",
    },
    inplace=True,
)
sc.pl.umap(
    mdata["prot"],
    color="celltype",
    legend_loc="on data",
    legend_fontsize=11,
    legend_fontoutline=2,
)
<Figure size 320x320 with 1 Axes>

至此获得主要细胞群的初步注释。若需更细的分类,可提高聚类分辨率,再结合相应标记核对;分辨率提高并不自动意味着注释更准确。

本章基于 通过测序进行转录组与表位索引(cellular indexing of transcriptomes and epitopes by sequencing, CITE-seq) 的 ADT 数据进行注释。联合利用 RNA 与蛋白信息的方法见 配对整合 章节。

af_annotation = ln.Artifact.from_mudata(
    mdata,
    key="surface-protein/cite_annotation.h5mu",
    description="CITE-seq data after annotation",
)
af_annotation.save()
输出
→ creating new artifact version for key 'surface-protein/cite_annotation.h5mu' in storage 's3://lamin-eu-central-1/VPwcjx3CDAa2'
... uploading OyfKOZw9TXUQXeOp0006.h5mu: 100.0%
• replacing the existing cache path /var/cache/user/marchena/.cache/lamindb/lamin-eu-central-1/VPwcjx3CDAa2/surface-protein/cite_annotation.h5mu
Artifact(uid='OyfKOZw9TXUQXeOp0006', key='surface-protein/cite_annotation.h5mu', description='CITE-seq data after annotation', suffix='.h5mu', kind='dataset', otype='MuData', size=1450115558, hash='piMa8ZMc78O_eJtyyPlHCU', n_files=None, n_observations=105907, branch_id=1, created_on_id=1, space_id=1, storage_id=1, run_id=110, schema_id=None, created_by_id=7, created_at=2026-07-29 14:38:44 UTC, is_locked=False, version_tag=None, is_latest=True)
ln.finish()
输出
• please hit CTRL + s to save the notebook in your editor ... ✓
→ finished Run('4qV0TQMofb5Skmfz') after 40s at 2026-07-29 14:39:03 UTC
→ go to: https://lamin.ai/theislab/sc-best-practices/transform/BnpvfJLWjHuE0009
→ to update your notebook from the CLI, run: lamin save /groups/nils/members/javier/single-cell-best-practices/jupyter-book/surface_protein/annotation.ipynb

自动注释

还可训练 ADT 分类器或映射到蛋白参考数据,但适用性取决于抗体面板、归一化方式、参考覆盖和跨批次可比性。本章不演示具体 ADT 自动注释模型;一般方法可参考 RNA 注释章节。

贡献者

我们衷心感谢以下人员的贡献:

作者

  • Javier Marchena-Hurtado

  • Daniel Strobl

  • Ciro Ramírez-Suástegui

审阅者

  • Lukas Heumos

  • Anna Schaar

References
  1. Courtney, A. H., Shvets, A. A., Lu, W., Griffante, G., Mollenauer, M., Horkova, V., Lo, W.-L., Yu, S., Stepanek, O., Chakraborty, A. K., & Weiss, A. (2019). CD45 functions as a signaling gatekeeper in T cells. Sci. Signal., 12(604), eaaw8151.