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 |
| Scirpy | TCR/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) # 热图展示样本间共享程度
面试常问点
- 为什么克隆扩增可以指示抗原特异性? 遇到同源抗原后,T细胞大量增殖(克隆扩增),所以高度扩增的克隆型往往识别组织中的特定抗原
- CDR3区的V(D)J重组给抗原特异性带来了什么? V、D、J基因段的随机重组,加上junction的随机插入/删除,理论上可产生10^18种不同的TCR序列
- TCR-seq和全基因组BCR-seq的区别? TCR-seq不需要体细胞超突变(somatic hypermutation)分析,BCR还需要分析亲和力成熟过程
速查表
| 概念 | 说明 |
|---|
| Clonotype | 相同VDJ重排序列的细胞群(同一克隆) |
| CDR3 | 互补决定区3,决定抗原特异性的关键区 |
| Clonal expansion | 同一克隆型细胞数量多,说明受到抗原刺激增殖 |
| Repertoire diversity | 多样性越高=越多不同抗原特异性的T细胞 |
| Public clonotype | 多个供体共享的克隆型(识别常见抗原) |