跳转至

肿瘤突变负荷(TMB)计算与解读

一句话概述:TMB 是肿瘤基因组中体细胞突变的总数(通常以 mut/Mb 为单位),是免疫治疗响应的重要预测标志物,TMB-H (≥10 mut/Mb) 的患者更可能从免疫检查点抑制剂中获益。


核心知识点速查表

概念白话解释
TMB肿瘤突变负荷 = 每百万碱基的突变数
TMB-HTMB高(≥10 mut/Mb),FDA批准的免疫治疗标志物
WES全外显子组测序,TMB的金标准计算方法
Panel靶向测序面板,临床常用(如F1CDx、MSK-IMPACT)
非同义突变改变蛋白质的突变(WES计算时只算这些)
新抗原突变产生的新蛋白片段,被免疫系统识别
ICB免疫检查点阻断治疗(如PD-1/PD-L1抑制剂)
bTMB血液TMB,从ctDNA计算

一、TMB 的原理(白话版)

比喻:肿瘤细胞就像"犯了很多错误的细胞"。错误越多(突变越多),细胞表面就会出现越多"不正常的标记"(新抗原)。免疫系统就像警察,标记越多越容易发现"坏人"。所以 TMB 高的肿瘤对免疫治疗响应好——因为免疫系统有更多"线索"来识别和杀灭肿瘤。


二、从 WES 计算 TMB

第 1 步:体细胞突变检测

# TMB计算的前提:准确的体细胞突变检测
# 标准流程:配对样本(肿瘤+正常)→ Mutect2

# 运行 Mutect2
gatk Mutect2 \
    -R reference.fa \                  # 参考基因组
    -I tumor.bam \                      # 肿瘤样本BAM
    -I normal.bam \                     # 正常样本BAM
    -normal normal_sample_name \        # 正常样本名
    --germline-resource af-only-gnomad.vcf.gz \  # gnomAD数据库
    --panel-of-normals pon.vcf.gz \     # 正常样本面板
    -O somatic_mutations.vcf.gz         # 输出体细胞突变

# 过滤突变
gatk FilterMutectCalls \
    -R reference.fa \
    -V somatic_mutations.vcf.gz \       # 原始突变
    -O filtered_mutations.vcf.gz        # 过滤后突变

# 只保留 PASS 的突变
bcftools view -f PASS \                  # 只保留PASS
    filtered_mutations.vcf.gz \
    > pass_mutations.vcf

第 2 步:计算 TMB

# ========== Python脚本:从VCF计算TMB ==========
import pysam                                          # VCF解析库

def calculate_tmb(vcf_file, exome_size_mb=35.0):
    """
    从过滤后的体细胞突变VCF计算TMB

    参数:
    vcf_file: 过滤后的VCF文件
    exome_size_mb: 外显子组有效区域大小(Mb)
    WES通常约35Mb(编码区域)
    """
    vcf = pysam.VariantFile(vcf_file)                 # 打开VCF

    total_mutations = 0                                # 总突变数
    nonsynonymous = 0                                  # 非同义突变数
    synonymous = 0                                     # 同义突变数

    for record in vcf:                                 # 遍历每个变异
        # 只计算SNV和小indel
        if record.filter.keys() == ['PASS']:           # 只看PASS的变异
            total_mutations += 1                       # 计数

            # 如果有功能注释信息(VEP/SnpEff)
            info = record.info
            if 'ANN' in info:                          # SnpEff注释
                ann = info['ANN'][0]
                if 'missense' in ann or 'nonsense' in ann:
                    nonsynonymous += 1
                elif 'synonymous' in ann:
                    synonymous += 1

    # TMB计算
    # 方法1:所有突变(Panel常用)
    tmb_all = total_mutations / exome_size_mb          # 所有突变/Mb

    # 方法2:只算非同义突变(WES经典方法)
    tmb_nonsyn = nonsynonymous / exome_size_mb         # 非同义突变/Mb

    print(f"总突变数: {total_mutations}")
    print(f"非同义突变: {nonsynonymous}")
    print(f"TMB (所有突变): {tmb_all:.1f} mut/Mb")
    print(f"TMB (仅非同义): {tmb_nonsyn:.1f} mut/Mb")

    # TMB分级
    if tmb_all >= 10:
        print("TMB分级: TMB-High (≥10 mut/Mb)")
        print("→ 可能从免疫检查点抑制剂获益")
    else:
        print("TMB分级: TMB-Low (<10 mut/Mb)")

    return tmb_all

# 运行
tmb = calculate_tmb("pass_mutations.vcf", exome_size_mb=35.0)

第 3 步:从 Panel 数据计算 TMB

# Panel(如F1CDx覆盖约1.1Mb)的TMB计算
# Panel TMB包含同义+非同义突变(提高小区域的灵敏度)

def calculate_panel_tmb(vcf_file, panel_size_mb):
    """Panel TMB计算"""
    import pysam
    vcf = pysam.VariantFile(vcf_file)

    mutation_count = 0
    for record in vcf:
        if record.filter.keys() == ['PASS']:
            # Panel TMB包含所有类型的非驱动突变
            # 排除:已知驱动突变、hotspot、germline
            # 排除:indel > 某个长度
            ref_len = len(record.ref)                  # ref长度
            alt_len = max(len(a) for a in record.alts)  # alt长度

            if abs(ref_len - alt_len) <= 20:           # 排除大indel
                mutation_count += 1

    tmb = mutation_count / panel_size_mb               # TMB = 突变数/面板大小
    print(f"Panel TMB: {tmb:.1f} mut/Mb")
    print(f"Panel大小: {panel_size_mb} Mb")
    print(f"突变数: {mutation_count}")
    return tmb

# FoundationOne CDx: panel_size_mb = 1.1
# MSK-IMPACT: panel_size_mb = 1.2 (468基因) 或 1.7 (505基因)

三、TMB 的临床应用

TMB 与免疫治疗

# FDA 批准的 TMB 相关适应症:
# 
# Pembrolizumab (Keytruda):
#   - 适用于 TMB-H (≥10 mut/Mb) 的实体瘤
#   - 2020年FDA批准
#   - 需要经 FDA 批准的伴随诊断检测
#
# 检测方法要求:
#   - FoundationOne CDx (F1CDx) — FDA批准的伴随诊断
#   - 其他Panel需要与F1CDx做比对验证

# TMB 阈值参考:
# FDA: ≥10 mut/Mb (F1CDx)
# NCCN NSCLC: ≥10 mut/Mb
# 学术研究常用: ≥17 mut/Mb (区分MSI-H/MSS)
# bTMB (血液): ≥16-20 mut/Mb (因Panel不同而异)

TMB 与 MSI 的关系

# TMB 和 MSI 的关系:
# MSI-H 肿瘤通常 TMB 也高(因为MMR缺陷导致大量突变)
# 但 TMB-H ≠ MSI-H(有些TMB高是其他原因,如POLE突变)
# 
# Venn 图关系:
# MSI-H 几乎都是 TMB-H
# TMB-H 中只有一部分是 MSI-H
# 两者结合使用可以更精确地预测免疫治疗响应

四、常见报错与注意事项

问题说明解决方法
Panel TMB 与 WES TMB 不一致Panel覆盖区域小,变异性大Panel ≥1Mb才可靠,用校准系数
低纯度肿瘤 TMB 偏低正常细胞稀释了突变信号肿瘤纯度校正或提高测序深度
germline 变异未过滤胚系变异被当成体细胞突变配对正常样本或用gnomAD过滤
不同Panel不可比覆盖区域和计算方法不同使用统一标准(如TMB Harmonization Project)
TMB-H 但免疫治疗无效TMB不是完美预测指标结合PD-L1、MSI、TILs等综合评估

五、面试高频问题

Q1:TMB 怎么计算?

TMB = 体细胞突变数 / 测序覆盖区域大小(Mb)。WES 通常只算非同义突变,有效区域约 35Mb。Panel 通常算所有突变(包括同义),面板大小约 1~2Mb。

Q2:TMB-H 为什么预测免疫治疗响应?

TMB高 → 产生更多新抗原 → 肿瘤细胞表面展示更多"异常标记" → 免疫系统更容易识别 → 免疫检查点抑制剂(解除免疫刹车)效果更好。

Q3:TMB 的局限性?

(1) 不是所有 TMB-H 患者都响应免疫治疗(假阳性);(2) 部分 TMB-L 患者也可能响应;(3) 不同检测平台和计算方法的 TMB 可比性差;(4) 不考虑新抗原的免疫原性质量。


六、速查表

# === TMB 计算速查 ===

# 1. 体细胞突变检测
gatk Mutect2 -R ref.fa -I tumor.bam -I normal.bam -normal N -O somatic.vcf.gz
gatk FilterMutectCalls -R ref.fa -V somatic.vcf.gz -O filtered.vcf.gz

# 2. TMB 计算
# WES: TMB = 非同义突变数 / 35 Mb
# Panel: TMB = 所有突变数 / Panel大小(Mb)

# 3. TMB 阈值
# TMB-H: ≥10 mut/Mb (FDA/F1CDx)
# 研究常用: ≥17 mut/Mb

# 4. 相关工具
# TMBcalc — 自动化TMB计算pipeline
# maftools (R包) — 从MAF文件计算TMB
# TMB计算公式: TMB = (total_mutations) / (panel_size_Mb)

参考资料:FDA Keytruda TMB-H适应症 2020、TMBcalc (Privitera et al. 2024, Frontiers in Genetics)、NCCN NSCLC Guidelines 2024