跳转至

625_单细胞TCR_BCR分析

一句话概述: 单细胞TCR/BCR分析通过测量每个T/B细胞的抗原受体序列来追踪免疫细胞的克隆扩增和多样性,scRepertoire 2是2025年发布的最新R包,整合了Seurat/Bioconductor生态实现从VDJ数据到克隆动力学的全链路分析。

核心知识点速查表

概念白话解释
TCRT细胞受体——T细胞表面识别抗原的蛋白,由α链和β链组成
BCRB细胞受体——B细胞表面识别抗原的蛋白(即免疫球蛋白)
CDR3互补决定区3——TCR/BCR中变异最大的区域,决定抗原特异性
Clonotype克隆型——拥有相同TCR/BCR序列的一组细胞
Clonal expansion克隆扩增——识别抗原后某个克隆型的细胞大量增殖
V(D)J recombinationV(D)J重组——产生TCR/BCR多样性的基因重排机制
Repertoire免疫组库——一个个体所有T/B细胞受体序列的集合
scRepertoire单细胞免疫组库分析R包(2025年v2发布)
Diversity index多样性指数——衡量免疫组库丰富程度的指标

一、安装

# === scRepertoire 2安装(2025年发布)===
if (!require("BiocManager")) install.packages("BiocManager")
BiocManager::install("scRepertoire")  # 从Bioconductor安装

# === 依赖包 ===
BiocManager::install("Seurat")       # 单细胞分析核心包
install.packages("ggplot2")          # 可视化
install.packages("viridis")          # 配色方案

library(scRepertoire)  # 加载scRepertoire
library(Seurat)        # 加载Seurat
library(ggplot2)       # 加载ggplot2

二、数据输入与处理

2.1 读取10x VDJ数据

# === 读取10x Genomics Cell Ranger VDJ输出 ===
# Cell Ranger输出路径中有filtered_contig_annotations.csv

# 单个样本读取
tcr_sample1 <- read.csv(
    "sample1/outs/filtered_contig_annotations.csv"  # 10x VDJ输出
)

# 多个样本批量读取
contig_list <- list(
    S1 = read.csv("sample1/outs/filtered_contig_annotations.csv"),
    S2 = read.csv("sample2/outs/filtered_contig_annotations.csv"),
    S3 = read.csv("sample3/outs/filtered_contig_annotations.csv"),
    S4 = read.csv("sample4/outs/filtered_contig_annotations.csv")
)

# === 使用combineTCR整合TCR数据 ===
combined_tcr <- combineTCR(
    contig_list,                   # 输入contig列表
    samples = c("S1", "S2", "S3", "S4"),  # 样本名
    removeNA = TRUE,               # 移除NA值
    removeMulti = TRUE             # 移除有多条链的细胞(多重比对)
)

# 查看整合后的数据结构
str(combined_tcr[[1]])  # 第一个样本的结构
head(combined_tcr[[1]])  # 前几行

2.2 读取BCR数据

# === 使用combineBCR整合BCR数据 ===
bcr_contigs <- list(
    S1 = read.csv("bcr_sample1/filtered_contig_annotations.csv"),
    S2 = read.csv("bcr_sample2/filtered_contig_annotations.csv")
)

combined_bcr <- combineBCR(
    bcr_contigs,                   # 输入BCR contig列表
    samples = c("S1", "S2"),       # 样本名
    removeNA = TRUE,               # 移除NA
    removeMulti = TRUE             # 移除多条链
)

# BCR特有:可以分析体细胞超突变(SHM)
# SHM反映B细胞亲和力成熟的程度

2.3 支持的输入格式

# scRepertoire 2支持多种输入:
# 1. 10x Genomics Cell Ranger VDJ — filtered_contig_annotations.csv
# 2. AIRR格式 — airr_rearrangement.tsv(标准化格式)
# 3. BD Rhapsody — Dominant_Contigs.csv
# 4. Omniscope(原TRUST4)— barcode_report.tsv
# 5. WAT3R — filtered_contig_annotations.csv
# 6. MIXCR — clonotypes.tsv
# 7. Dandelion(Python)— filtered_contig_dandelion.tsv

# AIRR格式示例(行业标准):
# read.csv("airr_output.tsv", sep="\t") 然后用combineTCR

三、克隆型分析

3.1 克隆型频率可视化

# === 克隆型丰度分布 ===
clonalQuant(
    combined_tcr,                  # 输入TCR数据
    cloneCall = "aa",              # 按氨基酸序列定义克隆型
    chain = "both",                # 使用双链(alpha+beta)
    scale = TRUE,                  # 按样本大小缩放
    exportTable = FALSE            # 不导出表格
) + 
    theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
    labs(title = "Clonotype Abundance")

# cloneCall选项:
# "gene"    — 按V-J基因组合定义克隆型
# "nt"      — 按核苷酸CDR3序列
# "aa"      — 按氨基酸CDR3序列(推荐)
# "strict"  — 按完整V-D-J基因+CDR3核苷酸

3.2 克隆型比例分布

# === 克隆型大小分布 ===
clonalAbundance(
    combined_tcr,
    cloneCall = "aa",              # 按氨基酸序列
    chain = "both",                # 双链
    scale = FALSE                  # 不缩放(显示原始数量)
)

# === 克隆型比例(Homeostasis)===
clonalHomeostasis(
    combined_tcr,
    cloneCall = "aa",
    chain = "both",
    cloneSize = c(Rare = 1e-4,          # 稀有克隆
                  Small = 0.001,         # 小克隆
                  Medium = 0.01,         # 中等克隆
                  Large = 0.1,           # 大克隆
                  Hyperexpanded = 1)     # 超扩增克隆
)

3.3 克隆型重叠分析

# === 样本间克隆型重叠 ===
clonalOverlap(
    combined_tcr,
    cloneCall = "aa",              # 按氨基酸序列
    chain = "both",                # 双链
    method = "morisita"            # 重叠指数方法
) +
    labs(title = "Clonotype Overlap Between Samples")

# method选项:
# "overlap"   — 简单重叠系数
# "morisita"  — Morisita指数(推荐,考虑丰度)
# "jaccard"   — Jaccard指数(只看有无)
# "cosine"    — 余弦相似度
# "raw"       — 原始共享克隆数

四、多样性分析

4.1 克隆多样性指数

# === 计算多样性指数 ===
clonalDiversity(
    combined_tcr,
    cloneCall = "aa",              # 按氨基酸序列
    chain = "both",                # 双链
    metrics = c("shannon",         # Shannon多样性
                "simpson",         # Simpson多样性
                "chao1",           # Chao1丰富度估计
                "inv.simpson"),    # 逆Simpson
    group.by = "sample",           # 按样本分组
    n.boots = 100                  # 100次自举法
)

# 解读:
# Shannon越高 → 克隆型越多样(没有单个克隆型占主导)
# Simpson越高 → 越均匀
# 感染/肿瘤后通常Shannon降低(某些克隆大量扩增)

4.2 Rarefaction曲线

# === 克隆型稀释曲线 ===
clonalRarefaction(
    combined_tcr,
    cloneCall = "aa",              # 克隆定义
    chain = "both",                # 双链
    plot.type = "curve",           # 曲线类型
    n.boots = 3                    # 自举次数
) +
    labs(title = "Clonotype Rarefaction Curve",
         x = "Number of Cells",
         y = "Number of Unique Clonotypes")

# 曲线趋平 → 测序深度足够
# 曲线仍在上升 → 需要更多细胞

五、与Seurat整合分析

5.1 将TCR信息添加到Seurat对象

# === 已有Seurat对象(来自GEX数据)===
# seurat_obj <- readRDS("seurat_processed.rds")

# === 将TCR信息合并到Seurat对象 ===
seurat_obj <- combineExpression(
    combined_tcr,                  # TCR数据
    seurat_obj,                    # Seurat对象
    cloneCall = "aa",              # 克隆型定义
    chain = "both",                # 双链
    proportion = TRUE,             # 计算比例
    cloneSize = c(Single = 1,           # 单个细胞的克隆
                  Small = 5,            # 2-5个细胞的克隆
                  Medium = 20,          # 6-20个细胞的克隆
                  Large = 100,          # 21-100个细胞
                  Hyperexpanded = 500)  # >100个细胞
)

# 查看添加的元数据
head(seurat_obj@meta.data[, c("CTaa", "cloneSize", "Frequency")])

5.2 在UMAP上可视化克隆信息

# === UMAP上着色显示克隆大小 ===
DimPlot(seurat_obj, 
        group.by = "cloneSize",       # 按克隆大小分组
        order = c("Hyperexpanded", "Large", "Medium", "Small", "Single"),
        pt.size = 0.5) +
    scale_color_manual(values = c(
        "Hyperexpanded" = "#FF0000",   # 红色
        "Large" = "#FF6600",           # 橙色
        "Medium" = "#FFCC00",          # 黄色
        "Small" = "#66CC00",           # 绿色
        "Single" = "#CCCCCC"           # 灰色
    )) +
    labs(title = "Clonal Expansion on UMAP")

ggsave("clonal_expansion_umap.pdf", width = 10, height = 8)

# === 按细胞类型看克隆扩增 ===
occupiedscRepertoire(
    seurat_obj,
    x.axis = "cell_type",             # x轴:细胞类型
    label = FALSE                      # 不显示标签
) +
    theme(axis.text.x = element_text(angle = 45, hjust = 1))

5.3 克隆型与基因表达关联

# === 找扩增克隆特有的差异基因 ===
# 比较大克隆vs小克隆的基因表达差异
Idents(seurat_obj) <- "cloneSize"  # 设置分组标识

expanded_markers <- FindMarkers(
    seurat_obj,
    ident.1 = c("Hyperexpanded", "Large"),  # 扩增克隆
    ident.2 = "Single",                      # 单细胞克隆
    min.pct = 0.1,                           # 至少10%细胞表达
    logfc.threshold = 0.25                   # log2FC阈值
)

# 查看top差异基因
head(expanded_markers[order(expanded_markers$p_val_adj), ], 20)

# === 可视化特定克隆型的基因表达 ===
# 找到最大的克隆型
top_clones <- names(sort(table(seurat_obj$CTaa), decreasing = TRUE))[1:5]
cat("Top 5 克隆型:\n")
print(top_clones)

六、高级分析

6.1 基因使用分析

# === V基因使用频率 ===
vizGenes(
    combined_tcr,
    x = "TRBV",                    # x轴:TRB的V基因
    y = NULL,                      # 不分组
    plot = "bar",                  # 柱状图
    chain = "TRB",                 # TRB链
    scale = TRUE                   # 缩放
) +
    theme(axis.text.x = element_text(angle = 90, hjust = 1, size = 6))

# === V-J基因配对使用 ===
vizGenes(
    combined_tcr,
    x = "TRBV",                    # V基因
    y = "TRBJ",                    # J基因
    plot = "heatmap",              # 热图
    chain = "TRB",                 # TRB链
    scale = TRUE                   # 缩放
)

6.2 CDR3序列特征分析

# === CDR3长度分布 ===
clonalLength(
    combined_tcr,
    cloneCall = "aa",              # 氨基酸序列
    chain = "TRB"                  # TRB链
) +
    labs(title = "CDR3 Length Distribution")

# CDR3长度解读:
# TCR CDR3通常12-16个氨基酸
# 过短或过长可能是异常重排
# 不同疾病可能偏好不同CDR3长度

七、常见报错与解决

报错信息原因解决方案
No clonotypes detectedVDJ数据质量差或路径错误检查Cell Ranger输出是否正常
Barcode mismatchGEX和VDJ的barcode不匹配确认来自同一样本的GEM well
Multiple chains per cell一个细胞有多条同类型链removeMulti=TRUE过滤
Low VDJ recoveryVDJ捕获效率低检查文库质量和测序深度
NA in clonotype部分细胞没有完整的V(D)J注释removeNA=TRUE过滤
combineExpression barcode errorSeurat和TCR的barcode格式不一致统一barcode后缀(-1等)

八、面试高频题

Q1:什么是克隆型(clonotype),怎么定义?

答: 克隆型是一组拥有相同TCR/BCR序列的细胞——它们都来自同一个前体细胞。定义克隆型有多种粒度:(1) 按CDR3氨基酸序列——最常用,因为功能相同的TCR可能有不同的核苷酸序列;(2) 按CDR3核苷酸序列——更严格,能区分趋同进化;(3) 按完整V-D-J基因+CDR3——最严格;(4) 按V-J基因组合——最宽松。一般推荐用CDR3氨基酸序列(双链)定义,兼顾灵敏度和特异性。

Q2:克隆扩增在免疫应答中意味着什么?

答: 克隆扩增意味着某些T/B细胞识别了特定抗原后大量增殖。在肿瘤中,大量扩增的CD8+ T细胞克隆可能是肿瘤特异性T细胞(能杀肿瘤的"好兵");在自身免疫病中,扩增的克隆可能是攻击自身组织的"叛军";在感染中,扩增的克隆是对抗病原体的主力军。通过分析克隆扩增,我们可以:(1) 找到肿瘤新抗原特异性T细胞;(2) 评估免疫治疗的效果(治疗后是否有新克隆扩增);(3) 追踪感染过程中免疫应答的动态变化。

Q3:单细胞TCR/BCR分析相比传统Bulk免疫组库有什么优势?

答: Bulk免疫组库(Bulk TCR-seq)只给出TCR序列列表,不知道每条TCR属于什么类型的细胞。单细胞TCR/BCR分析同时测量每个细胞的TCR/BCR序列和基因表达(通过GEX),可以:(1) 知道扩增的克隆是什么细胞类型(CD4+? CD8+? Treg? Teff?);(2) 分析克隆扩增与细胞功能状态的关系(是否耗竭?是否活化?);(3) 追踪同一克隆在不同细胞状态间的转换。缺点是成本高、细胞通量相对低(通常几千到几万个细胞)。

Q4:scRepertoire分析的基本流程是什么?

答: 四步流程:(1) 用combineTCR/combineBCR读取10x Cell Ranger VDJ输出,整合多样本数据;(2) 克隆型分析——统计克隆型频率分布、大小分布、样本间重叠度;(3) 多样性分析——计算Shannon、Simpson等多样性指数,画稀释曲线;(4) 与Seurat整合——用combineExpression将TCR信息添加到GEX的Seurat对象中,在UMAP上可视化克隆扩增,分析扩增克隆的基因表达特征。关键是第4步的整合——把"这个T细胞的受体是什么"和"这个T细胞表达了什么基因"关联起来。


参考资料:scRepertoire 2: Borcherding et al., F1000Research 2025 | 10x Genomics VDJ: 10xgenomics.com | AIRR标准: Rubelt et al., Nat Immunol 2017 | Seurat: Hao et al., Cell 2024