肿瘤基因组拷贝数变异 CNV¶
一句话说明¶
肿瘤基因组经常出现某些区域拷贝数异常增多(扩增)或减少(缺失),这些拷贝数变异(CNV)可以激活癌基因或失活抑癌基因,是肿瘤分析中仅次于突变检测的第二大分析内容。
核心知识点¶
1. 基本概念¶
- CNV(Copy Number Variation):基因组某区域的拷贝数偏离正常二倍体的状态
- 扩增(amplification):拷贝数增加,如 HER2 扩增(白话:某个基因的"印刷份数"多了)
- 缺失(deletion):拷贝数减少,纯合缺失 = 两份都丢了
- LOH(杂合性丢失):一条同源染色体的区域丢失,只剩另一条
- CN-LOH:拷贝数中性的 LOH(一条丢了但另一条复制了,总数不变)
2. 肿瘤 CNV 检测的特殊性¶
- 肿瘤纯度影响信号强度(纯度低 → CNV 信号弱)
- 倍性影响基线(四倍体肿瘤的"正常"是 4 不是 2)
- 亚克隆 CNV:不是所有肿瘤细胞都有相同的 CNV
- 需要配对正常样本或 Panel of Normals 校正
3. 检测方法与工具¶
| 数据类型 | 工具 | 特点 |
|---|---|---|
| WGS | GATK CNV, CNVnator, Control-FREEC | 全基因组分辨率 |
| WES | CNVkit, FACETS, Sequenza | 外显子区域 |
| Panel | PureCN, CNVkit (panel模式) | 靶向区域 |
| SNP array | ASCAT, PennCNV | 经典方法 |
4. 临床重要的 CNV 事件¶
- HER2/ERBB2 扩增:乳腺癌靶向治疗(曲妥珠单抗)
- MYC/MYCN 扩增:多种癌症的不良预后因素
- CDKN2A 纯合缺失:细胞周期调控丧失
- EGFR 扩增:胶质母细胞瘤、肺癌
- 染色体臂级缺失:如 1p/19q 共缺失(少突胶质细胞瘤分子标志)
实战代码¶
# === CNVkit:WES 肿瘤拷贝数分析(最常用) ===
# 1. 构建参考(用正常样本集合)
cnvkit.py batch \
tumor.bam \ # 肿瘤BAM
--normal normal1.bam normal2.bam \ # 正常样本BAM(多个更好)
--targets target.bed \ # 外显子靶区域
--fasta hg38.fa \ # 参考基因组
--output-reference normal_ref.cnn \ # 输出参考文件
--output-dir cnvkit_results/ \ # 输出目录
--diagram --scatter # 生成图表
# 分步运行版本:
# 2. 计算覆盖度
cnvkit.py coverage tumor.bam target.bed -o tumor.targetcoverage.cnn # 靶区域覆盖
cnvkit.py coverage tumor.bam antitarget.bed -o tumor.antitargetcoverage.cnn # 非靶区域
# 3. 拷贝数分段(segmentation)
cnvkit.py segment tumor.cnr \ # 输入log2比值
-o tumor.cns \ # 输出分段结果
--method cbs # CBS分段算法
# 4. 识别基因级别 CNV
cnvkit.py genemetrics tumor.cnr \ # 基因级别分析
-s tumor.cns \ # 分段结果
-t 0.4 \ # log2阈值(扩增)
-m 5 \ # 最少探针数
> gene_cnv.txt # 输出
# 5. 绘制全基因组散点图
cnvkit.py scatter tumor.cnr \ # log2散点图
-s tumor.cns \ # 分段叠加
-o scatter.pdf # 输出PDF
# 6. 绘制染色体图
cnvkit.py diagram tumor.cnr \ # 染色体图
-s tumor.cns \ # 分段叠加
-o diagram.pdf # 输出PDF
# 7. 导出分段结果(整数拷贝数)
cnvkit.py call tumor.cns \ # 调用整数拷贝数
--purity 0.7 \ # 肿瘤纯度(从FACETS等获得)
--ploidy 2 \ # 肿瘤倍性
-o tumor.call.cns # 输出调用结果
# 解析 CNVkit 结果,找临床重要基因的 CNV
import pandas as pd # 数据处理
# 读取基因级别 CNV 结果
gene_cnv = pd.read_csv("gene_cnv.txt", sep="\t")
# 定义临床重要基因列表
clinical_genes = {
"amplification": ["ERBB2", "MYC", "MYCN", "EGFR", "CDK4",
"MDM2", "FGFR1", "MET", "CCND1"],
"deletion": ["CDKN2A", "CDKN2B", "RB1", "PTEN", "TP53",
"BRCA1", "BRCA2", "ATM"]
}
print("=== 临床重要基因拷贝数变异 ===")
# 检查扩增(log2 > 0.58 约等于拷贝数 >= 3)
for gene in clinical_genes["amplification"]:
row = gene_cnv[gene_cnv["gene"] == gene] # 查找基因
if not row.empty: # 如果找到了
log2 = row.iloc[0]["log2"] # 获取log2值
cn = row.iloc[0].get("cn", 2 * 2**log2) # 拷贝数
if log2 > 0.58: # 扩增阈值
print(f" ★ {gene} 扩增: log2={log2:.2f}, CN≈{cn:.1f}")
# 检查缺失(log2 < -1.0 约等于纯合缺失)
for gene in clinical_genes["deletion"]:
row = gene_cnv[gene_cnv["gene"] == gene]
if not row.empty:
log2 = row.iloc[0]["log2"]
if log2 < -1.0: # 纯合缺失阈值
print(f" ★ {gene} 纯合缺失: log2={log2:.2f}")
elif log2 < -0.4: # 杂合缺失阈值
print(f" △ {gene} 杂合缺失: log2={log2:.2f}")
面试常问点¶
★ 肿瘤 CNV 检测和胚系 CNV 检测有什么区别?¶
参考答案:三个主要区别:(1) 肿瘤 CNV 需要考虑纯度——肿瘤纯度 50% 时,一个拷贝缺失的信号会被稀释一半;(2) 肿瘤可能不是二倍体,需要估计倍性来确定基线;(3) 肿瘤有亚克隆结构,不同细胞群可能有不同的 CNV,导致信号是连续的而非离散的。工具方面,胚系 CNV 用 GATK gCNV、CNVnator 等,肿瘤 CNV 用 CNVkit、FACETS、ASCAT 等专门处理纯度/倍性的工具。
★ log2 ratio 和拷贝数是什么关系?¶
参考答案:log2 ratio = log2(肿瘤覆盖度 / 正常覆盖度)。在纯度 100% 的二倍体肿瘤中:拷贝数 2(正常)→ log2=0;拷贝数 1(杂合缺失)→ log2=-1;拷贝数 0(纯合缺失)→ log2=-∞;拷贝数 3(单拷贝增加)→ log2=0.58;拷贝数 4→ log2=1。但实际肿瘤纯度 <100% 时信号会被稀释,需要用纯度校正后才能得到真实拷贝数。
速查卡片¶
| 问题 | 答案 |
|---|---|
| CNV 定义 | 基因组区域拷贝数偏离正常 |
| 常用工具(WES) | CNVkit, FACETS |
| 常用工具(WGS) | Control-FREEC, GATK CNV |
| 分段算法 | CBS (Circular Binary Segmentation) |
| log2=0 | 正常拷贝数(2) |
| log2=1 | 拷贝数翻倍(4) |
| log2=-1 | 杂合缺失(1) |
| 临床重要扩增 | HER2, MYC, EGFR |
| 临床重要缺失 | CDKN2A, RB1, PTEN |
| 纯度校正 | 必须,否则信号被稀释 |