跳转至

385_单细胞TCR_BCR免疫组库分析


一句话说明

免疫组库分析(TCR/BCR)就是研究"每个T细胞/B细胞的抗原受体是什么序列",结合scRNA-seq可以同时知道细胞功能状态和它能识别哪种抗原。


核心知识点

要点1:TCR/BCR 的基本结构

  • TCR(T细胞受体):由 α 链 + β 链组成(少数 γδ TCR)
  • BCR(B细胞受体):由重链(VDJ重组)+ 轻链(VJ重组)组成
  • CDR3区:高变区,决定抗原特异性,是免疫组库分析的核心
  • 克隆型(Clonotype):相同 VDJ 重排序列的细胞群,代表同一克隆

要点2:为什么要与 scRNA-seq 联合

  • 单纯TCR测序:知道序列,不知道细胞功能(Exhausted? Naive? Memory?)
  • 单纯scRNA-seq:知道细胞状态,不知道抗原特异性
  • 联合分析:每个细胞既有功能转录组信息,又有受体序列

要点3:主要工具

工具功能输入
CellRanger VDJ从原始fastq重建TCR/BCR序列10x VDJ-enriched fastq
ScirpyTCR/BCR数据分析与可视化CellRanger vdj_b/vdj_t输出
scirpy + scanpy联合单细胞分析h5ad + contig注释CSV
immunarch (R)免疫组库统计分析多格式TCR/BCR数据

要点4:克隆型多样性分析

  • Shannon 多样性:克隆型的多样性(肿瘤浸润T细胞多样性低)
  • 克隆型扩增(Clonal Expansion):同一克隆数量多 → 对应抗原存在
  • 共享克隆型:不同样本共有的克隆(可能识别相同抗原)

要点5:常见生物学发现

  • 肿瘤浸润T细胞(TIL)中存在高度克隆扩增(特异性识别肿瘤抗原)
  • 耗竭T细胞(Exhausted)具有高度扩增的特定克隆
  • COVID-19患者中,特定克隆的T细胞针对病毒肽段

实战代码

Scirpy 联合分析(Python)

import scirpy as ir       # pip install scirpy
import scanpy as sc
import pandas as pd
import matplotlib.pyplot as plt

# ============================================================
# 步骤1:加载 scRNA-seq 和 VDJ 数据
# ============================================================
# 加载已预处理的 scRNA-seq 数据
adata = sc.read_h5ad("preprocessed_T_cells.h5ad")

# 加载 CellRanger VDJ 输出(filtered_contig_annotations.csv)
# CellRanger VDJ 输出目录结构:
# vdj_t/
#   outs/
#     filtered_contig_annotations.csv   <- 关键文件
#     all_contig_annotations.csv

mdata = ir.io.read_10x_vdj("vdj_t/outs/filtered_contig_annotations.csv")

# ============================================================
# 步骤2:将 VDJ 数据整合到 scRNA-seq AnnData
# ============================================================
ir.pp.merge_with_ir(
    adata,
    mdata   # 将免疫组库信息添加到 adata.obs 中
)

# 检查合并结果
print(adata.obs.columns.tolist())   # 应该包含 IR_VJ_1_v_call, IR_VDJ_1_cdr3 等列
print(f"有TCR数据的细胞: {(~adata.obs['IR_VDJ_1_cdr3'].isna()).sum()}")

# ============================================================
# 步骤3:定义克隆型
# ============================================================
# 按CDR3序列定义克隆型(相同α+β链CDR3 = 同一克隆型)
ir.tl.chain_qc(adata)   # 质控:检查每个细胞有几条链

ir.pp.ir_dist(
    adata,
    metric="hamming",     # Hamming距离(允许N个碱基错误匹配)
    sequence="aa",        # 按氨基酸序列比较
    cutoff=0              # cutoff=0表示完全匹配才算同一克隆型
)

ir.tl.define_clonotypes(
    adata,
    receptor_arms="VDJ",    # 只用β链定义克隆型(更严格时用"all")
    dual_ir="any"           # 有双链时的处理策略
)

# 查看克隆型分布
clonotype_counts = adata.obs["clone_id"].value_counts()
print(f"总克隆型数: {clonotype_counts.nunique()}")
print(f"Top5 最大克隆型:\n{clonotype_counts.head()}")

# ============================================================
# 步骤4:克隆扩增分析
# ============================================================
# 计算克隆扩增(每个克隆型有多少细胞)
ir.tl.clonal_expansion(
    adata,
    target_col="clone_id"    # 克隆型ID列
)

# 在 UMAP 上展示克隆扩增
ir.pl.clonal_expansion(
    adata,
    groupby="cell_type",     # 按细胞类型分组展示
    show_nonexpanded=True,   # 也展示未扩增的克隆
    save="clonal_expansion.pdf"
)

# 克隆扩增 vs 细胞类型(堆叠柱状图)
ir.pl.group_abundance(
    adata,
    groupby="clone_id_size",  # 按克隆大小分组
    target_col="cell_type",    # 展示各细胞类型
    max_cols=5
)

# ============================================================
# 步骤5:克隆型多样性分析
# ============================================================
# 计算各样本的TCR多样性(Shannon熵)
ir.tl.alpha_diversity(
    adata,
    groupby="sample_id",      # 按样本计算多样性
    target_col="clone_id",    # 克隆型ID
    metric="normalized_shannon"  # 归一化Shannon熵(0-1)
)

ir.pl.alpha_diversity(
    adata,
    groupby="condition",    # 按疾病状态比较多样性
    target_col="clone_id"
)

使用 immunarch(R)分析TCR多样性

library(immunarch)   # 免疫组库分析(R)

# 加载 CellRanger VDJ 输出(也支持多种格式:MiXCR、IMGT等)
immdata <- repLoad("vdj_t/outs/")    # 自动识别格式

# 查看数据结构
names(immdata)   # $data(克隆型列表)+ $meta(元数据)

# ============================================================
# 克隆型丰度统计
# ============================================================
# 查看每个样本中Top克隆型占比
top_clones <- repTop(immdata$data, .head = 10)
vis(top_clones)    # 可视化Top克隆型

# ============================================================
# 多样性分析
# ============================================================
div_results <- repDiversity(
  .data = immdata$data,
  .method = "chao1"    # 或"shannon"、"inv.simp"
)
vis(div_results,
  .by = "condition",   # 按条件分组(在meta数据中定义)
  .meta = immdata$meta
)

# ============================================================
# V基因使用频率
# ============================================================
# 分析 V、D、J 基因的使用偏好
vdj_usage <- geneUsage(immdata$data, "hs.trbv", .norm = TRUE)  # TRBV基因(人类)
vis(vdj_usage, .by = "condition", .meta = immdata$meta)

# ============================================================
# 样本间共享克隆型分析
# ============================================================
# 分析不同样本之间有多少共同克隆型(公共免疫应答)
shared <- repOverlap(immdata$data, .method = "overlap")  # Overlap系数
vis(shared, .text.size = 1.5)   # 热图展示样本间共享程度

面试常问点

  1. 为什么克隆扩增可以指示抗原特异性? 遇到同源抗原后,T细胞大量增殖(克隆扩增),所以高度扩增的克隆型往往识别组织中的特定抗原
  2. CDR3区的V(D)J重组给抗原特异性带来了什么? V、D、J基因段的随机重组,加上junction的随机插入/删除,理论上可产生10^18种不同的TCR序列
  3. TCR-seq和全基因组BCR-seq的区别? TCR-seq不需要体细胞超突变(somatic hypermutation)分析,BCR还需要分析亲和力成熟过程

速查表

概念说明
Clonotype相同VDJ重排序列的细胞群(同一克隆)
CDR3互补决定区3,决定抗原特异性的关键区
Clonal expansion同一克隆型细胞数量多,说明受到抗原刺激增殖
Repertoire diversity多样性越高=越多不同抗原特异性的T细胞
Public clonotype多个供体共享的克隆型(识别常见抗原)