SV 콜러가 왜 대형 CNV를 놓치나요
지난 편에서 Manta·Delly·GRIDSS로 SV를 봤습니다. 그런데 이 도구들이 실무에서 놓치는 SV 유형이 있습니다. 매우 큰 DEL과 DUP — 특히 100kbp 이상 크기.
이유는 이 도구들이 페어드-엔드 discordant read와 split read를 주 시그니처로 쓰기 때문입니다. 큰 DEL이 있으면 두 breakpoint 각각에 관여하는 리드는 소수라 통계 파워가 부족합니다. 반면 이 큰 DEL이 게놈에 만드는 가장 뚜렷한 신호는 커버리지 감소입니다. 그래서 CNV 전용 도구는 read depth를 주 시그니처로 씁니다.
CNV의 유형과 실무 의미
- Germline CNV: 자연 다형성 (예: LDL 수용체 유전자의 CNV). 인구 유전학 · 발달 장애 연구.
- Somatic CNV: 암에서 흔한 유전자 증폭(예: HER2 · MYC)이나 결실(예: PTEN · CDKN2A). 표적 치료 선택의 지표.
- 소형 exon-level CNV: WES에서 유전자 내 몇 개 엑손 결실. 유전 질환 진단의 20~30%가 이 유형.
각 유형이 요구하는 도구가 다릅니다.
Read Depth 접근의 큰 그림
원리를 세 단계로.
1. 게놈을 bin으로 나누기
전 게놈을 일정 크기 bin(예: 1kb)으로 나누고 각 bin에 리드 개수를 셉니다. 이 카운트가 bin의 raw depth.
2. 편향 보정
Raw depth는 여러 편향이 있습니다.
- GC 편향: GC 극단인 bin은 라이브러리 준비 시 덜 증폭 → depth 낮음.
- Mappability 편향: 반복 서열 근처 bin은 리드가 unique하게 안 붙어 → depth 낮음.
- 레이션(replication timing): 라이브러리 준비 시점의 세포 주기 편향.
이 편향을 로컬 회귀나 GAM 등으로 보정합니다.
3. 세그멘테이션
보정된 depth 프로파일에서 인접 bin들의 값이 급변하는 지점을 breakpoint로 잡고, 같은 값 유지 구간을 세그먼트로 묶습니다. 이게 CNV의 시작·종료 좌표.
세그먼트별 평균 depth가 참조 대비 반이면 hetero DEL, 0이면 homo DEL, 1.5×면 hetero DUP, 2×면 homo DUP.
CNVkit — WES · WGS 다 지원하는 표준
Eric Talevich가 만든 파이썬 도구. Somatic CNV(암 임상)에 특화되어 있지만 germline도 됩니다.
실행 흐름
# 1) 참조 CNV 생성 (정상 샘플 여러 개로)cnvkit.py batch \ -n normal1.bam normal2.bam normal3.bam ... \ -f hg38.fa \ -t exome_targets.bed \ -a exome_antitargets.bed \ --output-reference myref.cnn \ -d ref_output/
# 2) 종양 CNV 콜링cnvkit.py batch tumor1.bam tumor2.bam \ -r myref.cnn \ -d results/- Target bed (
-t): 표적 영역 (WES면 엑솜 bed). - Antitarget bed (
-a): 표적 외 영역 (off-target 리드 활용). - 참조 (
myref.cnn): 정상 샘플로 만든 baseline.
CNVkit의 아이디어: 심지어 off-target 리드도 CNV 신호로 씁니다. WES는 표적 외 영역에도 리드가 있어 이걸 안 쓰면 낭비.
결과
.cns 파일에 세그먼트별 log2 copy number ratio.
- log2=0: 참조 대비 동일.
- log2=−1: 절반 (hetero DEL 후보).
- log2=+0.58: 1.5배 (hetero DUP 후보).
- log2=+1: 2배 (homo DUP 후보).
시각화는 cnvkit.py scatter와 cnvkit.py diagram으로 유전자별 카피 넘버 프로파일을 PDF로 출력.
GATK CNV — Best Practices 체제
Broad Institute의 GATK4에도 CNV 도구가 있습니다. Panel of Normals(PoN) 기반 접근.
Germline
gatk GermlineCNVCaller \ --input case.hdf5 \ --contig-ploidy-calls ploidy_calls/ \ --model cohort-model \ --output cnv_output여러 정상 샘플로 만든 모델이 필요.
Somatic
# 1) 종양-정상 쌍에서 각 read countgatk CollectReadCounts -I tumor.bam -L intervals.bed --format HDF5 -O tumor.hdf5gatk CollectReadCounts -I normal.bam -L intervals.bed --format HDF5 -O normal.hdf5
# 2) 정상 PoN으로 정규화gatk DenoiseReadCounts \ -I tumor.hdf5 \ --count-panel-of-normals pon.hdf5 \ --standardized-copy-ratios tumor.std.tsv \ --denoised-copy-ratios tumor.denoised.tsv
# 3) 세그멘테이션 + 콜링gatk ModelSegments --denoised-copy-ratios tumor.denoised.tsv -O tumor.seggatk CallCopyRatioSegments -I tumor.seg -O tumor.called.segGATK CNV는 클라우드 워크플로(Terra)에 통합되어 있어 팀 표준 파이프라인이면 매끄럽습니다.
Control-FREEC · cn.mops — 대안
- Control-FREEC: 프랑스 연구소가 만든 종양-정상 쌍 CNV 도구. B-allele frequency(BAF) 정보도 통합.
- cn.mops: R 패키지. 여러 샘플의 read depth를 mixture Poisson 모델로 통합 콜링. 소규모 코호트에 안정적.
도구 선택 매트릭스
| 상황 | 1순위 | 2순위 |
|---|---|---|
| 암 종양-정상 쌍 임상 진단 | CNVkit | GATK CNV Somatic |
| 암 종양 단독 | CNVkit + PoN | Control-FREEC |
| Germline 발달 장애 (WES exon-level) | GATK CNV Germline | ExomeDepth |
| 인구 유전학 germline 대규모 | GATK CNV + gCNV | cn.mops |
소규모 코호트 (<20) | cn.mops | CNVkit |
GC 편향 보정 — 실무 감
GC 편향의 실체를 감으로 잡아봅시다. 인간 게놈 평균 GC = 40%. 각 1kb bin의 GC%가 20~70% 사이에 분포. 라이브러리에 따라 편향 곡선이 다릅니다.
PCR-free 라이브러리: GC 편향 거의 없음. 보정 최소. PCR 라이브러리: GC 40~50%에서 최고, 그 밖에서 감소 (U자 커브). Nextera XT: GC 20% 이하와 70% 이상에서 극단적 감소.
CNVkit의 --drop-low-coverage 옵션이 이 극단 bin을 자동 제거합니다. GC 편향이 심한 라이브러리에서는 log2 프로파일이 노이즈로 뒤덮이니 보정 이후에 세그멘테이션.
Circular Binary Segmentation — 세그멘테이션 알고리즘
세그멘테이션의 표준 알고리즘.
원리: bin depth 시계열에서 두 지점을 찍고 그 사이 평균이 다른지 t-검정. 유의하면 breakpoint. 이 과정을 반복.
R의 DNAcopy 패키지가 표준 구현. CNVkit이 내부에서 이 알고리즘을 사용.
손 계산 — 세그먼트 콜링
가상의 depth 프로파일 (log2 ratio).
bin 1-100: 평균 0.05 (참조)
bin 101-200: 평균 -0.95 (hetero DEL 후보)
bin 201-300: 평균 0.10 (참조 회복)
bin 301-500: 평균 0.60 (hetero DUP 후보)
bin 501-600: 평균 0.00 (참조)Circular Binary Segmentation이 이렇게 분할할 것입니다.
- seg 1: bin 1-100 (참조).
- seg 2: bin 101-200 (log2=−0.95, hetero DEL, 크기 100kb).
- seg 3: bin 201-300 (참조).
- seg 4: bin 301-500 (log2=+0.60, hetero DUP, 크기 200kb).
- seg 5: bin 501-600 (참조).
각 세그먼트별로 CNV 유형과 크기가 결정.
시각화 — IGV와 UCSC
CNV VCF를 IGV에 로드하면 각 세그먼트가 색 상자로 표시. UCSC Genome Browser의 Copy Number 트랙과도 비교 가능.
Colab에서 R로 소형 실습
CNVkit은 Colab에서 무겁고, R에서 DNAcopy로 세그멘테이션만 시연이 편합니다.
install.packages("DNAcopy")
library(DNAcopy)
# 가상 depth 데이터
set.seed(42)
n <- 500
depth <- c(rnorm(100, 0, 0.1),
rnorm(100, -1.0, 0.1),
rnorm(100, 0, 0.1),
rnorm(200, 0.6, 0.1))
pos <- 1:n
cna <- CNA(genomdat = depth, chrom = rep("chr1", n), maploc = pos)
cna.smoothed <- smooth.CNA(cna)
seg <- segment(cna.smoothed)
print(seg$output)
plot(seg, plot.type = "s")이 코드 하나로 CBS 세그멘테이션과 시각화 감을 잡습니다.
CS 매핑
- 1차원 신호 분할: DryBench "신호 세그멘테이션" 편(
signal-segmentation) 참고. - 편향 보정: GC · mappability는 지역 회귀로 예측되는 시스템적 편향.
- HMM 기반 상태 추정: 일부 CNV 도구(gCNV)는 HMM으로 카피 넘버 상태(0,1,2,3,4+)를 추정.
마무리
CNV는 SV의 특수 유형이지만 read depth라는 완전히 다른 시그니처를 씁니다. GATK Best Practices에서 SNV/인델과 별도 트랙으로 취급되는 이유입니다. 다음 편(S16)에서는 GATK가 콜한 변이를 어떻게 하플로타입 단위로 정리하고, 소규모 시퀀싱에서 놓친 변이를 알려진 인구 데이터로 임퓨테이션하는지 봅니다.
더 깊게 파고 싶다면
- Talevich E. et al. (2016), CNVkit: Genome-wide copy number detection and visualization from targeted DNA sequencing. PLoS Comput Biol 12:e1004873. CNVkit 원 논문.
- Boeva V. et al. (2012), Control-FREEC: a tool for assessing copy number and allelic content using next-generation sequencing data. Bioinformatics 28:423.
- Klambauer G. et al. (2012), cn.mops: mixture of Poissons for discovering copy number variations in next-generation sequencing data with a low false discovery rate. Nucleic Acids Research 40:e69.
- Olshen A.B. et al. (2004), Circular binary segmentation for the analysis of array-based DNA copy number data. Biostatistics 5:557. CBS 원 논문.
- UCSC Genome Browser (https://genome.ucsc.edu/): CNV 시각화 표준.
CNVkit 리포트 한 번 열어보면 유전자별 카피 넘버가 임상 리포트에 어떻게 실리는지 감이 옵니다. 다음 편에서 하플로타이핑과 임퓨테이션으로 갑시다.