拷贝数变异(CNV)检测与注释¶
一句话概述:CNV 是基因组中较大片段(>1kb)的拷贝数增加(扩增)或减少(缺失),通过 WGS/WES 的读深度(read depth)变化来检测,是肿瘤和遗传病的重要变异类型。
核心知识点速查表¶
| 概念 | 白话解释 |
|---|---|
| CNV | 拷贝数变异,某段DNA多了或少了 |
| 扩增(Amplification) | 拷贝数增加(如基因组某区域从2份→5份) |
| 缺失(Deletion) | 拷贝数减少(如从2份→1份或0份) |
| Read Depth | 某区域的测序深度,CNV区域深度异常 |
| Log2 Ratio | log2(肿瘤深度/正常深度),>0扩增,<0缺失 |
| BAF | B等位基因频率,检测LOH(杂合性丢失) |
| CNVkit | WES/Panel CNV检测的主流工具 |
| GATK gCNV | GATK的胚系CNV检测流程 |
一、CNV 的概念(白话版)¶
比喻:正常基因组每段DNA有2份(一份来自父亲,一份来自母亲)。CNV就像复印机出了问题: - 扩增:某页被多复印了几份(变成3份、5份甚至几十份)→ 如果是癌基因,可能导致肿瘤 - 缺失:某页少复印了或没复印(变成1份或0份)→ 如果是抑癌基因,可能导致肿瘤
二、方法 1:CNVkit(WES/Panel,推荐)¶
# CNVkit 是 WES 和 Panel 数据 CNV 检测的主流工具
# 安装
conda install -c bioconda cnvkit # conda安装
# 或
pip install cnvkit # pip安装
# === 完整流程 ===
# 第 1 步:构建参考(需要正常样本)
cnvkit.py batch \
tumor.bam \ # 肿瘤BAM文件
--normal normal1.bam normal2.bam \ # 正常样本BAM(多个更好)
--targets targets.bed \ # Panel目标区域BED
--fasta reference.fa \ # 参考基因组
--output-reference my_reference.cnn \ # 输出参考文件
--output-dir cnvkit_results/ \ # 输出目录
-p 8 # 8个线程
# 如果没有正常样本(tumor-only)
cnvkit.py batch \
tumor.bam \
--normal \ # 空的--normal表示使用flat reference
--targets targets.bed \
--fasta reference.fa \
--output-dir cnvkit_results/ \
-p 8
# 输出文件说明:
# tumor.targetcoverage.cnn — 目标区域覆盖度
# tumor.antitargetcoverage.cnn — 非目标区域覆盖度
# tumor.cnr — 每个bin的log2 ratio
# tumor.cns — 分段后的CNV(segment结果)
# tumor-scatter.pdf — 散点图
# tumor-diagram.pdf — 染色体图
CNVkit 可视化¶
# 散点图(最常用的可视化)
cnvkit.py scatter \
tumor.cnr \ # 原始log2 ratio
-s tumor.cns \ # 分段结果
-o scatter.pdf # 输出图片
# 图中横轴是基因组位置,纵轴是log2 ratio
# 红色线是分段结果(segmentation)
# 全基因组热图
cnvkit.py heatmap \
tumor.cns \ # 分段结果
-o heatmap.pdf # 输出图片
# 染色体图(类似核型图)
cnvkit.py diagram \
tumor.cnr \
-s tumor.cns \
-o diagram.pdf
CNVkit 结果解读¶
# ========== Python脚本:解读CNVkit结果 ==========
import pandas as pd
# 读取分段结果
cns = pd.read_csv("tumor.cns", sep="\t") # 读取cns文件
# 筛选显著的CNV
# log2 > 0.3 → 扩增(约1.2倍以上)
# log2 < -0.3 → 缺失
# log2 > 1.0 → 高拷贝扩增(约4倍以上)
# log2 < -1.0 → 纯合缺失
gains = cns[cns['log2'] > 0.3] # 扩增区域
losses = cns[cns['log2'] < -0.3] # 缺失区域
high_amp = cns[cns['log2'] > 1.0] # 高拷贝扩增
print(f"扩增区域: {len(gains)}")
print(f"缺失区域: {len(losses)}")
print(f"高拷贝扩增: {len(high_amp)}")
# 查看高拷贝扩增区域的基因
for _, row in high_amp.iterrows():
print(f" {row['chromosome']}:{row['start']}-{row['end']} "
f"log2={row['log2']:.2f} gene={row.get('gene', 'N/A')}")
# 拷贝数估计公式:
# CN = 2^(log2_ratio + 1) × ploidy / 2
# 例如:log2 = 1 → CN = 2^2 = 4(从正常的2份变成4份)
# 例如:log2 = -1 → CN = 2^0 = 1(从正常的2份变成1份)
三、方法 2:GATK gCNV(胚系 CNV)¶
# GATK 的胚系CNV检测流程(适合遗传病分析)
# 第 1 步:收集读深度数据
gatk CollectReadCounts \
-I sample.bam \ # 输入BAM
-L intervals.interval_list \ # 目标区域
--interval-merging-rule OVERLAPPING_ONLY \
-O sample.hdf5 # 输出HDF5格式
# 第 2 步:降噪(使用正常样本面板)
gatk CreateReadCountPanelOfNormals \
-I normal1.hdf5 \ # 正常样本1
-I normal2.hdf5 \ # 正常样本2
-O pon.hdf5 # 正常面板
gatk DenoiseReadCounts \
-I sample.hdf5 \ # 样本读深度
--count-panel-of-normals pon.hdf5 \ # 正常面板
--standardized-copy-ratios std_cr.tsv \ # 标准化结果
--denoised-copy-ratios denoised_cr.tsv # 降噪结果
# 第 3 步:分段和调用
gatk ModelSegments \
--denoised-copy-ratios denoised_cr.tsv \ # 降噪结果
--allelic-counts allelic_counts.tsv \ # 等位计数
--output segments_output # 输出目录
gatk CallCopyRatioSegments \
-I segments_output/sample.cr.seg \ # 分段结果
-O sample.called.seg # 调用结果(+/-/0)
四、CNV 注释与临床解读¶
# 用 AnnotSV 注释 CNV 的临床意义
# 安装
conda install -c bioconda annotsv
# 运行注释
AnnotSV \
-SVinputFile tumor.cns.bed \ # CNV结果(BED格式)
-genomeBuild GRCh38 \ # 基因组版本
-SVinputInfo 1 \ # 保留输入信息
-outputFile annotated_cnv # 输出文件
# AnnotSV 会注释:
# - 覆盖的基因
# - DGV(正常人群CNV数据库)
# - ClinGen CNV致病性
# - OMIM疾病关联
# - ACMG CNV分类(5级)
五、常见报错与解决¶
| 问题 | 原因 | 解决方法 |
|---|---|---|
| 大量假阳性CNV | GC含量偏差未校正 | CNVkit自动校正,检查参考样本 |
| 全基因组log2 ratio偏移 | 肿瘤纯度低或倍性异常 | 用 cnvkit.py call 指定纯度和倍性 |
| WES检测小CNV不准 | WES分辨率受限于外显子间距 | 小CNV(<50kb)需要WGS |
| 正常对照样本太少 | 噪声大 | 建议 ≥20 个正常样本做参考 |
| Panel数据断点不准 | Panel覆盖不连续 | 只报告覆盖区域内的CNV |
六、面试高频问题¶
Q1:CNV 检测有哪些方法?
(1) Read Depth (RD):最常用,通过覆盖深度推断拷贝数(CNVkit、GATK gCNV);(2) Paired-End (PE):通过异常配对读的距离推断缺失/插入;(3) Split Read (SR):通过分裂读检测断点;(4) SNP Array:通过杂合度和信号强度检测(PennCNV)。WGS可用所有方法,WES主要用RD。
Q2:log2 ratio 怎么转换为拷贝数?
CN = 2 × 2^(log2_ratio)。例如:log2=0 → CN=2(正常);log2=1 → CN=4(扩增);log2=-1 → CN=1(杂合缺失);log2 很负(如-5) → CN≈0(纯合缺失)。
Q3:临床上重要的 CNV 有哪些?
肿瘤:ERBB2(HER2)扩增(乳腺癌靶向治疗)、MYC扩增、CDKN2A纯合缺失、EGFR扩增。遗传病:22q11.2缺失(DiGeorge综合征)、7q11.23缺失(Williams综合征)、唐氏综合征(21三体)。
七、速查表¶
# === CNV 检测速查 ===
# CNVkit(WES/Panel,最常用)
cnvkit.py batch tumor.bam --normal normal.bam --targets targets.bed --fasta ref.fa
cnvkit.py scatter tumor.cnr -s tumor.cns -o scatter.pdf
cnvkit.py diagram tumor.cnr -s tumor.cns -o diagram.pdf
# GATK gCNV(胚系CNV)
gatk CollectReadCounts -I sample.bam -L intervals.list -O counts.hdf5
gatk DenoiseReadCounts -I counts.hdf5 --count-panel-of-normals pon.hdf5
# AnnotSV(CNV注释)
AnnotSV -SVinputFile cnv.bed -genomeBuild GRCh38 -outputFile annotated
# log2 ratio 解读:
# > 0.3 → 扩增
# < -0.3 → 缺失
# > 1.0 → 高拷贝扩增 (CN≥4)
# < -1.0 → 纯合缺失 (CN≤1)
参考资料:CNVkit文档 (Talevich et al. 2016)、GATK CNV Workflow、AnnotSV文档