跳转至

肿瘤纯度与倍性估计


一句话说明

肿瘤样本里不只有肿瘤细胞还混着正常细胞,"纯度"就是肿瘤细胞占比,"倍性"是肿瘤细胞的整体染色体拷贝数状态,这两个参数是准确分析突变和拷贝数的前提。


核心知识点

1. 为什么要估计纯度和倍性

  • 纯度影响 VAF:如果肿瘤纯度 50%,一个杂合突变的 VAF 只有 25%(而非预期的 50%)
  • 倍性影响 CNV:如果肿瘤是四倍体,拷贝数 4 才是"正常",不能当成扩增
  • 不校正的后果:漏检低频突变、误判拷贝数状态、克隆分析结果不可靠
  • 白话:不知道一杯牛奶掺了多少水,就没法判断"牛奶浓度"

2. 常用工具

工具输入数据方法
ASCATSNP array / WGS等位基因特异性拷贝数
ABSOLUTE突变VAF + 拷贝数贝叶斯模型
SequenzaWGS/WES BAMGC校正+B等位基因频率
PureCNPanel/WES突变+拷贝数联合
FACETSWES快速等位基因特异性CNV
BattenbergWGS亚克隆拷贝数

3. 核心概念

  • B等位基因频率(BAF):杂合 SNP 位点上两个等位基因的比例(正常应为 0.5)
  • LogR:相对于正常样本的信号强度比(正常应为 0)
  • LOH(杂合性丢失):一条染色体缺失导致 BAF 从 0.5 偏移到 0 或 1
  • 全基因组倍增(WGD):整个基因组翻倍,常见于晚期肿瘤

4. 纯度估计的难点

  • 肿瘤异质性:不是所有肿瘤细胞都有相同的突变和拷贝数
  • 亚克隆结构:多个亚群以不同比例混合
  • WGD 判断:二倍体和四倍体的信号模式可能相似,容易混淆

实战代码

# === 使用 Sequenza 估计纯度和倍性 ===

# 1. 从 BAM 提取数据(需要配对 Tumor/Normal)
sequenza-utils bam2seqz \
  -n normal.bam \                      # 正常样本BAM
  -t tumor.bam \                       # 肿瘤样本BAM
  --fasta hg38.fa \                    # 参考基因组
  -gc gc50Base.wig.gz \                # GC含量文件
  -o sample.seqz.gz                    # 输出seqz文件

# 2. 分箱(减少数据量)
sequenza-utils seqz_binning \
  --seqz sample.seqz.gz \             # 输入seqz
  -w 50 \                              # 窗口50bp
  -o sample_bin.seqz.gz               # 输出分箱结果

# === 使用 FACETS(R语言) ===
# 3. 从 BAM 生成 pileup(使用 snp-pileup)
snp-pileup \
  -g \                                 # 仅保留杂合SNP
  -q15 -Q20 \                         # 最小比对和碱基质量
  dbsnp_common.vcf.gz \               # 已知SNP数据库
  pileup.csv.gz \                      # 输出pileup
  normal.bam \                         # 正常BAM
  tumor.bam                            # 肿瘤BAM
# === Sequenza R 分析(接上面的步骤2) ===
library(sequenza)                      # 加载sequenza包

# 读取分箱后的seqz数据
data <- sequenza.extract(              # 提取数据
  "sample_bin.seqz.gz"                 # 输入分箱文件
)

# 拟合模型(搜索最优纯度和倍性组合)
fit <- sequenza.fit(data)              # 模型拟合

# 查看结果
print(fit$purity)                      # 最优纯度估计
print(fit$ploidy)                      # 最优倍性估计

# 生成完整报告
sequenza.results(                      # 生成结果
  sequenza.extract = data,             # 数据
  cp.table = fit,                      # 拟合结果
  sample.id = "tumor_sample",          # 样本ID
  out.dir = "sequenza_results/"        # 输出目录
)

# === FACETS R 分析 ===
library(facets)                        # 加载facets包

# 读取 pileup 数据
rcmat <- readSnpMatrix("pileup.csv.gz")  # 读取SNP矩阵

# 预处理(GC校正+分段)
xx <- preProcSample(rcmat,             # 输入数据
                    gbuild = "hg38")   # 基因组版本

# 运行 FACETS
oo <- procSample(xx,                   # 处理样本
                 cval = 300)           # 分段灵敏度(越大越不灵敏)

# 拟合纯度和倍性
fit2 <- emcncf(oo)                     # EM算法拟合

cat("纯度:", fit2$purity, "\n")        # 打印纯度
cat("倍性:", fit2$ploidy, "\n")        # 打印倍性

# 可视化
plotSample(x = oo, emfit = fit2)       # 绘制全基因组CNV图

面试常问点

★ 纯度和倍性为什么要联合估计?

参考答案:因为纯度和倍性对数据信号的影响是耦合的。比如一个看起来信号升高 50% 的区域,可能是"纯度 100% + 拷贝数从 2 变成 3",也可能是"纯度 50% + 拷贝数从 2 变成 4"。单独估计一个参数时,另一个参数的不确定性会导致错误。所以需要在二维空间(纯度 x 倍性)中搜索信号最吻合的组合。

★ 全基因组倍增(WGD)怎么判断?

参考答案:WGD 的判断标准通常是:如果超过 50% 的常染色体区域的 major 拷贝数 >= 2(即两条同源染色体各有 >=2 份拷贝),就认为发生了 WGD。WGD 在晚期肿瘤中很常见(约 30-40% 的实体瘤),会让拷贝数分析更复杂,因为"正常"基线变成了 4 而不是 2。


速查卡片

问题答案
纯度肿瘤细胞占所有细胞的比例
倍性肿瘤细胞的平均染色体拷贝数
常用工具FACETS, Sequenza, ABSOLUTE
BAFB等位基因频率,正常=0.5
LogR信号强度对数比,正常=0
WGD全基因组倍增
纯度影响降低突变VAF
倍性影响改变CNV判断基线
LOH杂合性丢失
典型纯度范围20%-90%