跳转至

拷贝数变异(CNV)检测与注释

一句话概述:CNV 是基因组中较大片段(>1kb)的拷贝数增加(扩增)或减少(缺失),通过 WGS/WES 的读深度(read depth)变化来检测,是肿瘤和遗传病的重要变异类型。


核心知识点速查表

概念白话解释
CNV拷贝数变异,某段DNA多了或少了
扩增(Amplification)拷贝数增加(如基因组某区域从2份→5份)
缺失(Deletion)拷贝数减少(如从2份→1份或0份)
Read Depth某区域的测序深度,CNV区域深度异常
Log2 Ratiolog2(肿瘤深度/正常深度),>0扩增,<0缺失
BAFB等位基因频率,检测LOH(杂合性丢失)
CNVkitWES/Panel CNV检测的主流工具
GATK gCNVGATK的胚系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级)

五、常见报错与解决

问题原因解决方法
大量假阳性CNVGC含量偏差未校正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文档