CNVkit — 高通量测序拷贝数变异检测工具¶
一句话说明¶
CNVkit(v0.9.13)用WGS或WES数据估算每个基因组区域的拷贝数——就像用"读段密度测量尺"衡量不同区域DNA是变多了(扩增)还是变少了(缺失),是癌症和遗传病研究的常用CNV工具。
安装与配置¶
# 方法1:conda安装(推荐,v0.9.13)
conda create -n cnvkit python=3.10 # CNVkit需要Python 3.10+
conda activate cnvkit
conda config --add channels defaults
conda config --add channels bioconda
conda config --add channels conda-forge
conda install cnvkit # 安装最新版(0.9.13,2026年更新)
# 验证安装
cnvkit.py version # 查看版本号
cnvkit.py --help # 查看所有子命令
# 安装可选依赖(R包,用于绘图)
conda install -c conda-forge r-base r-ggplot2 r-dnacopy # R的CBS分割算法
核心用法¶
一键全自动流程(batch命令,最推荐新手)¶
# WES数据:有配对正常样本(最常用场景)
cnvkit.py batch \
tumor.bam \ # 肿瘤样本BAM
--normal normal.bam \ # 配对正常样本BAM
--targets targets.bed \ # 捕获区域BED文件(WES专用)
--annotate refFlat.txt \ # 基因注释(用于自动获取antitarget区域)
--fasta reference.fasta \ # 参考基因组
--output-reference reference_flat.cnn \ # 输出参考样本CNN文件
--output-dir cnvkit_output \ # 输出目录
-p 16 # 线程数
# WGS数据:无靶向捕获区域
cnvkit.py batch \
tumor.bam \
--normal normal.bam \
--method wgs \ # 全基因组模式(不需要--targets)
--fasta reference.fasta \
--output-dir cnvkit_wgs_out \
-p 16
分步运行(理解每一步)¶
# 步骤1:计算目标区域覆盖度(肿瘤和正常样本)
cnvkit.py coverage tumor.bam targets.bed -o tumor.targetcoverage.cnn # 目标区域
cnvkit.py coverage tumor.bam antitargets.bed -o tumor.antitargetcoverage.cnn # 非目标区域
cnvkit.py coverage normal.bam targets.bed -o normal.targetcoverage.cnn
cnvkit.py coverage normal.bam antitargets.bed -o normal.antitargetcoverage.cnn
# 步骤2:构建参考基线(从正常样本)
cnvkit.py reference normal.targetcoverage.cnn normal.antitargetcoverage.cnn \
--fasta reference.fasta -o reference_flat.cnn
# 步骤3:归一化(肿瘤相对参考)
cnvkit.py fix \
tumor.targetcoverage.cnn \
tumor.antitargetcoverage.cnn \
reference_flat.cnn \
-o tumor.cnr # 比率文件(log2 ratio)
# 步骤4:片段化分割(CBS算法)
cnvkit.py segment tumor.cnr -o tumor.cns # 分割结果文件
# 步骤5:可视化
cnvkit.py scatter tumor.cnr -s tumor.cns -o tumor_scatter.pdf # 散点图
cnvkit.py diagram tumor.cnr -s tumor.cns -o tumor_diagram.pdf # 染色体图
参数详解¶
| 参数/命令 | 说明 | 示例值 |
|---|---|---|
batch --method | 分析方法 | hybrid(WES默认)、wgs、amplicon |
batch --targets | 靶向捕获区域BED(WES必须) | targets.bed |
batch --normal | 正常样本BAM | normal.bam |
--output-reference | 输出参考基线CNN文件 | flat_reference.cnn |
segment -m | 分割算法 | cbs(默认)、haar、hmm |
call --purity | 肿瘤纯度(影响拷贝数绝对值) | 0.7(70%纯度) |
call --ploidy | 肿瘤倍性 | 2(二倍体默认) |
实战案例¶
# 完整WES体细胞CNV分析
REF="hg38.fasta"
TARGETS="agilent_sureselect_v6.bed" # 捕获区域
# 1. 一键批处理(推荐)
cnvkit.py batch \
tumor.bam \
--normal normal.bam \
--targets $TARGETS \
--fasta $REF \
--annotate refFlat.txt \
--output-reference reference.cnn \
--output-dir cnv_results \
-p 20
# 2. 查看结果文件
ls cnv_results/
# tumor.targetcoverage.cnn - 目标区覆盖度
# tumor.antitargetcoverage.cnn - 非目标区覆盖度
# tumor.cnr - 每个bin的log2 ratio
# tumor.cns - 分割后的CNV段
# 3. 调用绝对拷贝数(需要肿瘤纯度信息)
cnvkit.py call \
cnv_results/tumor.cns \
--purity 0.75 \ # 肿瘤纯度75%
--ploidy 2 \
-o tumor_absolute.cns
# 4. 导出基因级别结果
cnvkit.py export seg tumor.cns -o tumor.seg # SEG格式(IGV等工具可用)
cnvkit.py genemetrics cnv_results/tumor.cnr \
-s cnv_results/tumor.cns \
-t 0.4 \ # 阈值过滤微小变化
-o gene_level_cnv.txt # 每个基因的CNV统计
# 5. 可视化全基因组CNV图
cnvkit.py scatter cnv_results/tumor.cnr \
-s cnv_results/tumor.cns \
-o cnv_scatter.pdf
# 6. 查看扩增/缺失基因
awk '$5 > 2' gene_level_cnv.txt | head # 查看高扩增基因(>2倍log2 ratio)
awk '$5 < -2' gene_level_cnv.txt | head # 查看深度缺失基因
常见报错与解决¶
报错1:ImportError: No module named 'cnvlib' - 原因:CNVkit未正确安装,或Python环境冲突 - 解决:确认在正确conda环境conda activate cnvkit;重新安装conda install cnvkit
报错2:R is not available, CBS segmentation not available - 原因:缺少R环境或R的DNAcopy包 - 解决:conda install -c conda-forge r-base r-dnacopy;或使用--segment-method haar替代CBS
报错3:CNV结果噪音很大(.cnr文件散点很分散) - 原因:测序深度不足(WES一般需≥100x覆盖),或正常样本匹配不当 - 解决:使用多个正常样本构建参考基线;确认肿瘤和正常样本来自相同捕获区域
速查表¶
| 命令 | 说明 |
|---|---|
cnvkit.py batch --method wgs | WGS全基因组CNV分析 |
cnvkit.py batch --method hybrid | WES靶向捕获CNV分析(默认) |
cnvkit.py segment tumor.cnr | CBS算法分割CNV段 |
cnvkit.py call --purity 0.7 | 调用绝对拷贝数(需肿瘤纯度) |
cnvkit.py scatter *.cnr -s *.cns | 全基因组散点图 |
cnvkit.py diagram | 染色体臂水平CNV图 |
cnvkit.py genemetrics | 基因级别CNV统计 |
cnvkit.py export seg | 导出SEG格式(IGV/GISTIC2用) |
*.cnr | 每个bin的log2比率文件 |
*.cns | 分割后的CNV区段文件 |