챕터 22 선수지식: 변이 찾기에 들어가기 전 알아야 할 것
1. 22챕터는 무엇을 하려는 장인가요?
22챕터는 BAM 파일에서 변이를 찾는 실습입니다. BAM 파일은 20~21장에서 만든 정렬 결과 파일입니다. 쉽게 말해, 시퀀싱으로 얻은 짧은 DNA 조각들이 참조 유전체의 어느 위치에 붙었는지 기록해 둔 파일입니다.
변이 찾기, 즉 variant calling은 그 BAM 파일을 보면서 “이 위치는 기준 유전체와 다르게 보인다”라고 판단하는 과정입니다. 예를 들어 참조 유전체의 어떤 위치에는 A가 있는데, 내 샘플에서 그 위치를 덮고 있는 read들은 대부분 T라고 해봅시다. 그러면 변이 호출 도구는 “이 샘플은 이 위치에서 A가 아니라 T일 가능성이 높다”고 판단할 수 있습니다.
22장에서 중요한 도구는 Octopus와 ANNOVAR입니다. Octopus는 BAM 파일을 보고 변이를 찾아 VCF 파일로 만들어주는 variant caller입니다. ANNOVAR는 VCF 안의 변이에 유전자 이름, 기능적 영향, 알려진 데이터베이스 정보 같은 주석을 붙여주는 도구입니다.
이 장을 읽기 전에 가장 먼저 잡아야 할 감각은 이것입니다.
BAM은 “read가 어디에 붙었는지”를 담은 파일이고, VCF는 “어디에 어떤 변이가 있는지”를 담은 파일입니다.
즉 BAM은 훨씬 원자료에 가깝고, VCF는 그 BAM을 분석해 얻은 요약 결과에 가깝습니다.
2. 변이 찾기는 왜 단순 비교가 아닌가요?
처음 보면 변이 찾기는 매우 쉬워 보일 수 있습니다. “참조 유전체와 내 read를 비교해서 다른 부분만 찾으면 되는 것 아닌가요?”라고 생각하기 쉽습니다. 하지만 실제로는 훨씬 조심해야 합니다.
시퀀싱 데이터에는 오류가 있습니다. 기계가 어떤 염기를 잘못 읽을 수도 있고, 품질이 낮은 read가 섞일 수도 있습니다. 또 read가 참조 유전체의 엉뚱한 위치에 정렬될 수도 있습니다. 특히 반복 서열이 많은 영역에서는 같은 read가 여러 위치에 붙을 수 있기 때문에 어디가 진짜 위치인지 애매해집니다.
또 사람은 보통 이배체입니다. 하나의 염색체를 아버지 쪽에서 하나, 어머니 쪽에서 하나 받습니다. 그래서 어떤 위치는 두 복사본이 모두 같은 염기일 수도 있고, 하나는 A, 하나는 T처럼 다를 수도 있습니다. 이 경우 read의 일부는 A를 지지하고, 일부는 T를 지지할 수 있습니다.
따라서 variant caller는 단순히 “다른 글자 발견!”이라고 말하지 않습니다. 여러 read가 같은 변이를 지지하는지, read 품질은 좋은지, 정렬 품질은 좋은지, 해당 위치의 read 깊이는 충분한지, 주변에 indel이 있어 정렬이 흔들리지는 않았는지 등을 함께 봅니다.
초보자는 variant caller를 “똑똑한 차이점 찾기 프로그램”이라고 생각하면 됩니다. 다만 단순한 틀린그림찾기가 아니라, 오차와 잡음이 섞인 데이터를 보고 통계적으로 가장 그럴듯한 변이를 판단하는 프로그램입니다.
3. Variant caller가 필요로 하는 입력 파일들
22장에서는 Octopus를 실행하기 전에 몇 가지 파일을 준비합니다. 이 파일들은 그냥 형식적으로 필요한 것이 아니라, 변이 찾기 과정에서 각각 역할이 있습니다.
정렬된 BAM 파일은 read들이 참조 유전체에 붙은 결과입니다. Octopus는 이 파일을 보며 각 위치의 read들을 확인합니다.
BAM index 파일, 보통 .bai 파일은 BAM 파일의 목차입니다. BAM 파일은 매우 클 수 있습니다. 변이 호출 도구가 어떤 염색체의 특정 위치를 볼 때 매번 파일 전체를 처음부터 읽으면 너무 느립니다. 그래서 index 파일을 사용해 필요한 위치로 빠르게 이동합니다.
참조 FASTA 파일은 비교 기준입니다. “내 샘플이 기준과 어디가 다른가?”를 말하려면 기준 유전체가 있어야 합니다. 그래서 reference.fa 같은 파일이 필요합니다.
FASTA index 파일, 보통 .fai 파일은 참조 유전체의 목차입니다. samtools faidx reference.fa 명령어는 이 .fai 파일을 만듭니다. 이 파일이 있으면 프로그램이 “3번 염색체 100만 번째 위치” 같은 곳에 빠르게 접근할 수 있습니다.
정리하면 이렇습니다.
| 파일 | 쉬운 비유 | 역할 |
|---|---|---|
aligned.sorted.markdup.bam |
read 위치가 표시된 지도 | 샘플 read들이 어디에 붙었는지 보여줍니다. |
aligned.sorted.markdup.bam.bai |
지도 목차 | BAM의 특정 위치를 빠르게 찾게 해줍니다. |
reference.fa |
기준 책 | 어떤 염기가 원래 기준인지 알려줍니다. |
reference.fa.fai |
기준 책 목차 | 기준 유전체의 특정 위치를 빠르게 찾게 해줍니다. |
여기서 markdup이라는 말이 보이면 “중복 read 표시가 된 BAM” 정도로 이해하면 됩니다. PCR이나 실험 과정에서 같은 조각이 과하게 복제된 read는 변이 판단을 왜곡할 수 있습니다. 그래서 중복을 표시하거나 제거하는 과정이 중요합니다. 이 내용은 21장 SAM/BAM 처리와 이어집니다.
4. zcat reference.fa.gz > reference.fa는 왜 하나요?
원문에서는 압축된 참조 유전체 reference.fa.gz를 reference.fa로 풀어냅니다.
zcat reference.fa.gz > reference.fa
이 명령은 gzip으로 압축된 FASTA 파일을 읽어서, 압축이 풀린 FASTA 파일로 저장하는 과정입니다.
여기서 zcat은 압축 파일의 내용을 화면 또는 표준출력으로 풀어 보여주는 명령입니다. >는 그 출력을 파일로 저장하라는 뜻입니다. 그러므로 이 명령은 “압축된 참조 유전체를 풀어서 reference.fa라는 새 파일로 저장하세요”라는 의미입니다.
왜 굳이 압축을 풀까요? 도구마다 압축된 FASTA를 직접 읽을 수 있는지 여부가 다릅니다. Octopus는 압축 해제된 참조 유전체와 .fai 인덱스 파일을 요구합니다. 그래서 reference.fa.gz를 reference.fa로 풀고, 그다음 samtools faidx reference.fa로 인덱스를 만드는 것입니다.
samtools faidx reference.fa
이 명령은 reference.fa.fai를 만듭니다. 초보자는 이것을 “참조 유전체 책의 페이지 번호표를 만드는 일”이라고 생각하면 됩니다.
5. Octopus 명령어는 어떻게 읽어야 하나요?
원문에서 Octopus는 다음처럼 실행됩니다.
octopus -R reference.fa -I aligned.sorted.markdup.bam -o variants.vcf.gz
이 명령어는 겉보기에는 낯설지만, 구조는 단순합니다.
octopus는 실행할 프로그램 이름입니다. -R reference.fa는 참조 유전체 파일을 지정합니다. R은 reference를 떠올리면 됩니다. -I aligned.sorted.markdup.bam은 입력 BAM 파일을 지정합니다. I는 input을 떠올리면 됩니다. -o variants.vcf.gz는 출력 파일 이름을 지정합니다. o는 output입니다.
즉 이 명령은 다음 뜻입니다.
“reference.fa를 기준으로 aligned.sorted.markdup.bam을 분석해서, 변이 결과를 variants.vcf.gz로 저장하세요.”
대용량 데이터에서는 --threads 8 같은 옵션을 붙일 수 있습니다. thread는 컴퓨터가 일을 나누어 처리하는 작업 단위라고 생각하면 됩니다. 스레드를 늘리면 더 빠르게 처리될 수 있지만, 컴퓨터 자원을 더 많이 씁니다.
6. VCF 파일은 어떤 식으로 읽나요?
VCF는 Variant Call Format의 약자입니다. 변이 정보를 저장하는 표준 파일 형식입니다. VCF는 압축되어 variants.vcf.gz처럼 저장되는 경우가 많습니다. 내용을 확인할 때는 다음처럼 볼 수 있습니다.
zcat variants.vcf.gz | less
VCF 파일은 크게 헤더와 본문으로 나뉩니다. ##로 시작하는 줄들은 헤더입니다. 이 파일이 어떤 기준으로 만들어졌는지, 어떤 INFO 필드가 있는지, 어떤 FORMAT 필드가 있는지 같은 설명이 들어갑니다.
그다음 #CHROM으로 시작하는 줄이 컬럼 이름 줄입니다. 그 아래부터 실제 변이 기록이 한 줄에 하나씩 나옵니다.
가장 기본적으로 봐야 하는 필드는 CHROM, POS, REF, ALT입니다.
CHROM은 염색체 이름입니다. POS는 그 염색체 안에서의 위치입니다. REF는 참조 유전체의 염기 또는 서열입니다. ALT는 내 샘플에서 관찰된 대체 염기 또는 서열입니다.
예를 들어 CHROM=3, POS=23, REF=A, ALT=T라면, 3번 염색체 23번 위치에서 기준은 A인데 샘플에서는 T가 관찰되었다는 뜻입니다.
REF=T, ALT=TGGA라면 ALT가 더 깁니다. 즉 기준 T 뒤에 GGA가 추가된 삽입으로 볼 수 있습니다. REF=TGG, ALT=T라면 REF가 더 깁니다. 기준에 있던 GG가 사라진 결실로 볼 수 있습니다.
VCF는 처음에는 무서워 보이지만, 기본 독해법은 어렵지 않습니다.
- 어느 염색체인가요? →
CHROM - 어느 위치인가요? →
POS - 기준 서열은 무엇인가요? →
REF - 샘플에서 관찰된 서열은 무엇인가요? →
ALT - 이 변이를 믿을 수 있나요? →
QUAL,FILTER - 추가 설명은 무엇인가요? →
INFO,FORMAT, 샘플별 genotype
이 정도만 잡고 들어가도 원문을 훨씬 덜 어렵게 읽을 수 있습니다.
7. SNV, insertion, deletion을 직관적으로 이해하기
변이는 글자 차이로 생각하면 쉽습니다. DNA 서열은 A, C, G, T 네 글자로 쓰인 긴 문장입니다.
SNV는 한 글자가 다른 글자로 바뀐 것입니다.
참조: A C G T A
샘플: A C T T A
^
여기서는 G가 T로 바뀌었습니다. 한 글자 치환입니다.
Insertion은 샘플 쪽에 글자가 더 끼어든 것입니다.
참조: A C G T A
샘플: A C G G G T A
^^
Deletion은 샘플 쪽에서 글자가 빠진 것입니다.
참조: A C G T A
샘플: A C - - A
^^
실제 VCF에서는 왼쪽 정렬, 공통 염기 포함 같은 표기 규칙 때문에 초보자가 예상한 모양과 조금 다르게 보일 수 있습니다. 하지만 입문 단계에서는 REF와 ALT 길이를 비교하는 방식으로 먼저 감을 잡으면 됩니다.
8. 변이 주석(annotation)은 왜 필요한가요?
Octopus가 VCF를 만들면 “어느 위치에 어떤 변이가 있다”는 정보가 생깁니다. 하지만 그것만으로는 생물학적 의미를 알기 어렵습니다.
예를 들어 3번 염색체 123456번 위치 A>T라는 정보를 받았다고 해봅시다. 이것만 보고는 그 변이가 중요한지 아닌지 알 수 없습니다. 그 위치가 유전자 안인지, 유전자 바깥인지, 단백질을 바꾸는지, 이미 dbSNP에 등록된 흔한 변이인지, 질병과 관련된 변이인지 등을 추가로 알아야 합니다.
이렇게 변이에 의미를 붙이는 과정을 변이 주석, variant annotation이라고 합니다.
ANNOVAR는 이런 일을 도와주는 도구입니다. VCF 파일을 입력받아, 각 변이가 어떤 유전자와 관련 있는지, 어떤 기능적 영향을 줄 수 있는지, 여러 데이터베이스에 이미 알려져 있는지 등을 붙여줍니다.
초보자는 변이 호출과 변이 주석을 구분해야 합니다.
변이 호출은 “차이를 찾는 일”입니다. 변이 주석은 “그 차이의 의미를 해석하기 쉽게 설명을 붙이는 일”입니다.
| 단계 | 질문 | 대표 결과 |
|---|---|---|
| 변이 호출 | 기준 유전체와 다른 위치가 어디인가요? | VCF |
| 변이 주석 | 이 변이는 어떤 유전자와 관련 있고 어떤 의미가 있나요? | 주석이 붙은 VCF 또는 표 |
9. ANNOVAR 명령어를 읽는 기초
원문에서는 table_annovar.pl을 사용합니다. 명령어가 길어서 처음 보면 겁이 날 수 있습니다. 하지만 옵션을 덩어리로 나누면 이해할 수 있습니다.
annovar/table_annovar.pl ex2.vcf annovar/humandb \
-buildver hg19 \
-out myanno \
-remove \
-protocol refGene,cytoBand,exac03,avsnp147,dbnsfp30a \
-operation g,r,f,f,f \
-nastring . \
-vcfinput \
-polish
ex2.vcf는 입력 VCF입니다. annovar/humandb는 ANNOVAR가 참조할 데이터베이스 폴더입니다. -buildver hg19는 인간 참조 유전체 버전을 hg19로 맞춘다는 뜻입니다. 유전체 좌표는 참조 버전이 다르면 위치가 달라질 수 있기 때문에 매우 중요합니다.
-out myanno는 결과 파일의 앞부분 이름을 지정합니다. -protocol은 어떤 주석 데이터베이스들을 사용할지 지정합니다. 예를 들어 refGene은 유전자 위치와 기능 주석, avsnp147은 dbSNP 관련 정보, exac03은 인구집단 변이 빈도 정보와 관련됩니다.
-operation은 각 protocol을 어떤 방식으로 적용할지 지정합니다. 예를 들어 gene-based, region-based, filter-based 같은 방식이 있습니다. 입문 단계에서는 이것을 “각 데이터베이스를 어떤 관점으로 대조할지 알려주는 옵션”이라고 이해하면 됩니다.
-vcfinput은 입력이 VCF 형식이라는 뜻입니다. -nastring .은 값이 없을 때 점으로 표시하라는 뜻입니다.
중요한 것은 모든 옵션을 외우는 것이 아닙니다. 이 명령어가 “입력 VCF를 여러 유전체 데이터베이스와 대조해서 주석이 달린 결과 파일을 만든다”는 흐름을 이해하는 것입니다.
10. Blacklist 영역과 허위 양성(false positive)
변이 분석에서는 false positive, 즉 허위 양성을 조심해야 합니다. 허위 양성이란 실제 변이가 아닌데 분석 결과에서는 변이처럼 나온 경우입니다.
왜 이런 일이 생길까요? 반복 서열이 많은 영역에서는 read가 엉뚱한 곳에 붙을 수 있습니다. 중복 영역에서는 비슷한 서열이 여러 곳에 있어서 정렬이 애매해집니다. 염기 조성이 특이하거나 실험적으로 문제가 자주 발생하는 영역도 있습니다.
이런 문제 영역을 미리 목록으로 만들어 둔 것이 blacklist입니다. Blacklist 영역에서 발견된 변이는 실제 생물학적 변이가 아니라 기술적 잡음일 가능성이 높습니다.
초보자는 false positive를 “분석 프로그램이 착각한 결과”라고 생각하면 됩니다. 좋은 분석은 변이를 많이 찾는 것만이 목표가 아닙니다. 진짜 변이를 놓치지 않으면서도, 가짜 변이를 줄이는 균형이 중요합니다.
11. VCF 품질 필드는 어떻게 읽나요?
VCF에서 REF와 ALT만 보면 변이의 종류는 알 수 있습니다. 하지만 그 변이를 얼마나 믿을 수 있는지는 품질 관련 필드를 함께 봐야 합니다. 예를 들어 다음 한 줄을 봅시다.
chr3 23 . A T 80 PASS DP=35;AF=0.48
이 줄은 3번 염색체의 23번 위치에서 참조 염기 A가 샘플에서는 T로 보인다는 뜻입니다. 여기서 QUAL=80은 변이 호출 신뢰도가 비교적 높다는 뜻이고, FILTER=PASS는 기본 필터를 통과했다는 뜻입니다. DP=35는 이 위치를 덮은 read가 35개라는 뜻이며, AF=0.48은 변이를 지지하는 read 비율이 약 48%라는 뜻입니다.
반대로 다음과 같은 줄은 조심해야 합니다.
chr3 23 . A T 12 LowDepth DP=2;AF=0.50
AF=0.50만 보면 그럴듯해 보이지만, DP=2라면 read 2개 중 1개가 T였다는 뜻입니다. 근거가 너무 적습니다. 그래서 변이 해석에서는 “ALT가 있다”만 보지 말고, QUAL, FILTER, DP처럼 신뢰도를 판단하는 필드를 같이 봐야 합니다.
12. Germline 변이와 somatic 변이는 어떻게 다른가요?
Germline 변이는 태어날 때부터 몸의 대부분 세포에 들어 있는 변이입니다. 부모에게서 물려받았거나 초기 발생 단계에서 생긴 변이라고 생각하면 됩니다. 반면 somatic 변이는 특정 세포 집단에서 나중에 생긴 변이입니다. 암 유전체 분석에서 자주 말하는 종양 변이는 보통 somatic 변이를 뜻합니다.
종양-정상 쌍 분석은 이 차이를 이용합니다. 정상 샘플에도 있고 종양 샘플에도 있으면 germline 변이일 가능성이 큽니다. 정상 샘플에는 없고 종양 샘플에만 있으면 somatic 변이 후보가 됩니다. 따라서 22챕터 뒤쪽의 질병 유전체 분석을 읽을 때는 “변이를 찾는다”에서 멈추지 말고, “이 변이가 원래부터 있던 것인지, 종양에서 새로 생긴 것인지”를 구분해야 합니다.
13. 22챕터 들어가기 전 최소 체크리스트
22장을 읽기 전에 다음 질문에 답할 수 있으면 좋습니다.
- BAM 파일은 무엇을 담고 있나요?
- BAM index
.bai는 왜 필요한가요? - 참조 유전체 FASTA와
.fai파일은 어떤 역할을 하나요? - Variant caller는 어떤 일을 하나요?
- VCF에서
CHROM,POS,REF,ALT는 무엇인가요? - REF와 ALT 길이를 비교하면 어떤 변이 유형을 짐작할 수 있나요?
- 변이 호출과 변이 주석은 어떻게 다른가요?
- Blacklist 영역에서 나온 변이를 조심해야 하는 이유는 무엇인가요?
이 질문들이 대략 이해된다면 22장의 Octopus, VCF 확인, ANNOVAR 실습은 훨씬 덜 낯설게 느껴질 것입니다.
문제 풀이
변이 찾기
주관식 답안은 Gemini API로 채점합니다. API 키는 이 브라우저에만 저장됩니다.
-
1. [쉬움] 객관식
22챕터의 variant calling이 수행하는 핵심 작업으로 가장 적절한 것을 고르라.
-
2. [쉬움] 객관식
BAM 파일과 VCF 파일의 관계로 가장 적절한 것을 고르라.
-
3. [쉬움] 객관식
VCF의 REF와 ALT에 대한 설명으로 가장 적절한 것을 고르라.
-
4. [쉬움] 객관식
변이 주석(annotation)의 목적에 가장 가까운 것을 고르라.
-
5. [쉬움] 객관식
BAM index 파일의 역할로 가장 적절한 것을 고르라.
-
6. [쉬움] 객관식
SNV에 대한 설명으로 가장 적절한 것을 고르라.
-
7. [보통] 객관식
variant caller가 단순 문자열 비교보다 복잡한 판단을 해야 하는 이유로 가장 적절한 것을 고르라.
-
8. [보통] 객관식
Blacklist 영역을 변이 해석에서 조심해야 하는 이유로 가장 적절한 것을 고르라.
-
9. [보통] 객관식
다음 명령의 의미로 가장 적절한 것을 고르라.
zcat reference.fa.gz > reference.fa -
10. [보통] 객관식
다음 명령으로 생성되는 파일의 성격으로 가장 적절한 것을 고르라.
samtools faidx reference.fa -
11. [보통] 객관식
다음 Octopus 명령에서
-R옵션의 의미로 가장 적절한 것을 고르라.octopus -R reference.fa -I sample.bam -o variants.vcf.gz -
12. [보통] 객관식
다음 Octopus 명령에서
-I sample.bam이 가리키는 대상으로 가장 적절한 것을 고르라.octopus -R reference.fa -I sample.bam -o variants.vcf.gz -
13. [어려움] 객관식
다음 VCF 레코드 해석으로 가장 적절한 것을 고르라.
#CHROM POS ID REF ALT QUAL FILTER INFO chr3 23 . A T 80 PASS . -
14. [어려움] 객관식
다음 VCF 표기에서 변이 유형을 가장 적절히 해석한 것을 고르라.
REF=T ALT=TGGA -
15. [어려움] 객관식
다음 VCF 표기에서 변이 유형을 가장 적절히 해석한 것을 고르라.
REF=TGG ALT=T -
16. [어려움] 객관식
다음 상황에서 가장 조심해야 할 해석을 고르라.
어떤 반복서열 영역에서 ALT를 지지하는 read가 몇 개 보이지만 mapping quality가 낮고 주변 CIGAR가 불안정하다. -
17. [어려움] 객관식
다음 명령 묶음에서 논리적 순서로 가장 적절한 것을 고르라.
zcat reference.fa.gz > reference.fa samtools faidx reference.fa octopus -R reference.fa -I aligned.sorted.markdup.bam -o variants.vcf.gz -
18. [어려움] 객관식
다음 ANNOVAR류 주석 단계의 본질로 가장 적절한 것을 고르라.
variants.vcf.gz -> gene name, functional effect, database match columns -
19. [어려움] 객관식
다음 상황에서 가장 타당한 후속 조치를 고르라.
VCF에서 QUAL은 높지만 FILTER가 LowDepth이고 해당 위치 read depth가 2이다. -
20. [어려움] 객관식
다음 파이프 사용 의도로 가장 적절한 것을 고르라.
zcat variants.vcf.gz | less -
21. [보통] 객관식
다음 VCF 한 줄을 읽은 설명으로 가장 적절한 것을 고르라.
chr3 23 . A T 80 PASS DP=35;AF=0.48 -
22. [보통] 객관식
다음 두 변이 후보 중 더 조심해서 해석해야 하는 것을 고르라.
A: QUAL=90, FILTER=PASS, DP=40 B: QUAL=12, FILTER=LowDepth, DP=2 -
23. [보통] 객관식
종양-정상 쌍 분석에서 somatic variant 후보에 가장 가까운 상황을 고르라.
-
24. [쉬움] 객관식
Octopus와 ANNOVAR의 역할 구분으로 가장 적절한 것을 고르라.
-
주관식 1. [쉬움] 주관식 · Gemini 채점
BAM과 VCF의 차이를 read 정렬 결과와 변이 요약 결과 관점에서 설명하라.
-
주관식 2. [보통] 주관식 · Gemini 채점
variant caller가 read depth, base quality, mapping quality를 함께 고려해야 하는 이유를 설명하라.
-
주관식 3. [보통] 주관식 · Gemini 채점
변이 호출과 변이 주석의 차이를 설명하라.
-
주관식 4. [어려움] 주관식 · Gemini 채점
REF=TGG, ALT=T와 REF=T, ALT=TGGA의 차이를 VCF 표기 관점에서 설명하라.