BioPlayground

🧬
목록으로

VCF 한 줄이 '무슨 뜻'인지 알려주는 도구 — Ensembl VEP 변이 주석

GATK4·PanVariants로 콜링한 VCF의 각 줄이 단백질에 어떤 영향을 미치는지, Ensembl VEP의 결과 해석과 REST API 실습으로 다룹니다.

중급
|
20
|
검증 완료 (2026-07-29)
variant effect predictionconsequence termsVEP REST API
진행률0/120 (0%)

VCF는 좌표만 알려줄 뿐, 의미는 알려주지 않습니다

S42~S50, F32에서 다룬 GWAS·변이 콜링 파이프라인의 산출물은 결국 VCF입니다. VCF 한 줄은 "몇 번 염색체 몇 번째 위치에서 A가 G로 바뀌었다"는 좌표 정보만 담고 있을 뿐, 그 변화가 단백질 기능에 어떤 영향을 미치는지는 알려주지 않습니다. Ensembl VEP(Variant Effect Predictor)는 이 좌표를 유전자 모델에 대입해 기능적 의미로 번역하는 도구입니다.

원리 — 좌표를 유전자 구조에 대입하기

변이 결과(consequence)를 정하는 절차

VEP는 변이 좌표를 트랜스크립트 모델(엑손·인트론·UTR 경계)과 겹쳐 봅니다. 변이가 엑손의 코딩 영역에 떨어지면 그 코돈이 어떻게 바뀌는지 계산해 아미노산 변화를 판정하고, 인트론·프로모터·유전자간(intergenic) 영역에 떨어지면 그에 맞는 표준 용어를 붙입니다. 이 용어는 임의로 정한 것이 아니라 **Sequence Ontology(SO)**라는 공통 어휘 체계를 따릅니다 — 예를 들어 missense_variant(아미노산이 바뀌는 치환), stop_gained(조기 종결 코돈 생성), synonymous_variant(아미노산은 그대로인 침묵 치환) 등입니다.

IMPACT 등급 — 우선순위를 매기는 규칙

VEP는 여러 결과 용어에 HIGH·MODERATE·LOW·MODIFIER 4단계 영향도(IMPACT)를 부여합니다. stop_gained나 스플라이스 부위 변형처럼 단백질 기능을 크게 망가뜨릴 가능성이 높은 것은 HIGH, missense_variantMODERATE, synonymous_variantLOW, 인트론 깊숙한 곳의 변이는 대개 MODIFIER로 분류됩니다. 한 변이가 여러 트랜스크립트에 걸쳐 서로 다른 결과를 낼 수 있으므로(대체 스플라이싱 등), VEP는 트랜스크립트별 결과를 모두 나열하고 그중 가장 심각한 것을 대표값으로 제시합니다.

손 계산 예제: 다중 트랜스크립트 상황

한 유전자에 트랜스크립트 A(변이가 3번째 엑손에 위치, missense_variant → MODERATE)와 트랜스크립트 B(같은 좌표가 인트론에 위치, intron_variant → MODIFIER)가 있다면, VEP는 두 결과를 모두 보고하되 "가장 심각한 결과(most severe consequence)"로 missense_variant를 대표값으로 채택합니다.

대표 결과=argmaxtranscript  IMPACT 순위(consequence)\text{대표 결과} = \arg\max_{\text{transcript}} \; \text{IMPACT 순위}(\text{consequence})

이 대표값만 보고 판단하면 특정 트랜스크립트에서만 심각한 변이를 과대평가하거나, 반대로 임상적으로 중요한 트랜스크립트가 대표값에서 가려질 수 있습니다. 실무에서는 대표값과 함께 전체 트랜스크립트별 결과 목록을 같이 확인하는 것이 안전합니다.

실습: VEP REST API로 변이 주석 확인 (Colab)

python
# Colab에서 실행. Ensembl VEP REST API로 단일 변이의 주석을 조회합니다.
import requests
def vep_annotate(hgvs_notations, species="human"):
url = f"https://rest.ensembl.org/vep/{species}/hgvs"
r = requests.post(
url,
headers={"Content-Type": "application/json", "Accept": "application/json"},
json={"hgvs_notations": hgvs_notations},
timeout=30,
)
r.raise_for_status()
return r.json()
# Ensembl REST 문서의 GRCh38 genomic HGVS 예시
result = vep_annotate(["9:g.22125503G>C"])
for entry in result:
for tc in entry.get("transcript_consequences", []):
print(
f"트랜스크립트: {tc.get('transcript_id')}, "
f"결과: {tc.get('consequence_terms')}, "
f"영향도: {tc.get('impact')}"
)

여러 트랜스크립트에 대해 서로 다른 consequence_terms가 출력되는지 직접 확인해보고, 어떤 트랜스크립트가 대표적으로 참조되는(canonical) 트랜스크립트인지까지 함께 확인하는 습관을 들이는 것이 실무에서 중요합니다.

CS 매핑

  • 구간 트리(interval tree) 조회: 변이 좌표가 어느 엑손·인트론 구간에 속하는지 판정하는 절차는 구간 트리 자료구조의 겹침(overlap) 질의와 동일한 문제입니다.
  • 규칙 기반 분류기: SO 용어를 붙이는 절차는 코돈 변화 패턴에 따라 미리 정의된 규칙을 순서대로 매칭하는 규칙 기반 분류기 구조를 따릅니다.
  • 우선순위 매칭: 여러 트랜스크립트 결과 중 대표값을 고르는 절차는 규칙 엔진에서 여러 규칙이 동시에 매칭될 때 우선순위로 하나를 선택하는 것과 같은 패턴입니다.

자주 만나는 결함

  • 대표 결과(most severe consequence)만 보고 전체 트랜스크립트 결과를 확인하지 않음: 특정 조직에서만 발현되는 트랜스크립트의 결과가 대표값에 가려질 수 있습니다. 임상적으로 중요한 판단에는 전체 트랜스크립트별 결과를 함께 봐야 합니다.
  • IMPACT 등급을 임상적 병원성(pathogenicity)과 동일시: HIGH 등급은 "단백질 서열을 크게 바꿀 가능성이 높다"는 뜻이지, 그 자체로 질병을 일으킨다는 임상적 판정은 아닙니다. 병원성 판정에는 F14(AlphaMissense 등)나 임상 데이터베이스(ClinVar) 교차 확인이 필요합니다.

더 깊게 파고 싶다면

본문은 BPD 연구진이 직접 재구성한 서술입니다.

  • Ensembl VEP 공식 문서: 전체 consequence 용어·IMPACT 분류 규칙 레퍼런스.
  • Sequence Ontology 공식 사이트: missense_variant 등 표준 용어 정의.
  • VEP REST API 문서: 프로그래밍 방식 호출 전체 엔드포인트.

다음 편 D04에서는 이렇게 주석된 변이·유전자가 실제 종양·정상조직 발현 데이터에서 어떻게 보이는지, 공개 데이터베이스 통합 활용을 다룹니다.