跳转至

149_肿瘤突变签名分析

一句话概述

肿瘤突变签名(Mutational Signatures)是不同突变过程在基因组中留下的特征性突变模式指纹,通过COSMIC数据库中的SBS/DBS/ID签名分类和MutationalPatterns/SigProfiler等工具提取,可揭示肿瘤的病因学和DNA修复缺陷。


核心知识点总览

知识点说明
突变签名定义突变过程在基因组中产生的特征性突变组合模式
SBS签名单碱基替换签名,96种三核苷酸上下文(6类替换×16种侧翼)
DBS签名双碱基替换签名,78种类别
ID签名小插入缺失签名,83种类别
COSMIC数据库收录已知突变签名的权威数据库(v3.4, 2023)
NMF分解非负矩阵分解,从突变计数矩阵提取签名的核心算法
MutationalPatternsR/Bioconductor包,突变谱分析和签名提取
SigProfilerPython/MATLAB套件,签名提取和归因的金标准工具
签名归因将已知签名拟合到样本,确定每个签名的贡献度
临床应用HRD检测、免疫治疗响应预测、致癌因素溯源

各步骤详解

第一步:理解突变签名的生物学基础

白话解释: 不同的"坏事"会在DNA上留下不同的"指纹"。紫外线喜欢把C>T这个变化留在CC或TC位置上;吸烟喜欢把C>A变化留下来;DNA修复系统出了问题,也会有自己独特的变化模式。这些"指纹"就是突变签名。

技术原理: - SBS(Single Base Substitution):6种碱基替换类型(C>A, C>G, C>T, T>A, T>C, T>G),考虑5'和3'侧翼碱基各4种可能,得到 6×16=96 种突变类型 - DBS(Doublet Base Substitution):相邻两个碱基同时发生替换,78种类型 - ID(Insertion/Deletion):小插入缺失,按长度、重复序列上下文等分为83种类型 - COSMIC SBS签名示例: - SBS1: 自发脱氨(5mC→T),与年龄相关(时钟签名) - SBS2/13: APOBEC酶活性 - SBS4: 烟草致癌物(苯并芘等) - SBS6/14/15/20/21/26: DNA错配修复(MMR)缺陷 - SBS3: 同源重组修复(HR)缺陷(BRCA1/2突变) - SBS7a/b: 紫外线(UV)暴露 - SBS22: 马兜铃酸暴露

代码示例:构建96类突变矩阵概念

# 96种SBS突变类型构成
substitutions <- c("C>A", "C>G", "C>T", "T>A", "T>C", "T>G")
flanking_5 <- c("A", "C", "G", "T")
flanking_3 <- c("A", "C", "G", "T")

# 生成96种三核苷酸上下文
contexts <- expand.grid(
  sub = substitutions,
  f5 = flanking_5,
  f3 = flanking_3
)
contexts$label <- paste0(contexts$f5, "[", contexts$sub, "]", contexts$f3)
cat("Total mutation types:", nrow(contexts), "\n")  # 96


第二步:VCF数据预处理与突变谱构建

白话解释: 分析前需要把变异检测结果(VCF文件)转换成96类突变的计数表格。就像把所有犯罪现场的"指纹"按类型分类统计。

技术原理: 1. 从VCF中提取体细胞突变(somatic mutations) 2. 获取突变位置的三核苷酸上下文(需要参考基因组) 3. 将突变分配到96种SBS类型中 4. 构建突变计数矩阵:96种类型 × N个样本

代码示例:使用MutationalPatterns

library(MutationalPatterns)
library(BSgenome.Hsapiens.UCSC.hg38)

# 1. 加载VCF文件
vcf_files <- list.files("vcf_dir/", pattern = "*.vcf$", full.names = TRUE)
sample_names <- gsub(".vcf", "", basename(vcf_files))

# 读取VCF (GRanges格式)
grl <- read_vcfs_as_granges(
  vcf_files = vcf_files,
  sample_names = sample_names,
  genome = "hg38"
)

# 2. 获取突变类型和三核苷酸上下文
ref_genome <- "BSgenome.Hsapiens.UCSC.hg38"
muts <- get_mut_type(grl, type = "snv")

# 3. 构建96类突变计数矩阵
mut_matrix <- mut_matrix(vcf_list = grl, ref_genome = ref_genome)
dim(mut_matrix)  # 96 × N(样本数)

# 4. 可视化突变谱
plot_96_profile(mut_matrix[, 1:4])  # 显示前4个样本的突变谱

# 5. 突变谱热图
plot_contribution_heatmap(mut_matrix, cluster_samples = TRUE)


第三步:使用SigProfiler提取突变签名

白话解释: SigProfiler是Alexandrov团队开发的"金标准"签名提取工具,COSMIC数据库的签名就是用它提取的。它通过NMF算法从大量样本中找到反复出现的突变模式。

技术原理: - 基于非负矩阵分解(NMF):V ≈ W × H - V:96×N 突变计数矩阵 - W:96×K 签名矩阵(K个签名) - H:K×N 暴露矩阵(各签名在各样本的贡献) - SigProfilerExtractor 自动确定最佳签名数K - 使用多种评估指标:重构误差、稳定性、平均余弦相似度

代码示例:

# 安装: pip install SigProfilerExtractor SigProfilerMatrixGenerator

# === Step 1: 生成突变矩阵 ===
from SigProfilerMatrixGenerator.scripts import SigProfilerMatrixGeneratorFunc as matGen

# 从VCF生成突变矩阵
matrices = matGen.SigProfilerMatrixGeneratorFunc(
    project="my_project",
    genome="GRCh38",
    vcfpath="path/to/vcf_folder/",  # VCF文件所在目录
    plot=True,
    exome=False  # True用于外显子组数据
)

# === Step 2: 提取突变签名 ===
from SigProfilerExtractor import sigpro as sig

sig.sigProfilerExtractor(
    input_type="matrix",
    output="sig_output/",
    input_data="path/to/my_project/output/SBS/my_project.SBS96.all",
    reference_genome="GRCh38",
    minimum_signatures=1,
    maximum_signatures=10,    # 搜索1-10个签名
    nmf_replicates=100,       # NMF重复次数
    cpu=-1,                   # 使用所有CPU
    gpu=False
)

# === Step 3: 查看结果 ===
# 结果目录结构:
# sig_output/
#   SBS96/
#     Suggested_Solution/
#       SBS96_De-Novo_Solution/
#         Signatures/          - 提取的签名
#         Activities/          - 各样本的签名贡献
#       COSMIC_SBS96_Decomposed_Solution/
#         Signatures/          - 分解到COSMIC签名
#         Activities/          - COSMIC签名贡献


第四步:使用MutationalPatterns进行签名提取与归因

白话解释: MutationalPatterns是R生态中最常用的签名分析包。可以做两件事:(1) 从数据中"发现"新签名(de novo提取);(2) 把已知签名"对号入座"到你的样本中(签名归因/拟合)。

代码示例:

library(MutationalPatterns)

# === De novo签名提取(NMF) ===
# 估计最优签名数
estimate <- estimate_rank(
  mut_matrix = mut_matrix,
  rank_range = 2:8,
  nrun = 50
)

# 可视化选择最优K
plot(estimate)  # 看cophenetic/silhouette指标

# 提取签名 (假设选择K=4)
nmf_res <- extract_signatures(
  mut_matrix = mut_matrix,
  rank = 4,
  nrun = 100
)

# 签名矩阵和贡献矩阵
signatures <- nmf_res$signatures
contributions <- nmf_res$contribution

# 可视化提取的签名
plot_96_profile(signatures)

# === 与COSMIC签名比对 ===
# 加载COSMIC签名
cosmic_sbs <- get_known_signatures(muttype = "snv", source = "COSMIC_v3.3")

# 计算余弦相似度
sim_matrix <- cos_sim_matrix(signatures, cosmic_sbs)
plot_cosine_heatmap(sim_matrix, cluster_rows = TRUE)

# === 签名归因(Fitting): 将COSMIC签名拟合到样本 ===
# 严格拟合
fit_res <- fit_to_signatures(
  mut_matrix = mut_matrix,
  signatures = cosmic_sbs
)

# 查看各签名贡献
contributions_cosmic <- fit_res$contribution
plot_contribution(contributions_cosmic, coord_flip = TRUE, mode = "absolute")
plot_contribution(contributions_cosmic, coord_flip = TRUE, mode = "relative")

# === 严格归因(减少过拟合) ===
# 使用strict拟合, 移除贡献极小的签名
strict_res <- fit_to_signatures_strict(
  mut_matrix = mut_matrix,
  signatures = cosmic_sbs,
  max_delta = 0.004  # 余弦相似度下降阈值
)
plot_contribution(strict_res$fit_res$contribution, mode = "relative")


第五步:DBS和ID签名分析

白话解释: 除了单碱基替换(SBS),双碱基替换(DBS)和插入缺失(ID)也有自己的签名。比如铂类化疗药喜欢造成特定的双碱基变化,MMR缺陷会在微卫星区域产生特定的插入缺失。

代码示例:

# === DBS签名 ===
# 获取DBS突变矩阵
dbs_contexts <- get_dbs_context(grl)
dbs_matrix <- count_dbs_contexts(dbs_contexts)

# 可视化DBS谱
plot_dbs_contexts(dbs_matrix[, 1:4])

# 拟合COSMIC DBS签名
cosmic_dbs <- get_known_signatures(muttype = "dbs", source = "COSMIC_v3.3")
dbs_fit <- fit_to_signatures(dbs_matrix, cosmic_dbs)
plot_contribution(dbs_fit$contribution, mode = "relative")

# === ID签名 ===
# 获取Indel突变矩阵
indel_contexts <- get_indel_context(grl, ref_genome = ref_genome)
indel_matrix <- count_indel_contexts(indel_contexts)

# 可视化ID谱
plot_indel_contexts(indel_matrix[, 1:4])

# 拟合COSMIC ID签名
cosmic_id <- get_known_signatures(muttype = "indel", source = "COSMIC_v3.3")
id_fit <- fit_to_signatures(indel_matrix, cosmic_id)
plot_contribution(id_fit$contribution, mode = "relative")


第六步:临床应用——HRD和MMR检测

白话解释: 突变签名最重要的临床应用之一是判断肿瘤的DNA修复能力。HRD(同源重组缺陷)的患者对PARP抑制剂敏感,MMR缺陷的患者对免疫治疗响应好。

代码示例:

# === HRD检测 ===
# SBS3 是 HRD 的标志性签名 (BRCA1/2突变相关)
# 结合ID6 (NHEJ修复留下的微同源介导删除)

# 计算SBS3贡献比例
sbs3_fraction <- contributions_cosmic["SBS3", ] / colSums(contributions_cosmic)

# HRD评分综合
# 通常结合3个基因组瘢痕指标:
# LOH (Loss of Heterozygosity)
# TAI (Telomeric Allelic Imbalance)
# LST (Large-Scale State Transitions)

# 使用scarHRD包
# BiocManager::install("sztup/scarHRD")
library(scarHRD)
# 输入: 从Sequenza或ASCAT得到的等位基因特异拷贝数
hrd_result <- scar_score(
  seg_file = "sample.sequenza.segments.txt",
  reference = "grch38",
  seqz = TRUE
)
# 输出: HRD-LOH, LST, TAI, 以及总HRD score

# === MMR缺陷检测 ===
# MMR缺陷相关签名: SBS6, SBS14, SBS15, SBS20, SBS21, SBS26, SBS44
# ID签名: ID1, ID2 (微卫星不稳定相关)
mmr_sigs <- c("SBS6", "SBS14", "SBS15", "SBS20", "SBS21", "SBS26", "SBS44")
mmr_contribution <- colSums(contributions_cosmic[mmr_sigs, , drop = FALSE])
mmr_fraction <- mmr_contribution / colSums(contributions_cosmic)

# 临床判定标准 (简化版)
classify_mmr <- function(mmr_frac, tmb) {
  # TMB: tumor mutation burden (mutations/Mb)
  if (tmb > 10 & mmr_frac > 0.15) return("dMMR/MSI-H")
  else return("pMMR/MSS")
}


第七步:突变签名的时间演化分析

白话解释: 肿瘤不是一成不变的。通过对比原发灶和转移灶,或治疗前后的样本,可以追踪突变签名的变化——看看哪些突变过程在加强、哪些在减弱。

代码示例:

# 签名贡献的时间变化
# 比较配对样本(如原发vs转移)
library(ggplot2)

# 假设有配对数据
primary_contrib <- contributions_cosmic[, grep("Primary", colnames(contributions_cosmic))]
metastasis_contrib <- contributions_cosmic[, grep("Metastasis", colnames(contributions_cosmic))]

# 计算各签名的变化
delta_sigs <- rowMeans(metastasis_contrib) - rowMeans(primary_contrib)
delta_df <- data.frame(
  Signature = names(delta_sigs),
  Delta = delta_sigs
)

ggplot(delta_df, aes(x = reorder(Signature, Delta), y = Delta)) +
  geom_bar(stat = "identity", fill = ifelse(delta_df$Delta > 0, "red", "blue")) +
  coord_flip() +
  labs(x = "COSMIC Signature", y = "Change (Metastasis - Primary)",
       title = "Mutational Signature Changes") +
  theme_minimal()


实战命令

# === SigProfiler 安装 ===
pip install SigProfilerExtractor SigProfilerMatrixGenerator SigProfilerAssignment
# 安装参考基因组
python -c "from SigProfilerMatrixGenerator import install as genInstall; genInstall.install('GRCh38')"

# === 从VCF生成突变矩阵 ===
python -c "
from SigProfilerMatrixGenerator.scripts import SigProfilerMatrixGeneratorFunc as matGen
matGen.SigProfilerMatrixGeneratorFunc('project', 'GRCh38', 'vcf_dir/', plot=True)
"

# === 签名提取 ===
python -c "
from SigProfilerExtractor import sigpro as sig
sig.sigProfilerExtractor('matrix', 'output/', 'project/output/SBS/project.SBS96.all',
  reference_genome='GRCh38', minimum_signatures=1, maximum_signatures=15, nmf_replicates=100)
"

# === 签名归因(Assignment) ===
python -c "
from SigProfilerAssignment import Analyzer as Analyze
Analyze.cosmic_fit(samples='project/output/SBS/project.SBS96.all',
  output='assignment_output/', genome_build='GRCh38')
"

# === R环境: MutationalPatterns ===
Rscript -e '
BiocManager::install("MutationalPatterns")
BiocManager::install("BSgenome.Hsapiens.UCSC.hg38")
'

面试常问点

Q1:什么是突变签名?SBS96矩阵是如何构成的?

A: 突变签名是不同突变过程在基因组中留下的特征性突变模式。SBS96矩阵由6种碱基替换类型(C>A, C>G, C>T, T>A, T>C, T>G)在16种三核苷酸上下文(5'侧翼4种 × 3'侧翼4种)中的组合构成,共6×16=96个突变类别。注意只考虑嘧啶为参考碱基(C或T)的6种替换,因为互补链上的G>T等同于C>A。

Q2:NMF在签名提取中是怎么工作的?

A: NMF将突变计数矩阵V(96×N)分解为两个非负矩阵的乘积:V ≈ W(96×K) × H(K×N)。W的每一列是一个突变签名(96维向量),H的每一行是该签名在各样本中的"暴露"(活性)。K是签名个数,通过多次运行不同K值,用cophenetic相关系数和残差等指标确定最优K。非负性约束使结果可解释。

Q3:签名提取(extraction)和签名归因(assignment/fitting)有什么区别?

A: 提取是从数据中"发现"新签名(de novo),使用NMF等方法;归因是将已知签名(如COSMIC参考)拟合到样本数据,确定每个已知签名的贡献度。实践中建议两步走:先尝试de novo提取看数据中有哪些模式,然后做归因到COSMIC签名进行生物学解释。

Q4:为什么WGS比WES更适合做签名分析?

A: 签名分析依赖充足的突变数量。WGS覆盖全基因组(~3Gb),能检测到更多突变(通常数千到数十万),NMF分解更稳定。WES仅覆盖外显子(~50Mb,约1.5%),突变数量少(通常几十到几百),信噪比低。对于突变负荷低的肿瘤(如前列腺癌),WES几乎无法进行可靠的签名提取,但高TMB肿瘤(如黑色素瘤)的WES数据仍可分析。

Q5:COSMIC v3中有哪些重要的临床相关签名?

A: (1) SBS3 + ID6: HRD/BRCA缺陷,PARP抑制剂敏感标志;(2) SBS6/14/15/20/21/26/44 + ID1/2: MMR缺陷/MSI,免疫治疗响应标志;(3) SBS4: 吸烟暴露(肺癌病因);(4) SBS7a/b: UV暴露(皮肤癌病因);(5) SBS22: 马兜铃酸暴露(肝癌/泌尿系统肿瘤);(6) SBS11: 替莫唑胺治疗后;(7) SBS31/35: 铂类化疗后。

Q6:样本量少时如何做签名分析?

A: 样本少时de novo提取不可靠(NMF需要足够多样本)。建议:(1) 使用签名归因(fitting)将COSMIC签名拟合到每个样本,而非提取;(2) 使用SigProfilerAssignment进行逐样本归因;(3) 使用deconstructSigs或MutationalPatterns的fit_to_signatures_strict进行严格拟合;(4) 结合bootstrapping评估归因置信度。


易错点

1. 未过滤germline变异

错误: 将体细胞+胚系变异混合分析。 正确做法: 必须使用配对(tumor-normal)变异检测(Mutect2等)去除胚系变异。胚系变异会引入SBS1/SBS5等时钟签名的假性增高。

2. VCF染色体命名不一致

错误: VCF使用"1,2,3..."但参考基因组使用"chr1,chr2,chr3..."。 正确做法: 统一染色体命名格式。可用sed 's/^chr//' file.vcf或在R中使用seqlevelsStyle(grl) <- "UCSC"

3. 混淆签名提取和归因的适用场景

错误: 对10个样本做de novo NMF提取。 正确做法: 样本少(<30-50)时应做签名归因(fitting)而非提取。De novo提取建议至少有50个样本(部分文献建议100+)。

4. 忽视WES数据的局限性

错误: 对低TMB肿瘤的WES数据做签名分析并声称高置信度。 正确做法: WES突变数少于50-100时,签名归因结果不可靠。应报告置信区间或bootstrap P值,或说明数据局限性。

5. 过拟合问题

错误: 使用全部COSMIC签名(80+)做fitting,每个样本都"检测到"10多种签名。 正确做法: 使用strict fitting方法,仅保留统计显著的签名。可以先根据肿瘤类型限定候选签名范围(如乳腺癌中先验知道可能出现的签名子集)。

6. 未考虑链偏倚(Strand Bias)

错误: 忽略转录链和复制链上的不对称性。 正确做法: 检查链偏倚可以提供额外信息——如SBS7(UV)在转录非模板链上更多(NER偏好修复模板链),APOBEC签名在lagging strand更多。

7. 拷贝数变异的影响

错误: 未考虑高拷贝数区域的突变重复计数。 正确做法: 在CNV区域,同一突变可能因拷贝数扩增被多次检测。建议使用clonality校正(如考虑VAF和拷贝数)或排除高拷贝数区域。


补充知识

COSMIC签名数据库更新

  • COSMIC v3.4 (2023): 包含约120种签名(SBS + DBS + ID + CN + SV)
  • 在线工具: https://cancer.sanger.ac.uk/signatures/
  • 可通过R包或Python直接下载最新签名矩阵

相关工具生态

工具功能语言
SigProfilerExtractorDe novo签名提取Python
SigProfilerAssignment签名归因Python
MutationalPatterns全流程分析R
deconstructSigs签名归因R
sigminer综合突变签名分析R
YAPSA签名归因(DKFZ)R
mSigAct签名活性分析R

新兴方向

  • 拷贝数签名(CN signatures):基于全基因组拷贝数谱的签名
  • 结构变异签名(SV signatures):基于结构变异模式的签名
  • 单细胞突变签名:从单细胞基因组数据提取签名
  • 深度学习方法:如SignatureAnalyzer-GPU使用贝叶斯NMF + GPU加速
  • 因果签名推断:利用实验诱变(如CRISPR knockout + 测序)建立突变过程与签名的因果关系