본문으로 바로가기

Variant Calling (From reads to short variants)

00. Introduction

전장 유전체 시퀀싱(WGS)은 유전체 전체를 분석하는 포괄적인 방법으로, 해당 튜토리얼에서는 Human 샘플에 대한 WGS 데이터에서 germline 변이 (SNP 및 INDEL)을 발굴하는 과정을 수행합니다.

본 튜토리얼에서 사용할 데이터셋은 미국의 국립표준기술연구소(NIST)의 Genome in a Bottle (GIAB) project 에 포함된 Ashkenazim Trio (아슈케나지 유대인) 데이터입니다.

샘플의 구성은 Son:HG002, Father:HG003 , Mother:HG004로 확인됩니다.

다운로드 링크 : https://github.com/genome-in-a-bottle/giab_data_indexes

education
workflow
01. QC (Quality control)

NGS는 기술적 한계와 실험적 원인에 의한 다양한 오류(error)의 가능성이 있습니다.

NGS 염기서열 분석 결과의 원시 데이터(raw data)에서는 각 base별로 추정 오류 확률을 수치로 나타내며 이를 Phred score라고 불리며 이는 각 염기의 품질을 나타내는 지표로 활용됩니다.

Phred score 20점은 해당 염기서열 결과가 오류일 확률이 1%이라는 것을 의미하며, 30점은 0.1%의 오류 확률을 의미합니다. 일반적으로 Q30 이상의 Phred 점수를 보이는 염기는 시퀀싱 품질이 우수하다고 판단하여 분석에 활용할 수 있습니다.

소개

Phred quality score는 NGS 시퀀싱으로 생성된 fastq 파일에서 각각의 염기가 가지는 품질에 대한 수치를 의미합니다.

DNA, RNA에 대한 염기를 시퀀싱 기계로 읽어 들일 때, 필수적으로 에러가 발생할 수 밖에 없는데, quality score는 에러를 확률적으로 표시해 줍니다.

untitled

출처 : https://bgreat.tistory.com/152

특정 염기가 90% 확률의 정확도를 가진다면, Phred score를 10을 가지며, 99%의 정확도라면 20의 값을 가집니다. 주로 시퀀싱의 품질 기준으로 활용되는 Phred score 30에 대한 값은 염기에 대한 99.9% 정확도를 의미합니다.

염기가 확률을 가진다는 의미는 chemical signal을 digital 신호로 바꾸는 과정에서 오차가 생길 수 있기 때문입니다. 예를 들어, cluster 단위에서는 만약, A가 붉은색, G가 노란색인 경우 cluster의 색이 아주 약간의 노란색이 섞인 붉은색이 관찰된다면 이를 100% A라고 할 수 없기 때문입니다.

각 염기의 확률에 대한 Phred score 값은 숫자 2개로 표현이 가능하나, 각 염기가 한 자리(A,T,G,C)로 표현되기 때문에 Phred score 숫자를 ASCII CODE로 변환하여 한 자리로 표현합니다.

untitled

출처 : https://www.drive5.com/usearch/manual7/quality_score.html

여기서 Q 값은 Phred score 값을 의미하며, ASCII CODE는 Phred score 숫자를 한 자리로 표현한 값이며, P는 base에 대한 시퀀싱 오류가 발생할 확률입니다.

각 시퀀싱 리드(read)의 염기서열과 Phred 점수를 같이 표시한 것을 FASTQ 파일이라 부릅니다. FASTQ 파일은 시퀀스 고유ID, 각 리드의 시퀀스, “+” 기호, 시퀀스의 각 베이스 별 Phred 점수로 된 네 개의 줄로 구성되있습니다. Phred 점수는 ASCII 심볼로 표시합니다.

소개

FASTA 파일은 특정 분자의 서열을 나타내는 데 주로 사용됩니다.

주로 Genome 의 각 chromosome 에 대한 서열을 저장하는 데에 사용되거나, Gene / Transcript / Protein 각각의 염기 서열 및 아미노산 서열을 저장할 때 사용하는 형식입니다.

FASTA 파일의 형태는 NCBI FASTA format의 기준대로 다음과 같이 구성되어 있습니다.

먼저 첫 번째 줄은 “>”에 서열의 이름 / ID 가 기술되며, 주로 “헤더”라고 불립니다.

헤더 다음으로는 그 이름에 해당하는 서열이 나오게 됩니다.

DNA 서열 및 아미노산 모두 한 글자 문자열로 표현되며 일반적으로 한 줄에 서열의 길이가 80자를 넘지 않습니다.

FASTA 입력 중간에는 빈 줄이 허용되지 않습니다.

[FASTA 파일의 예시]

untitled

출처 : https://hhj6212.github.io/biology/tech/2020/08/26/Bioinformatics-fileformats.html

서열(Sequence) 의 표현

서열은 DNA 서열 및 단백질 서열일 수 있으며, 갭(gap) 또는 정렬 문자를 포함할 수 있습니다.

서열은 주로 표준 IUB/IUPAC 의 DNA 및 PROTEIN 코드로 표현됩니다.

[Nucleic Acid 테이블]

education

[Amino acid 테이블]

education

FASTA 파일의 확장자

FASTA 형식의 서열 데이터를 포함하는 텍스트 파일에 대한 표준 파일 확장자는 없습니다.

하지만, 일반적으로 아래 표와 같이 확장자와 그 의미를 사용합니다.

education

소개

FASTQ 파일은 생물학적 서열 데이터와 그 서열의 각 Base 별 품질 점수를 모두 저장하기 위한 텍스트 기반 형식입니다.

주로 NGS (Next generation sequencing data)의 결과를 저장하는 데에 사용됩니다.

즉, NGS 실험을 통한 결과로 cDNA library 서열을 읽어서 데이터를 얻으며, 각 cDNA Library의 염기서열을 알 수 있는데, 그 하나하나의 서열을 “read”라고 표현합니다.

FASTQ 파일은 여러 개의 리드(read) 정보를 한 파일에 저장하게 됩니다.

FASTQ 파일의 형식

FASTQ 파일은 각 서열 당 4개의 줄로 구성되어 있습니다.

  • 첫 번째 줄 (sequence ID) : 주로 @로 시작되며 해당 서열의 이름을 나타냅니다.
  • 두 번째 줄 (sequence) : 실제로 읽은 염기서열 정보입니다.
  • 세 번째 줄 (description) : 주로 “+” 글자 만을 입력하거나 sequence ID 혹은 설명을 포함합니다.
  • 네 번째 줄 (quality) : 각 염기서열이 얼마나 정확히 읽어진 것 인지를 나타냄, 주로 Phred quality score 값으로 표현됩니다.

[FASTQ 파일의 예시]

untitled

출처 : https://hhj6212.github.io/biology/tech/2020/08/26/Bioinformatics-fileformats.html

untitled

출처 : https://blog.naver.com/jinp7/221159593711

01-1. Quality Control

FastQC (https://www.bioinformatics.babraham.ac.uk/projects/fastqc/)

FastQC 프로그램은 NGS 결과 생성된 FASTQ 파일을 입력하여 데이터의 시퀀싱 품질을 평가하는 기능을 제공하는 소프트웨어로, 각 염기별 시퀀싱 품질, GC 컨텐츠, 어댑터 서열 등 원시 데이터에 대한 여러 품질 지표를 그래픽으로 시각화하여 제공합니다. 이를 통해, 사용자는 시퀀싱 데이터의 품질을 직관적으로 확인하고, 필요한 전처리 작업을 결정할 수 있습니다.

주요 활용되는 지표로 Per Base Sequence Quality, Per Sequence Quality Scores, Per Base Sequence Content, Per Base GC Content 등이 있습니다.

  • Input
    • 각 샘플에 대한 raw data file (forward, reverse read)
    • HG002_1.fastq.gz, HG002_2.fastq.gz
    • HG003_1.fastq.gz, HG003_2.fastq.gz
    • HG004_1.fastq.gz, HG004_2.fastq.gz
  • Practice ### FASTQC ### /root/bin/fastqc \ -t 8 \ --outdir ${RESULT_DIR} \ HG002_1.fastq.gz \ /root/bin/fastqc \ -t 8 \ --outdir ${RESULT_DIR} \ HG002_2.fastq.gz \
  • Option Description -o / --outdir [DIR] fastQC 결과 파일을 생성할 디렉터리의 경로 입력 -t / --threads [NUM] 분석 수행을 위하여 사용하는 threads의 수 입력
  • Output
    • 각 read 에 대한 fastqc 의 html 및 zip 파일 생성됨
    • HG002_1_fastqc.html
    • HG002_1_fastqc.zip
    • HG002_2_fastqc.html
    • HG002_2_fastqc.zip
02. Trimming

Trimming은 시퀀싱 데이터 분석의 품질을 높이기 위해 데이터를 정제하는 과정으로, 각 read 말단에서 나타나는 정확도가 낮은 부분을 잘라내고, read의 정확도 점수 평균이 너무 낮거나 염기 서열이 정확히 판정되지 않아 N으로 기록된 위치가 많은 경우 read 전체를 제거합니다.

또한, 라이브러리 제작 과정에서 내부 DNA 서열 길이가 짧은 경우 시퀀싱 장비가 내부 서열을 다 읽은 후 NGS 어댑터 서열을 읽게 되는데, 이 어댑터 부분은 원래 존재하지 않는 서열이므로 분석에 오류를 발생시킬 수 있습니다. 그러므로 read 말단부에서 어댑터(Adapter) 서열이 인식되는 경우 해당 서열을 제거합니다.

untitled

출처 : https://www.celemics.com/ko/resources/blogs/bioinformatics-standard-ngs-data-analysis-pipeline-2/

02-1. Trimming

Trimmomatic (https://github.com/usadellab/Trimmomatic)

원시 데이터에 대한 어댑터 시퀀스 제거 및 품질 낮은 서열을 판독하여 최소 품질 임계값(threshold)을 설정하고 이 수치 아래로 떨어지는 모든 염기를 제거하여 수행합니다.

python 기반인 cutadapt와 달리, Trimmomatic은 java 기반으로 개발되었으며 sickle과 동일하게 슬라이딩 윈도우 알고리즘을 사용하여 고품질의 서열만을 남기는 방식으로 수행됩니다.

  • Input
    • 각 샘플에 대한 RAWDATA FILE (forward, reverse read)
    • FORWARD_READ : HG002_1.fastq.gz
    • REVERSE_READ : HG002_2.fastq.gz
  • Practice java -jar \ ${TRIMMOMATIC_PATH}/trimmomatic-0.39.jar \ PE \ -threads 16 \ -phred33 \ ${RAW_DIR}/HG002_1.fastq.gz \ ${RAW_DIR}/HG002_2.fastq.gz \ ${RESULT_DIR}/HG002.R1.Trim.Paired.fastq.gz \ ${RESULT_DIR}/HG002.R1.Trim.UnPaired.fastq.gz \ ${RESULT_DIR}/HG002.R2.Trim.Paired.fastq.gz \ ${RESULT_DIR}/HG002.R2.Trim.UnPaired.fastq.gz \ ILLUMINACLIP:${ADAPTER_DIR}/TruSeq3-PE.fa:2:30:10 \ LEADING:3 TRAILING:3 SLIDINGWINDOW:4:15 MINLEN:36
  • Option description [SE | PE] 데이터가 single end면 SE, paired end면 PE 선택 -phred33 Phred score 33 ILLUMINACLIP:[FILE]:[NUM]:[NUM]:[NUM] {Adapter 정보가 있는 파일}: {maximum mismatch counts}: {paired end에서 adapter reads간의 일치도}: {single end에서 adapter reads 간의 일치도} LEADING:[NUM] Read의 시작 부분에서 base를 제거할 최소 품질 기준 TRAILING:[NUM] Read의 끝 부분에서 base를 제거할 최소 품질 기준 SLIDING WINDOW:[NUM] {window size}:{평균 quality}, window를 이동시켜 평균 quality 이하로 내려가는 read 제거 MINLEN:[NUM] 유지되어야 할 최소 reads 길이
  • Output
    • 각 샘플별 trimming 이후 결과 파일 (R1, R2에 대한 Paired, UnPaired read)
    • HG002.R1.Trim.Paired.fastq.gz
    • HG002.R1.Trim.UnPaired.fastq.gz
    • HG002.R2.Trim.Paired.fastq.gz
    • HG002.R2.Trim.UnPaired.fastq.gz
03. Alignment

시퀀싱을 수행한 결과, 샘플별로 생성된 FASTQ 파일은 매우 많고 길이가 짧은 리드(read)로 구성되어 있습니다. 이러한 시퀀싱 리드들은 분석 대상 DNA 조각의 염기서열 정보를 나타내지만 어떤 염색체, 어느 위치에 있는 DNA 인지에 대한 정보는 담고 있지 않습니다. 따라서, 각 서열의 위치를 표준 유전체(reference genome)에서 찾아주는 작업이 필요하며, 이를 매핑(mapping) 혹은 정렬(alignment)이라고 합니다.

FASTQ 파일에 대한 매핑이 완료되면 각 시퀀싱 리드 별로 표준 유전체에서의 염색체 번호 및 위치가 기록됩니다. 이 정보를 담고 있는 파일을 SAM (sequence alignment map)이라고 하며, 일반적으로 용량이 크기 때문에 binary 형태로 압축된 BAM(binary alignment map) 파일을 많이 사용합니다.

SAM 혹은 BAM 파일에는 유전체 위치뿐만 아니라 매핑의 정확도를 나타내는 점수(mapping quality, MAPQ), 시퀀싱 리드에서 표준유전체 서열과 다른 염기를 표시해주는 정보(CIGAR string), paired-end 시퀀싱에서 같은 가닥의 반대편 시퀀싱 리드(mate)의 정보 등이 기록됩니다.

untitled

출처 : https://avantonder.github.io/Ghana_course/materials/01-intro_wgs/1.1-intro_wgs.html

  • 정의
    • SAM 파일(Sequence alignment Map)이란 DNA 서열인 FASTQ 파일을 Reference genome 에 정렬했을 때 만들어지는 파일로 SAM 파일에서는 염기서열과 Reference에서의 위치 정보를 알 수 있습니다. untitled
    • SAM 파일은 Header 부분과 Alignment 부분으로 이루어져 있습니다.
      • Header
        • header 부분은 파일에 대한 설명이 포함됩니다 “@”로 시작되는 라인을 의미합니다
      • Alignment
        • Alignment 는 각 read 에 대한 alignment 정보를 제공하는 부분입니다.
        • 필수적인 11개의 column 을 구성되어 있으며 상황에 따라 몇 개의 column이 추가될 수 있습니다. untitled

          출처 : https://hhj6212.github.io/biology/tech/2021/06/13/samtools-flagstat.html

          untitled
        • 각 column에 대한 설명

          1. QNAME : read 이름입니다.

          2. FLAG: 2진수로 된 read alignment 에 대한 설명입니다.

          untitled

          3. RNAME: refernce sequence 의 이름입니다.

          4. POS: reference sequence 에서 align 된 위치입니다.

          5. MAPQ: mapping quality. 즉 얼마나 정확히 align 되었는지 수치료 표현합니다.

          6. CIGAR string: alignment 정보를 표현한 문자열로 Match, Gap 등의 설명을 각 염기마다 표현합니다.

          untitled

          7. RNEXT: 다음 read 의 reference sequence 이름. 주로 paired end read 에 대한 분석을 위해 사용됩니다.

          8. PNEXT: 다음 read 의 align 된 위치. 주로 paired end read 에 대한 분석을 위해 사용됩니다.

          9. TLEN: Template length. paired-end read 둘의 left-end 부터 right-end 까지의 길이입니다.

          10. SEQ: segment sequence. 염기 서열을 나타냅니다.

          11. QUAL: Phread quality score 입니다.

        • BAM(Binary Alignment Map) 파일은 SAM 파일과 동일한 정보를 가지고 있으며, 서로 변환이 가능합니다. 단, 정보를 압축하기 위해 Binary 형태로 저장하였다는 특징을 가지고 있습니다.
03-1. Alignment (Mapping)

BWA (https://github.com/lh3/bwa)

Burrows-Wheeler Aligner(BWA) 알고리즘은 인간 유전체 매핑에 가장 많이 활용되는 알고리즘 중 하나로 BWA-ALN, BWA-SW 및 BWA-MEM 등의 방법으로 구분할 수 있습니다.

BWA-MEM은 70 bp 정도 되는 짧은 길이부터 1 Mb에 이르는 긴 길이의 시퀀싱 리드까지 빠르고 정확하게 매핑이 가능한 것으로 알려져 있습니다.

  • Input
    • 샘플별 trimming 이후 결과 파일 (R1, R2에 대한 Paired read)
    • HG002.R1.Trim.Paired.fastq
    • HG002.R2.Trim.Paired.fastq
  • Practice ${BWA_PATH}/bwa mem \ -t $NCPU \ ${REF_GENOME} \ ${TRIMMED_DIR}/HG002.R1.Trim.Paired.fastq \ ${TRIMMED_DIR}/HG002.R2.Trim.Paired.fastq \ | ${SAMTOOLS_PATH}/samtools view -bS -> ${RESULT_DIR}/HG002.bam ${SAMTOOLS_PATH}/samtools sort \ -@ $NCPU \ -o ${RESULT_DIR}/HG002.sorted.bam \ ${RESULT_DIR}/HG002.bam ${SAMTOOLS_PATH}/samtools index \ -@ $NCPU \ ${RESULT_DIR}/HG002.sorted.bam
  • Option description -t nThreads 멀티스레드 처리를 위해 사용할 thread 수를 지정 -k minSeedLen seed 길이를 지정, 기본 값은 19 -R RGline 리드 그룹을 지정 -c maxOcc 최대 정렬할 리드 수를 지정 -B mmPenalty 갭 페널티(gap open penalty)을 설정, 기본 값은 4
  • Output
    • HG002.sorted.bam : sorting 된 BAM 파일
    • HG002.sorted.bai : sorting 된 BAM 파일의 인덱스
  • 참고 알고리즘

    참고 링크 : https://bioinformaticsandme.tistory.com/2

    인간 유전체 분석에서 alignment 과정은 매우 복잡한 작업입니다.

    시퀀싱을 통해 얻은 read(리드)로 약 30억 개의 전체 염기서열과 매칭하는 것은 쉽지 않습니다. 이로 인해 효율적이고 정확한 매칭을 수행하는 알고리즘과 도구가 필수적입니다.

    untitled

    출처 : https://bioinformaticsandme.tistory.com/2

    NGS 데이터를 alignment하는 프로그램으로 Bowtie와 BWA가 잘 알려져 있으며, 이들 프로그램은 Burrows-Wheeler Transform(BWT) 알고리즘을 주력으로 사용합니다.

    • BWT 알고리즘
      • BWT 알고리즘은 문자열을 효율적으로 변환하는 방법입니다.
      • 변환하고자 하는 문자열(BANANA)의 끝에 토큰($)을 추가합니다.
      • 토큰($)을 포함한 문자열을 왼쪽으로 한 칸씩 이동하며 행렬을 생성합니다.
      • 생성된 행렬의 각 행을 사전순으로 정렬(sorting)합니다(토큰은 맨 마지막 순서).
      • 정렬된 행렬의 맨 마지막 열의 문자들로 변환된 문자열이 생성됩니다(BNN$AAA).
      untitled

      출처 : https://bioinformaticsandme.tistory.com/2

    • BWT 를 이용한 문자열 매칭
      • BWT를 통해 원래 문자열을 복원하거나 특정 패턴을 검색할 수 있습니다.
      • 원래 문자열은 토큰($)을 제외한 ROW 수와 동일하며, 글자 수를 확인할 수 있습니다.
      • 첫 번째 컬럼의 문자는 마지막 컬럼의 바로 뒤에 위치한 문자입니다.
      • $ 토큰은 원래 문자열의 끝에 위치하므로 A가 마지막 글자임을 알 수 있습니다.
        untitled

        출처 : https://bioinformaticsandme.tistory.com/2

      • Last 컬럼과 First 컬럼의 문자 순서는 동일하며, 이를 통해 원래 문자열의 순서를 파악할 수 있습니다.
        untitled

        출처 : https://bioinformaticsandme.tistory.com/2

    • FM-Index
      • Bowtie의 알고리즘인 FM-Index는 BWT 행렬의 Last-First Mapping 법칙을 이용하여 문자열 인덱스를 생성하는 방법입니다.
      untitled

      출처 : https://bioinformaticsandme.tistory.com/2

    • BWA (BWT + Suffix array)
04. Processed BAM file

앞에서 생성한 BAM 파일을 사용하여 샘플별로 참조 유전체 서열과 다른 정확한 변이(SNP, INDEL)을 발굴하기 위해서는 크게 3가지 단계의 절차가 필요합니다.

BAM

출처 : https://hbctraining.github.io/In-depth-NGS-Data-Analysis-Course/sessionVI/lessons/01_alignment.html

04-1. AddOrReplaceReadGroup

BAM 파일에 read group을 추가하고 coordinate 정렬을 수행합니다. 이를 통해 BAM 파일에 포함된 리드가 어떤 샘플에서 유래했는지 식별할 수 있게 해주며, 이후 분석 단계에서 필요한 read group의 정보를 BAM 파일에 포함시킵니다.

참고 링크 : https://gatk.broadinstitute.org/hc/en-us/articles/360037226472-AddOrReplaceReadGroups-Picard

  • Input
    • HG002.sorted.bam : sorting 된 BAM 파일
    • HG002.sorted.bai : sorting 된 BAM 파일의 인덱스
  • Practice java -jar -Djava.io.tmpdir=/ldata/tmp \ -$XMX -XX:+UseParallelGC -XX:ParallelGCThreads=$NCPU ${PICARD_PATH}/picard.jar \ AddOrReplaceReadGroups \ I=${BAM_DIR}/HG002.sorted.bam \ O=${RESULT_DIR}/HG002.sorted.RG.bam \ RGID=HG002 \ RGLB=lib.HG002 \ RGPL=illumina \ RGPU=HG002 \ RGSM=HG002 ${SAMTOOLS_PATH}/samtools index \ ${RESULT_DIR}/${sample_name}.sorted.RG.bam
  • Option description I / INPUT 입력할 BAM 또는 SAM 파일을 지정 O / OUTPUT 수정된 리드 그룹 정보를 포함한 출력 BAM 또는 SAM 파일을 지정 RGID 리드 그룹의 고유 ID를 지정 RGLB 시퀀싱에 사용된 라이브러리의 이름을 지정 RGPL 시퀀싱이 수행된 플랫폼을 지정 RGPU 시퀀싱 플랫폼 유닛을 지정 RGSM 시퀀싱된 샘플의 이름을 지정
  • Output
    • HG002.sorted.RG.bam : Read group을 추가한 sorting 된 BAM 파일
    • HG002.sorted.RG.bai : Read group을 추가한 sorting 된 BAM 파일의 인덱스
04-2. MarkDuplicates

PCR duplicate는 동일한 DNA 분자로부터 증폭된 산물들이 중복되어 포함된 것을 의미합니다. NGS 데이터에서 리드(reads)의 비율이 원래의 DNA 분자들과 최대한 비슷하게 유지되려면, PCR duplicate를 제거해주는 과정이 매우 중요합니다. 이는 duplication을 제거함으로써 변이 비율이 실제 DNA 분자 내에서의 변이 비율과 유사해 질 수 있습니다.

GATK의 MarkDuplicates 도구는 paired-end read의 위치 정보를 바탕으로 원본 DNA의 구조를 유추하여 중복된 데이터를 탐지하고 표시하는 역할을 합니다. 이 과정에서 read와 그 pair에 해당하는 두 개의 5’ position을 비교하여 중복 여부를 결정하며, BARCODE_TAG 옵션을 사용해 분자 바코드를 적용하면 중복 표시가 더 정확하게 이루어집니다. 중복된 리드를 식별한 후에는 각 리드의 base-quality score 값을 합산하여 primary read와 duplicate된 read를 구분합니다. 이를 통해 중복 리드를 정확하게 처리하여 분석의 신뢰성을 높일 수 있습니다.

참고 링크 : https://gatk.broadinstitute.org/hc/en-us/articles/360037052812-MarkDuplicates-Picard

  • Input
    • HG002.sorted.RG.bam : Read group을 추가한 sorting 된 bam 파일
    • HG002.sorted.RG.bai : Read group을 추가한 sorting 된 bam 파일의 인덱스
  • Practice java -jar -Djava.io.tmpdir=/ldata/tmp \ -$XMX -XX:+UseParallelGC -XX:ParallelGCThreads=$NCPU ${PICARD_PATH}/picard.jar \ MarkDuplicates \ I=${RESULT_DIR}/HG002.sorted.RG.bam \ O=${RESULT_DIR}/HG002.sorted.RG.dedup.bam \ M=${RESULT_DIR}/HG002.marked_dup_metrics.txt ${SAMTOOLS_PATH}/samtools index \ {RESULT_DIR}/HG002.sorted.RG.dedup.bam
  • Option description I / INPUT 중복 리드를 찾을 BAM 또는 SAM 파일을 지정 O / OUTPUT 중복 마킹이 완료된 후의 결과 BAM 파일을 지정 M / METRICS_FILE 중복 리드에 대한 통계 정보를 기록할 파일을 지정 REMOVE_DUPLICATES 중복으로 마킹된 리드를 파일에서 실제로 제거할지 여부를 설정, 기본값은 false CREATE_INDEX BAM 파일의 색인 생성 여부를 지정, 기본값은 false
  • Output
    • HG002.sorted.RG.dedup.bam : Read group을 추가하였으며 duplication이 제거된 sorting 된 bam 파일
    • HG002.sorted.RG.dedup.bai : Read group을 추가하였으며 duplication이 제거된 sorting 된 bam 파일의 인덱스
04-3. BQSR (Base Quality Score Recalibration)

즉, 데이터에서 보고된 서열의 정확도 점수 분포를 분석하여 실험적으로 더 정확한 분포를 갖도록 재조정하는 단계로, 사용자가 입력한 Known SNP 위치 정보를 가지고 데이터의 에러율을 다시 계산(BaseRecalibrator)한 후, 이를 반영하여 정확도 점수를 재조정(ApplyBQSR)하는 두 단계로 수행됩니다.

참고 링크 : https://gatk.broadinstitute.org/hc/en-us/articles/360035890531-Base-Quality-Score-Recalibration-BQSR

  • Input
    • HG002.sorted.RG.dedup.bam : Read group을 추가하였으며 duplication이 제거된 sorting 된 bam 파일
    • HG002.sorted.RG.dedup.bai : Read group을 추가하였으며 duplication이 제거된 sorting 된 bam 파일의 인덱스
  • Practice ${GATK_PATH}/gatk --java-options "-Djava.io.tmpdir=/ldata/tmp \ -$XMX -XX:+UseParallelGC -XX:ParallelGCThreads=$NCPU" \ BaseRecalibrator \ -I ${RESULT_DIR}/HG002.sorted.RG.dedup.bam \ -R ${REF_GENOME} \ --known-sites ${KNOWN_VARIANT_PATH}/dbsnp_138.hg38.vcf \ -O ${RESULT_DIR}/HG002.sorted.RG.dedup.recal_table ${GATK_PATH}/gatk --java-options "-Djava.io.tmpdir=/ldata/tmp \ -$XMX -XX:+UseParallelGC -XX:ParallelGCThreads=$NCPU" \ ApplyBQSR \ -R ${REF_GENOME} \ -I ${RESULT_DIR}/HG002.sorted.RG.dedup.bam \ --bqsr-recal-file ${RESULT_DIR}/HG002.sorted.RG.dedup.recal_table \ -O ${RESULT_DIR}/HG002.sorted.RG.dedup.BQSR.bam ${SAMTOOLS_PATH}/samtools index \ {RESULT_DIR}/HG002.sorted.RG.dedup.BQSR.bam
  • Option description -I 입력할 BAM 또는 CRAM 파일을 지정 -R 분석에 사용할 참조 유전체 파일을 지정 --known-sites 시퀀싱 오류를 고려하지 않고 실제 변이를 포함하는 사이트의 VCF 파일을 지정 -O 보정 후 생성될 recalibration 테이블 파일을 지정
  • Output
    • HG002.sorted.RG.dedup.BQSR.bam : Read group을 추가하였으며 duplication이 제거되었고, BSQR을 통해 Base의 quality가 보정된 sorting 된 bam 파일
    • HG002.sorted.RG.dedup.BQSR.bai : Read group을 추가하였으며 duplication이 제거되었고, BSQR을 통해 Base의 quality가 보정된 sorting 된 bam 파일의 인덱스
  • 참고 알고리즘

    참고 링크 : https://bioinformaticsandme.tistory.com/77

    BQSR을 수행하기 위해 필요한 것은 잘 알려진 (Known) SNP VCF 파일입니다.

    그 이유는 BQSR 알고리즘에서 dbSNP에 매칭되지 않는 base는 “에러”로 가정하기 때문입니다.

    1) Finding ERROR

    untitled

    출처 : https://bioinformaticsandme.tistory.com/77

    예제 처럼, 어떤 염색체 위에 0~9 BASE 까지 길이가 10인 리드가 존재한다고 가정합니다.

    ⇒ BQSR 에서 ERROR로 여겨지는 포지션은 3번과 7번입니다.

    • 이는 3번과 7번이 read bases와 ref 에 대한 염기가 다르고, 알려진 db에도 존재하지 않기 때문입니다.

    2) Aggregating the reported phred score

    • 각 base 에 대한 quality score 값인 phred score 를 확률로 변환시킵니다. (0.1+0.079 + 0.079 + 0.01 + 0.006 + 0.006 + 0.001 + 0.01 + 0.01 + 0.01)/10 = 0.0401
    • 이것을 다시 phred score 값으로 변환하면, phred score = -10*log10(0.0401) ~= 14 입니다..
    • 따라서, 예제에 확인되는 read 에 대한 phred score는 약 14입니다.

    3) Calculating the empirical phred score

    • 10개의 염기 중에서 2개를 에러로 가정하였으므로, 시퀀스는 약 2/10 = 0.2의 에러 확률을 가집니다.
    • 이를 phred score 값으로 변환하면 -10 * log10(0.2) ~= 7 (empirical phred score)
    • empirical phred score 값이 7 정도의 에러가 있다면, 원래 관찰된 phred score 는 이미 +7 정도의 에러가 더해진 값이라고 생각 할 수 있으므로, phred score 값을 -7로 진행하여 recalibration 을 진행합니다.
    untitled

    출처 : https://bioinformaticsandme.tistory.com/77

05. Variant Calling

SAM/BAM 파일이 생성되면 각 시퀀싱 리드를 분석하여 특정 위치에서 표준 유전체 서열과 다른 변이(variation)가 있는지 찾아내는 변이 검출(variant calling) 작업을 수행합니다. 이 과정에서 한 위치에 여러 개의 시퀀싱 리드를 종합하여 변이가 있는지 확률적으로 판단하게 됩니다.

  • 정의
    • VCF(Variant Call Format)는 유전적 변이를 저장하고 전송하기 위한 표준 파일 형식으로, 주로 DNA 시퀀스 데이터를 기반으로 한 변이 호출 정보를 담고 있습니다.
      image_1

      출처 : https://www.researchgate.net/figure/Sample-VCF-File-Structure_fig2_347069472

    • VCF 파일은 주석(header) 부분과 데이터 부분으로 나뉘어 있습니다.
      • Header : 파일의 메타데이터와 형식 정보를 포함하며, 각 변이에 대한 정보를 정의하는 다양한 필드와 그 의미를 설명합니다.
      • Body : 각 변이의 정보(예: 위치, 변이 유형 등)를 행 단위로 저장합니다.
    • 각 변이에 대한 정보는 다음과 같은 필드를 포함합니다.
      image_2

      출처 : https://davetang.github.io/learning_vcf_file/

      • CHROM: 변이가 발생한 염색체의 이름
      • POS: 변이가 발생한 위치
      • ID: 변이에 대한 고유 식별자
      • REF: 참조 염기 서열
      • ALT: 대체 염기 서열 (변이)
      • QUAL: 변이에 대한 신뢰도 점수
      • FILTER: 필터링 정보
      • INFO: 추가적인 정보(예: 변이의 생물학적 영향 등)
      • FORMAT: 샘플 데이터의 형식 정보를 제공하며, 각 샘플의 변이 정보를 포함.

NGS 데이터를 이용하여 발굴할 수 있는 변이는 크게 두 가지로 구분할 수 있습니다.

바로 Germline mutation(생식세포 돌연변이)와 Somatic mutation(체세포 돌연변이)입니다.

image_3
05-1. Germline short variant (SNP, INDEL) 을 발굴하기 위한 단계
untitled_20

출처 : https://2wordspm.wordpress.com/2019/03/08/ngs-분석-파이프-라인의-이해-gatk-best-practice/

1) HaplotypeCaller (GVCF mode) : 변이 호출

HaplotyperCaller 는 활성화된 영역에서 haplotype의 local denovo 어셈블리를 통해 SNP와 INDEL을 동시에 호출할 수 있습니다. 즉, 해당 프로그램이 변이에 대한 징후를 보이는 영역을 발견할 때마다 기존 매핑 정보를 폐기하고, 해당 영역에 매핑되는 리드(read)를 재조립하여 서로 가까이 있는 다른 유형의 변이에 대해 더 정확하게 호출할 수 있다는 장점을 가지고 있습니다.

GVCF mode 는 genetic VCF 형태로 no-variant block record를 포함하여 모든 position 에 대한 정보를 가지고 있습니다. 이를 통해 추가적인 분석을 통해 생성되는 샘플을 확장하고자 할 때 기존 VCF mode 에서는 N+1개 샘플에 대한 변이 호출을 모두 다시 수행해야 했다면 GVCF mode는 추가된 1개의 샘플만 분석을 진행하고 결과를 합치는 방향으로 분석을 수행할 수 있습니다.

untitled_21

출처 : https://bpb-us-w2.wpmucdn.com/sites.wustl.edu/dist/e/1646/files/2018/09/Helminth_Bioinformatics_Workshop_2015_VARIOME-2f605p7.pdf

  • Input
    • HG002.sorted.RG.dedup.BQSR.bam : Read group을 추가하였으며 duplication이 제거되었고, BSQR을 통해 Base의 quality가 보정된 sorting 된 bam 파일
    • HG002.sorted.RG.dedup.BQSR.bai : Read group을 추가하였으며 duplication이 제거되었고, BSQR을 통해 Base의 quality가 보정된 sorting 된 bam 파일의 인덱스
  • Practice ${GATK_PATH}/gatk --java-options "-Djava.io.tmpdir=/ldata/tmp \ -$XMX -XX:+UseParallelGC -XX:ParallelGCThreads=$NCPU" \ HaplotypeCaller \ -R ${REF_GENOME} \ -I ${BAM_DIR}/HG002.sorted.RG.dedup.BQSR.bam \ --emit-ref-confidence GVCF -O ${RESULT_DIR}/HG002.raw.g.vcf
  • Option description -I 변이를 호출할 BAM 또는 CRAM 파일을 지정 -R 분석에 사용할 참조 유전체 파일을 지정 --emit-ref-confidence 참조 서열에 대한 신뢰도 정보를 출력할 방법 설정 NONE 신뢰도 정보를 출력하지 않음 GVCF 신뢰도 정보를 포함하여 gVCF 파일로 출력 BP_RESOLUTION 각 염기 위치에 대한 신뢰도 정보를 출력 -O 호출된 변이 정보를 저장할 VCF 파일을 지정
  • Output
    • 각 샘플별 GVCF 형태의 VCF 파일 : HG002.raw.g.vcf

2) GenotypeGVCFs : 샘플이 가진 변이 호출

HaplotyperCaller GVCF 모드를 통해 생성한 GVCF 파일은 일반 VCF 파일과는 달리, 각 샘플에서 변이 여부에 관계없이 모든 위치에 대한 정보를 포함하고 있으므로 특정 샘플이 가진 변이만을 호출하기 위해, GenotypeGVCFs를 수행해야 합니다.

  • Input
    • 각 샘플별 GVCF 형태의 VCF 파일 : HG002.raw.g.vcf
  • Practice ${GATK_PATH}/gatk --java-options "-Djava.io.tmpdir=/ldata/tmp \ -$XMX -XX:+UseParallelGC -XX:ParallelGCThreads=$NCPU" \ GenotypeGVCFs \ -R ${REF_GENOME} \ -V ${RESULT_DIR}/HG002.raw.g.vcf \ -O ${RESULT_DIR}/HG002.genotyped.vcf
  • Option description -R 분석에 사용할 참조 유전체 파일을 지정 -V 입력 GVCF 파일 (하나 이상의 GVCF파일을 지정할 수 있음) -O 출력할 VCF 파일을 지정
  • Output
    • 특정 샘플이 가진 변이만을 포함한 VCF 형태의 파일 : HG002.genotyped.vcf

3) SNP, INDEL 파일로의 구분

사용자는 VCF 파일에서 SNP와 INDEL을 구분하거나 특정한 변이 타입만을 선택 및 필터링을 진행할 수 있습니다.

  • Input
    • 특정 샘플이 가진 변이만을 포함한 VCF 형태의 파일 : HG002.genotyped.vcf
  • Practice ### Seperate SNP ### ${GATK_PATH}/gatk --java-options "-Djava.io.tmpdir=/ldata/tmp \ -$XMX -XX:+UseParallelGC -XX:ParallelGCThreads=$NCPU" \ SelectVariants \ -R ${REF_GENOME} \ -V ${RESULT_DIR}/HG002.genotyped.vcf \ --select-type-to-include SNP \ -O ${RESULT_DIR}/HG002.snp.vcf ### Seperate indel ### ${GATK_PATH}/gatk --java-options "-Djava.io.tmpdir=/ldata/tmp \ -$XMX -XX:+UseParallelGC -XX:ParallelGCThreads=$NCPU" \ SelectVariants \ -R ${REF_GENOME} \ -V ${RESULT_DIR}/HG002.genotyped.vcf \ --select-type-to-include INDEL \ -O ${RESULT_DIR}/HG002.indel.vcf
  • Option description -R 분석에 사용할 참조 유전체 파일을 지정 -V 입력 GVCF 파일 --select-type-to-include VCF 파일에서 선택하고자 하는 변이 (예: SNP, INDEL) -O 출력할 VCF 파일을 지정
  • Output
    • 특정 샘플이 가진 SNP, INDEL 변이를 포함하는 VCF 파일 : HG002.snp.vcf, HG002.indel.vcf

4) Hard filtering

GATK Hard Filtering은 변이 호출 후 품질 기준에 따라 변이를 필터링하는 방법입니다. 사용자가 지정한 값에 따라 변이의 품질을 평가하고 품질이 낮은 변이를 "filtered"로 표시하여 결과에서 제외할 수 있게 해줍니다.

  • Input
    • 특정 샘플이 가진 SNP, INDEL 변이를 포함하는 VCF 파일 : HG002.snp.vcf, HG002.indel.vcf
  • Practice ### Apply the filter to SNP ### ${GATK_PATH}/gatk --java-options "-Djava.io.tmpdir=/ldata/tmp \ -$XMX -XX:+UseParallelGC -XX:ParallelGCThreads=$NCPU" \ VariantFiltration \ -R ${REF_GENOME} \ -V ${RESULT_DIR}/HG002.snp.vcf \ --filter-expression "QD < 2.0 || FS > 60.0 || MQ < 40.0 || MQRankSum < -12.5 || ReadPosRankSum < -8.0" \ --filter-name "HARD_FILTER" \ -O ${RESULT_DIR}/HG002.snp.hard_filtered.vcf ### Apply the filter to indel ### ${GATK_PATH}/gatk --java-options "-Djava.io.tmpdir=/ldata/tmp \ -$XMX -XX:+UseParallelGC -XX:ParallelGCThreads=$NCPU" \ VariantFiltration \ -R ${REF_GENOME} \ -V ${RESULT_DIR}/HG002.indel.vcf \ --filter-expression "QD < 2.0 || FS > 200.0 || ReadPosRankSum < -20.0" \ --filter-name "HARD_FILTER" \ -O ${RESULT_DIR}/HG002.indel.hard_filtered.vcf
  • Option description -R 분석에 사용할 참조 유전체 파일을 지정 -V 입력 GVCF 파일 --filter-name 필터 기준을 충족하지 못하는 변이에 적용할 이름 --filter-expression 필터링 기준을 정의하는 식(expression). -O 필터링된 결과에 대한 VCF 파일을 지정
  • Output
    • 사용자의 기준에 따라 필터링이 완료된 특정 샘플이 가진 SNP, INDEL 변이를 포함하는 VCF 파일 : HG002.snp.hard_filtered.vcf, HG002.indel.hard_filtered.vcf
05-2. Somatic short variant (SNP, INDEL) 을 발굴하기 위한 단계
untitled_22

출처 : https://medium.com/intern-in-nhri/nsclc-somatic-variants-analysis-2-somatic-variants-analysis-73e241ee064f

0) CreateSomaticPanelOfNormals

Somatic variant calling 분석 시작 전, germline 및 artifact variant를 제거하기 위해 Panel Of Normal (PON)을 생성하는 과정으로, 하나 이상의 Normal sample을 대상으로 Mutect의 tumor-only mode를 수행하여 생성합니다.

  • Input
    • ${CONTROL_1}.sorted.RG.dedup.BQSR.bam : normal_1 샘플에 대한 bam 파일
    • ${CONTROL_2}.sorted.RG.dedup.BQSR.bam : normal_2 샘플에 대한 bam 파일
  • Practice ### PON File 생성 ### ${GATK_PATH}/gatk --java-options "-Djava.io.tmpdir=/ldata/tmp \ Mutect2 \ -R ${REF_GENOME} \ -I ${NORMAL_BAM_DIR}/${CONTROL_1}.sorted.RG.dedup.BQSR.bam \ -tumor ${CONTROL_1} \ --disable-read-filter MateOnSameContigOrNoMappedMateReadFilter \ --germline-resource ${DB_PATH}/af-only-gnomad.raw.sites.hg19.vcf.gz \ -O ${CONTROL_1}.PON.vcf.gz ${GATK_PATH}/gatk --java-options "-Djava.io.tmpdir=/ldata/tmp \ Mutect2 \ -R ${REF_GENOME} \ -I ${NORMAL_BAM_DIR}/${CONTROL_2}.sorted.RG.dedup.BQSR.bam \ -tumor ${CONTROL_2} \ --disable-read-filter MateOnSameContigOrNoMappedMateReadFilter \ --germline-resource ${DB_PATH}/af-only-gnomad.raw.sites.hg19.vcf.gz \ -O ${CONTROL_2}.PON.vcf.gz ### CreateSomaticPanelOfNormals ### ${GATK_PATH}/gatk --java-options "-Djava.io.tmpdir=/ldata/tmp" \ CreateSomaticPanelOfNormals \ --vcfs ${CONTROL_1}.PON.vcf.gz \ --vcfs ${CONTROL_2}.PON.vcf.gz \ -O ${NORMAL_BAM_DIR}/${CONTROL}.PON.vcf.gz
  • Option description -R 분석에 사용할 참조 유전체 파일을 지정 -I 분석할 BAM 또는 CRAM 파일을 지정 -tumor 분석할 종양 샘플의 ID를 지정 --disable-read-filter 기본적으로 활성화된 리드 필터 중 일부를 비활성화 --germline-resource 체세포 변이를 탐지할 때 참조할 알려진 생식세포 변이(germline variant) 리소스 파일을 지정 -O 필터링된 변이 결과를 저장할 VCF 파일을 지정
  • Output
    • ${CONTROL}.pon.vcf.gz : Normal sample에 대한 Panel Of Normal (PON) 파일

1) Variant calling (Mutect2)

HaplotypeCaller와 마찬가지로, Mutect2는 활성 영역에서 haplotype의 로컬 de-novo 어셈블리 방식을 통해 SNV와 indel을 동시에 호출합니다. 즉, Mutect2가 체세포 변이의 징후를 보이는 영역을 발견하면 기존 매핑 정보를 폐기하고 해당 영역에서 판독을 완전히 재조립하여 후보 변이에 대한 haplotype을 생성합니다. Mutect2는 Pair-HMM 알고리즘을 통해 각 판독을 각 haplotype에 맞춰 likelihood 행렬을 얻습니다. 마지막으로 Bayesian somatic likelihoods 모델을 적용하여 시퀀싱 오류에 비해 대립유전자가 체세포 변이가 될 log odds를 얻습니다.

  • Input
    • ${CONTROL}.pon.vcf.gz : Normal sample에 대한 Panel Of Normal (PON) 파일
    • ${sample_name}.sorted.RG.dedup.BQSR.bam : Read group을 추가하였으며 duplication이 제거되었고, BSQR을 통해 Base의 quality가 보정된 sorting 된 bam 파일
  • Practice ${GATK_PATH}/gatk --java-options "-Djava.io.tmpdir=/ldata/tmp" \ Mutect2 \ -R ${REF_GENOME} \ -I ${TUMOR_BAM_DIR}/${sample_name}.sorted.RG.dedup.BQSR.bam \ -tumor ${sample_name} \ -I ${NORMAL_BAM_DIR}/${CONTROL}.sorted.RG.dedup.BQSR.bam \ -normal ${CONTROL} \ --germline-resource ${DB_PATH}/af-only-gnomad.raw.sites.hg19.vcf.gz \ --panel-of-normals ${NORMAL_BAM_DIR}/${CONTROL}.pon.vcf.gz \ --af-of-alleles-not-in-resource 0.0000025 \ --disable-read-filter MateOnSameContigOrNoMappedMateReadFilter \ --f1r2-tar-gz ${RESULT_DIR}/${sample_name}.f1r2.tar.gz \ -O ${RESULT_DIR}/${sample_name}.somatic.Mutect2.raw.vcf.gz
  • Option description -R 분석에 사용할 참조 유전체 파일을 지정 -I 분석할 BAM 또는 CRAM 파일을 지정 -tumor 분석할 종양 샘플의 ID를 지정 -normal (선택 사항) 분석할 정상 샘플의 ID를 지정 --disable-read-filter 기본적으로 활성화된 리드 필터 중 일부를 비활성화 --germline-resource 체세포 변이를 탐지할 때 참조할 알려진 생식세포 변이 (germline variant) 리소스 파일을 지정 --af-of-alleles-not-in-resource 리소스에 포함되지 않은 대립유전자의 가상 대립유전자 빈도(allele frequency)를 지정 --f1r2-tar-gz F1R2 통계 데이터를 저장할 파일을 지정(LearnReadOrientationModel 도구에 입력) -O 필터링된 변이 결과를 저장할 VCF 파일을 지정
  • Output
    • ${sample_name}.somatic.Mutect2.raw.vcf.gz : 각 샘플별 somatic raw variant 파일

2) Calculate Contamination

Contamination을 제거하기 위하여 두 가지 단계를 진행합니다.

먼저, GetPileupSummaries 는 입력된 샘플의 BAM 파일에서 기존에 알려진 Germline VCF의 allele frequency (예. gnomAD VCF) 위치를 비교하여 ref_count, alt_count, allele_frequency 등을 계산하여 table을 구성합니다.

CalculateContamination 는 앞서 GetPileupSummaries 의 결과에서 확인된 Germline variant 정보를 바탕으로 cross-sample contamination이 발생할 수 있는 read 비율을 계산합니다.

FilterMutectCalls 는 CalculateContamination 을 통해 계산된 contam 으로 인해 발생한 variant 를 필터링합니다.

  • Input
    • ${sample_name}.somatic.Mutect2.raw.vcf.gz : 각 샘플별 somatic raw variant 파일
  • Practice ### GetPileupSummaries ### ${GATK_PATH}/gatk --java-options "-Djava.io.tmpdir=/ldata/tmp" \ GetPileupSummaries \ -I ${TUMOR_BAM_DIR}/${sample_name}.sorted.RG.dedup.BQSR.bam \ -V ${DB_PATH}/small_exac_common_3.hg38.vcf.gz \ -O ${RESULT_DIR}/${sample_name}.tumor_getpileupsummaries.table ### CalculateContamination ### ${GATK_PATH}/gatk --java-options "-Djava.io.tmpdir=/ldata/tmp" \ CalculateContamination \ -I ${RESULT_DIR}/${sample_name}.tumor_getpileupsummaries.table \ -O ${RESULT_DIR}/${sample_name}.tumor_calculatecontamination.table ### FilterMutectCalls ### ${GATK_PATH}/gatk --java-options "-Djava.io.tmpdir=/ldata/tmp" \ FilterMutectCalls \ -V ${RESULT_DIR}/${sample_name}.somatic.Mutect2.raw.vcf.gz \ --contamination-table ${RESULT_DIR}/${sample_name}.tumor_calculatecontamination.table \ -O ${RESULT_DIR}/${sample_name}.somatic.Mutect2.contam_filtered.vcf.gz
  • Option description -V 필터링할 변이 호출이 포함된 VCF 파일을 지정 --contamination-table 샘플의 오염도를 나타내는 테이블 파일을 지정 -O 필터링된 변이 호출을 저장할 VCF 파일을 지정
  • Output
    • ${sample_name}.somatic.Mutect2.contam_filtered.vcf.gz : contam 제거한 somatic vcf 파일
05-3. 한 개 이상의 샘플에 대한 변이 통합 분석

1) Consolidate GVCFs (GenomicDBImport) : 변이 결과 통합

하나의 샘플이 아닌 여러 개의 샘플에 대한 genotype을 한 번에 확인하기 위해 여러 샘플의 GVCF 파일을 통합하는 과정으로, GATK4 이전에는 CombineGVCFs 라는 방식으로 통합하였으나, 해당 방식은 파일을 생성하는 대신에 데이터 저장소를 생성하는 방식을 통해 성능이 높였습니다.

  • Input
    • 여러 개의 GVCF 형태의 VCF 파일 예시 : HG002.raw.g.vcf.gz, HG003.raw.g.vcf.gz, HG004.raw.g.vcf.gz
  • Practice ### GenoicDBImport ### for j in {1..22} X Y M; ${GATK_PATH}/gatk \ --java-options -Xmx8g \ GenomicsDBImport \ -R ${REF_GENOME} \ -genomicsdb-workspace-path chr${j}_gdb \ --tmp-dir ${TEMP_DIR} \ --merge-input-intervals true \ --max-num-intervals-to-import-in-parallel 3 \ -L chr${j} \ --genomicsdb-shared-posixfs-optimizations true \ --batch-size 50 \ -V HG002.raw.g.vcf.gz \ -V HG003.raw.g.vcf.gz \ -V HG004.raw.g.vcf.gz;
  • Option description -R 분석에 사용할 참조 유전체 파일을 지정 --genomicsdb-workspace-path 통합된 gVCF 데이터베이스가 저장될 디렉터리 경로를 지정 --intervals / -L 데이터를 결합할 유전체 영역을 지정 --batch-size 한 번에 처리할 샘플의 최대 수를 지정 (Default : 50) --genomicsdb-shared-posixfs-optimizations 공유 POSIX 파일 시스템을 사용한 최적화를 활성화하는 옵션 --max-num-intervals-to-import-in-parallel 병렬로 동시에 가져올 최대 간격(유전체 구간) 수를 지정 --merge-input-intervals 지정된 간격이 서로 겹치는 경우 자동으로 병합하여 처리할지 여부를 지정
  • Output
    • 1 ~ 22번, X, Y, M 에 해당하는 chr${j}_gdb 데이터베이스

2) Join-Call cohort (GenotypeGVCFs) : 샘플이 가진 변이만을 호출

특정 샘플의 GVCF 또는 많은 수의 샘플이 결합된 GVCF를 대상으로 샘플(들)이 가진 변이 정보만을 필터링하여 파일을 구성합니다. 이를 통해 필터링할 준비가 된 공동 호출 SNP 및 indel 호출 세트가 생성되며 모든 샘플에서 모든 관심 부위에 대한 정보를 제공합니다.

이 프로세스는 매우 빠르게 진행되며 특정 샘플이 코호트(N개)에 추가될 때 언제든지 다시 실행할 수 있으므로 소위 N+1 문제가 해결할 수 있습니다.

untitled_23

출처 : https://www.biostars.org/p/366846/

  • Input
    • 1 ~ 22번, X, Y, M 에 해당하는 chr${j}_gdb 데이터베이스
  • Practice ${GATK_PATH}/gatk --java-options "-Djava.io.tmpdir=/ldata/tmp" \ -$XMX -XX:+UseParallelGC -XX:ParallelGCThreads=$NCPU" \ GenotypeGVCFs \ -R ${REF_GENOME} \ -V gendb://chr1_gdb \ -O ${RESULT_DIR}/chr1.vcf.gz ${GATK_PATH}/gatk --java-options "-Djava.io.tmpdir=/ldata/tmp" \ -$XMX -XX:+UseParallelGC -XX:ParallelGCThreads=$NCPU" \ GenotypeGVCFs \ -R ${REF_GENOME} \ -V gendb://chr2_gdb \ -O ${RESULT_DIR}/chr2.vcf.gz ...(chr 3부터 22 진행 필요) #### merge vcf #### java -jar -Djava.io.tmpdir=/ldata/tmp \ -$XMX -XX:+UseParallelGC -XX:ParallelGCThreads=$NCPU ${PICARD_PATH}/picard.jar \ GatherVcfs \ I=chr1.vcf.gz I=chr2.vcf.gz I=chr3.vcf.gz I=chr4.vcf.gz I=chr5.vcf.gz I=chr6.vcf.gz I=chr7.vcf.gz I=chr8.vcf.gz I=chr9.vcf.gz I=chr10.vcf.gz I=chr11.vcf.gz I=chr12.vcf.gz I=chr13.vcf.gz I=chr14.vcf.gz I=chr15.vcf.gz I=chr16.vcf.gz I=chr17.vcf.gz I=chr18.vcf.gz I=chr19.vcf.gz I=chr20.vcf.gz I=chr21.vcf.gz I=chr22.vcf.gz I=chrX.vcf I=chrY.vcf.gz I=chrM.vcf.gz \ O=FAMILY.merged.vcf.gz
  • Option description -R 분석에 사용할 참조 유전체 파일을 지정 -V 입력으로 사용할 gVCF 파일이나 GenomicsDB 워크스페이스를 지정 -O 최종 호출된 변이 정보를 저장할 VCF 파일을 지정
  • Output
    • FAMILY.merged.vcf.gz : chr을 모두 모아서 구성된 vcf 파일

3) Variant Quality Score Recalibration (VQSR) : 변이 품질 재조정

머신 러닝을 활용하여 훈련 세트의 변이 정보의 프로필을 모델링하고 이를 바탕으로 변이 호출에서 생성될 수 있는 artifact를 필터링하기 위하여 각 변이에 대한 품질 점수를 재조정하는 방식입니다.

핵심은 이미 잘 알려지고 검증된 변이 리소스(OMNI, 1000 Genomes, hapmap 등)를 사용하여 현재 변이 호출 결과에서 정답으로 확신할 수 있는 변이 집합과 그렇지 않은 집합을 선택한 후, 변이에 대한 정보를 기반으로 모델링하여 모든 변이에 적용하는 것입니다. 이를 통해 각 변이에 대한 품질점수를 산출할 수 있습니다. 즉 실제일 가능성이 높은 변이의 주석 프로필을 식별하고 호출자가 계산한 품질 점수(QUAL)보다 훨씬 더 신뢰할 수 있는 VQSLOD 점수를 각 변이에 할당합니다. 이 변이 품질 점수(VQSLOD)를 사용하여 원시 변이 세트를 필터링하고, 원하는 수준의 품질을 가진 변이들의 하위 세트를 생성하며, 특이성과 민감성의 균형을 맞추도록 미세 조정합니다.

  • Input
    • FAMILY.merged.vcf.gz : chr을 모두 모아서 구성된 vcf 파일
  • Practice ${GATK_PATH}/gatk VariantRecalibrator \ -R ${REF_GENOME} \ -V ${WORKING_DIR}/FAMILY.merged.vcf.gz \ --resource:hapmap,known=false,training=true,truth=true,prior=15.0 hapmap_3.3.sites.vcf \ --resource:omni,known=false,training=true,truth=true,prior=12.0 1000G_omni2.5.sites.vcf \ --resource:1000G,known=false,training=true,truth=false,prior=10.0 1000G_phase1.snps.high_confidence.sites.vcf \ --resource:dbsnp,known=true,training=false,truth=false,prior=2.0 dbsnp_138.vcf \ -an DP -an QD -an MQ -an MQRankSum -an ReadPosRankSum -an FS -an SOR \ -mode SNP \ -O FAMILY.merged.cohort_SNP.recal \ --tranches-file FAMILY.merged.cohort_SNP.tranches ${GATK_PATH}/gatk ApplyVQSR \ -R ${REF_GENOME} \ -V ${WORKING_DIR}/FAMILY.merged.vcf.gz \ --truth-sensitivity-filter-level 99.0 \ --tranches-file FAMILY.merged.cohort_SNP.tranches \ --recal-file FAMILY.merged.cohort_SNP.recal \ -mode SNP \ -O FAMILY.merged.cohort.genotyped.VQSR.snp.vcf
  • Option description -V 변이 정보를 포함한 VCF 파일을 지정 -R 분석에 사용할 참조 유전체 파일을 지정 --mode 재조정할 변이의 종류를 지정 SNP SNP(단일 염기 다형성)를 재조정 INDEL InDel(삽입 및 결실)을 재조정 BOTH SNP와 InDel을 동시에 재조정 --resource 모델 학습에 사용할 외부 변이 데이터(리소스)를 지정
  • Output
    • FAMILY.merged.cohort.genotyped.VQSR.snp.vcf : 해당 cohort에서의 SNP 수행결과
  • Recalibration model을 만들기 위한 resource
    • 참고 링크 : https://github.com/broadgsa/gatk/blob/master/doc_archive/tutorials/(howto)_Recalibrate_variant_quality_scores_=_run_VQSR.md
    • HapMap (truth=true, training=true)
      • SNP call set that has been validated to a very high degree of confidence
    • Omni (truth=true, training=true)
      • a set of polymorphic SNP sites produced by the Omni genotyping array
    • 1000G (truth=false, training=true)
      • a set of high-confidence SNP sites produced by the 1000 Genomes Project
    • dbSNP (truth=false, training=false, known=true)
      • a SNP call set that has not been validated to a high degree of confidence
      • 이 데이터 세트를 통해 dbSNP에 변이가 있는지 여부를 판단합니다
06. Annotate variants

Germline, Somatic Variant calling을 통해 획득한 변이(variant)에 대한 정보를 파악하기 위하여 refGene, 1000genome, dbnsfp 등의 잘 알려진 변이 데이터베이스를 통해 각 변이들에 대한 주석 정보를 추가하는 것입니다. 이를 통해 pathogenic, benign 한 변이들을 구분할 수 있어 질병에 원인이 되는 변이를 추출할 수 있습니다.

06-1. ANNOVAR Annotation

ANNOVAR : https://annovar.openbioinformatics.org/en/latest/

원본 이미지가 없음.

출처 : https://medium.com/humanscape-tech/%EC%9C%A0%EC%A0%84%EC%B2%B4-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B6%84%EC%84%9D-3-annovar-1e54b961f264

ANNOVAR 는 다양한 유전체(인간 hg18, hg19, hg38, hs1(T2T-CHM13) 및 마우스, 벌레, 파리, 효모 등)에서 검출된 유전적 변이에 기능적으로 주석을 달기 위해 최신 정보를 활용하는 효율적인 프로그램으로 변이에 대한 Chr, start position, end position, ref allele, alt allele 등의 정보를 통해 분석을 수행할 수 있습니다.

1) convert2annovar.pl 을 통한 annovar input 파일로 변환

1. VCF 파일에 있는 변이를 ANNOVAR이 이해할 수 있는 간단한 텍스트 형식으로 변환 합니다. 이 변환된 파일은 이후 ANNOVAR 주석을 실행할 때 입력으로 사용됩니다.

2) table_annovar.pl 을 통한 annotation 수행 방법

1. gene-based : SNP 또는 CNV가 단백질 코딩 변화를 일으키는지 여부와 영향을 받는 아미노산을 식별하여 주석 정보를 추가합니다 (RefSeq 유전자, UCSC 유전자, ENSEMBL 유전자, GENCODE 유전자 등을 활용합니다)

2. position-based : 44개 종 간의 conserved region, 예측 전사 인자 결합 부위, CNV 영역, GWAS 정보, 변이 데이터베이스, DNAse I, ENCODE 의 히스톤 정보, ChIP-Seq peak 등 많은 주석 등 특정 게놈 영역의 변이를 식별할 수 있습니다.

3. filter-based : 특정 데이터베이스에 기록된 변이를 식별하여 대립 유전자의 빈도 혹은 단백질 계수( SIFT/PolyPhen/FATHMM/MetaSVM/MetaLR 점수)를 통해 변이에 대한 주석을 추가할 수 있습니다.

  • Input
    • germline, somatic variant vcf 파일 : HG002.snp.PASS.vcf
  • Practice # 1) convert2annovar.pl 을 통한 annovar input 파일로 변환 ### convert2annovar input ### ${ANNOVAR_PATH}/convert2annovar.pl \ HG002.snp.PASS.vcf \ -format vcf4 \ > HG002.snp.PASS.step1 # 2) table_annovar.pl 을 통한 Annotation 수행 ### MAF >= 0.1, 1000Genome, polyphen ### ${ANNOVAR_PATH}table_annovar.pl \ HG002.snp.PASS.step1 \ -buildver hg38 \ -remove \ -out HG002 \ -protocol refGene,1000g2015aug_all,dbnsfp35a,exac03,gnomad_genome,gnomad_exome,esp6500siv2_all \ -operation g,f,f,f,f,f,f
  • Option description -out 생성할 출력 파일의 이름을 지정 -protocol 사용할 주석 데이터베이스를 지정 -operation 각 데이터베이스에 대해 수행할 작업 유형을 지정 -remove 분석 완료 후 중간 산출물 삭제 -buildver 특정 유전체 빌드 버전을 명시
  • Output
    • HG002.hg38_multianno.txt : 각 변이에 대해 annotation 된 텍스트 파일

RNA-seq analysis

00. RNA-seq Overview

RNA 시퀀싱(RNA sequencing)은 차세대 유전체 분석 기술(Next Generation Sequencing, NGS)을 이용해 DNA로부터 전사된 모든 RNA 전사체(transcriptome)의 염기서열을 분석하는 기술입니다.

RNA 시퀀싱의 주요 목적 중 하나는 두 가지 이상의 생물학적 조건 간 차등적으로 발현되는 유전자(DEG, Differentially Expressed Gene) 또는 분자 경로를 식별하여 유전자 발현을 프로파일링하는 것입니다.

DNA가 RNA로 전사되고 RNA가 단백질로 번역된다는 기본 원리에 따라, 특정 유전자의 RNA 양이 많을수록 해당 유전자의 발현 수준이 높다고 판단할 수 있습니다. RNA 염기서열 분석을 통해 특정 샘플의 유전자 발현량과 발현 양상을 파악할 수 있습니다.

RNA 시퀀싱은 염기서열 변이, 대체 RNA 스플라이싱(alternative RNA splicing), 유전자 융합(gene fusion), 단일 염기 다형성(Single Nucleotide Polymorphism, SNP)과 같은 정보를 탐지할 수 있습니다. 이를 통해 RNA 전사체 수준에서 발생하는 변이와 발현 양상을 분석하며, 특히 대체 스플라이싱 이소폼과 유전자 융합 이벤트를 확인하는 데 유용합니다. 또한, miRNA, tRNA와 같은 작은 RNA의 발현과 엑손 및 인트론의 경계를 분석하여 전사체 구조와 스플라이싱 패턴을 재구성할 수 있습니다. 다만, SNP 탐지는 RNA 편집이나 기술적 오류를 주의해야 하며, 작은 RNA 분석은 해당 전용 라이브러리 준비 방법이 필요합니다.

본 튜토리얼은 Gene Expression Omnibus (GEO)의 데이터셋 GSE246237에 포함된 raw sequence data를 활용하여 RNA 시퀀싱 데이터를 분석하는 방법을 소개합니다. 튜토리얼에서는 데이터셋에 포함된 모든 SRA run 데이터를 분석할 수 있도록 구성되어 있으나, 예제 코드를 간략히 설명하기 위해 "00-1. Dataset 다운로드"에서 "04-2. RSEM quantification" 단계까지는 SRR26528168 하나의 샘플을 대상으로 분석 코드를 작성하였습니다.

RNA

https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE246237

NCBI는 시퀀싱 데이터를 SRA (Sequence Read Archive) 형식으로 저장하며, 각 샘플은 표에 나열된 식별 번호와 연관되어 있습니다. 분석을 진행하기 위해 다음 과정을 따라 SRA Run 파일을 다운로드하고 FASTQ 형식으로 변환해야 합니다.

1. SRA_toolkit 설치

SRA Run 데이터 다운로드를 위하여 먼저 SRA_toolkit를 설치합니다.

https://github.com/ncbi/sra-tools/wiki 를 참고하세요.

2. SRA Run 파일 다운로드

설치된 sra-toolkit에서 prefetch를 사용하여 SRA Run 파일을 다운로드 합니다.

# Example #/path/prefetch [SRR number] -O [OUTPUT DIR] prefetch SRR26528168
2024-10-07T09:05:55 prefetch-orig.2.10.8: 1) Downloading 'SRR26528168'... 2024-10-07T09:05:55 prefetch-orig.2.10.8: Downloading via HTTPS... 2024-10-07T09:08:44 prefetch-orig.2.10.8: HTTPS download succeed 2024-10-07T09:08:49 prefetch-orig.2.10.8: 'SRR26528168' is valid 2024-10-07T09:08:49 prefetch-orig.2.10.8: 1) 'SRR26528168' was downloaded successfully 2024-10-07T09:08:49 prefetch-orig.2.10.8: 'SRR26528168.sra' has 0 unresolved dependencies output: SRR26528168.sra

3. FASTQ 파일로 변환

다운로드 된fastq-dump 또는 fasterq-dump 를 사용하여 파일을 fastq 형식으로 변환합니다.

  • fasterq-dump는 멀티스레딩을 지원하여 대용량 데이터를 빠르게 처리할 수 있지만, 압축 기능은 제공하지 않습니다.
# Example (pair-end) #/path/fasterq-dump --split-3 -O [OUTPUT DIR] [SRA INPUT FILE] fasterq-dump --split-3 SRR26528168.sra -O ${RESULT_DIR}
spots read : 15,676,370 reads read : 31,352,740 reads written : 31,352,740 output: SRR26528168.sra_1.fastq, SRR26528168.sra_2.fastq

만약 Linux 환경에서 "01. QC (Quality Control)"부터 "04. Quantification"까지의 분석이 어려운 경우, 아래의 파일을 다운로드한 후 R 기반의 "05. Expression Profiling" 단계를 따라 분석을 진행할 수 있습니다.

00_readcount.txt
00_tpm.txt

참조 서열은 일반적으로 Ensembl, NCBI, UCSC 등에서 제공하고 있습니다.

본 튜토리얼은 iGenomes (Illumina에서 제공하는 참조 유전체 데이터 모음)에서 GRCh38 (human, NCBI)데이터를 다운로드 하였습니다.

# 다운로드 (homo sapiense, GRCh38) wget http://igenomes.illumina.com.s3-website-us-east-1.amazonaws.com/Homo_sapiens/NCBI/GRCh38/Homo_sapiens_NCBI_GRCh38.tar.gz # 압축해제 tar -xvzf Homo_sapiens_NCBI_GRCh38.tar.gz

압축을 해제하면 Homo_sapiens 디렉터리가 생성되며, 관련 파일은 Indexing 과정에서 사용됩니다.

1. 참조 서열과 유전자 주석 정보 다운로드

NCBI, Ensembl, UCSC Genome Browser와 같은 데이터베이스에서 다운로드 가능 참조 서열과 유전자 주석(FASTA, GTF/GFF 파일)은 동일한 버전 사용

2. 품질 관리 및 트리밍

FastQC 및 Trimmomatic과 같은 프로그램을 사용하여 시퀀싱 데이터의 품질을 평가하고 저품질 리드(read) 또는 어댑터 서열을 제거

3. 참조 서열에 매핑

HISAT2 또는 STAR 등을 사용하여 트리밍된 리드(read)를 참조 서열에 정렬

4. 정량화

featureCounts, HTSeq-count, 또는 RSEM 등을 사용하여 유전자 또는 전사체의 발현량을 계산. 계산 시 FRKM, TPM, RPKM 등의 정규화 방식을 사용

5. 차등 발현 유전자 (DEGs) 분석

DESeq2 또는 EdgeR 등을 사용하여 조건 간 차별적으로 발현되는 유전자 식별

6. 결과 해석

GO, KEGG, 또는 DAVID와 같은 도구들을 활용하여 생물학적 의미 분석 및 시각화

[Workflow for RNA-seq analysis]

RNA
01. QC (Quality Control)

NGS는 기술적 한계와 실험적 원인에 의해 다양한 오류(error)가 발생할 가능성이 있습니다.

원시 데이터(raw data)에서는 염기(base)별로 추정된 오류 확률을 수치로 나타내며, 이를 Phred quality score라고 부릅니다. Phred score는 각 염기의 품질을 나타내는 지표로 활용됩니다.

Phred score 20(Q20)은 해당 염기서열 결과가 오류일 확률이 1%임을 의미하며, Q30은 0.1%의 오류 확률을 의미합니다. 일반적으로 Q30 이상의 Phred score를 가진 염기는 시퀀싱 품질이 우수하다고 판단되어 분석에 활용할 수 있습니다.

소개

Phred quality score는 NGS 시퀀싱으로 생성된 FASTQ 파일에서 각각의 염기가 가지는 품질에 대한 수치입니다.

DNA 또는 RNA 염기를 시퀀싱 기기로 판독할 때 필연적으로 발생하는 오류를 확률적으로 표현하며, 시퀀싱 데이터의 품질 평가 기준으로 널리 활용됩니다.

RNA

출처 : https://bgreat.tistory.com/152

특정 염기의 정확도가 90%라면 Phred score는 10이며, 99%의 정확도는 20에 해당합니다. 일반적으로 시퀀싱 품질 기준으로 활용되는 Phred score 30에 대한 값은 염기에 대해 99.9%의 정확도를 의미합니다.

염기가 확률을 가진다는 의미는 시퀀싱 과정에서 발생하는 화학적 신호를 디지털로 변활할 때 오차가 생길 수 있음을 나타냅니다. 예를 들어, 클러스터 단위에서는 A는 붉은색 G는 노란색으로 표현되지만, 약간의 노란색이 섞인 붉은 색 신호가 관찰된다면 이를 100% A라고 확신할 수 없기 때문입니다.

RNA

Phred Score는 오류 확률(P)에 따라 계산되며, 이를 ASCII 코드로 변환하여 FASTQ 파일에서 각 염기와 함께 저장됩니다. Phred Score 값을 ASCII 코드로 표현하는 이유는 숫자(예: 30)를 한 자리로 압축하여 저장 공간을 절약하기 위함입니다.

출처 : https://www.drive5.com/usearch/manual7/quality_score.html

소개

FASTQ는 생물학적 서열 데이터와 각 염기의 품질 점수를 저장하기 위한 텍스트 기반 형식으로, 주로 NGS (Next generation sequencing) 데이터를 저장하는 데 사용됩니다.

즉, NGS 실험 결과는 cDNA library를 시퀀싱하여 얻은 염기서열 데이터를 포함하며, 이때 각 서열 단위를 “read”라고 합니다. FASTQ 파일은 여러 read 정보를 하나의 파일에 저장합니다.

FASTQ 파일의 형식

FASTQ 파일은 각 서열에 대해 4개의 줄로 구성되어 있습니다.

  • 첫 번째 줄 (sequence ID) : 주로 @로 시작되며 해당 서열의 이름을 나타냄
  • 두 번째 줄 (sequence) : 실제로 읽은 염기서열 정보
  • 세 번째 줄 (description) : 주로 “+” 문자만을 입력하거나 sequence ID나 추가 설명을 포함
  • 네 번째 줄 (quality) : 각 염기서열이 얼마나 정확히 읽혔는지를 나타내며, 주로 Phared score 값으로 표현
RNA
01-1. Quality Control

FastQC (https://www.bioinformatics.babraham.ac.uk/projects/fastqc/)

FastQC 프로그램은 NGS 결과로 생성된 FASTQ 파일을 입력받아 데이터의 시퀀싱 품질을 평가하는 소프트웨어로, 염기별 시퀀싱 품질, GC 콘텐츠, 어댑터 서열 등의 여러 품질 지표를 그래프 형태로 제공하여 원시 데이터의 품질을 직관적으로 확인할 수 있게 합니다.

주요 활용되는 지표로 Per Base Sequence Quality, Per Sequence Quality Scores, Per Base Sequence Content, Per Base GC Content 등이 있습니다.

  • Input
    • 각 샘플에 대한 Raw data file (forward, reverse read)
    • SRR26528168.sra_1.fastq, SRR26528168.sra_2.fastq
  • Practice ### 01. FASTQC #/path/fastqc -o /path/output/dir [INPUT FILE] /root/bin/fastqc \ -t 8 \ --outdir ${RESULT_DIR} \ SRR26528168.sra_1.fastq /root/bin/fastqc \ -t 8 \ --outdir ${RESULT_DIR} \ SRR26528168.sra_2.fastq
  • Option description -o / --outdir [DIR] fastQC 결과 파일을 생성할 디렉터리의 경로 입력 -t / --threads [NUM] 분석 수행을 위하여 사용하는 threads의 수 입력
  • Output
    • 각 read 에 대한 fastqc 의 html 및 zip 파일 생성됨
    • SRR26528168.sra_1_fastqc.html
    • SRR26528168.sra_1_fastqc.zip
    • SRR26528168.sra_2_fastqc.html
    • SRR26528168.sra_2_fastqc.zip
  • 특정 디렉터리 내 모든 fastq 파일에 대한 fastQC 수행 시 아래의 코드를 참고 for x in $(ls ${working_path}/00.raw_data/*.fastq) do /root/bin/fastqc -t 8 -o ${RESULT_DIR} $x done
  • 결과 해석 (아래의 PDF 참고)
    FastQC_Manual.pdf
02. Trimming

Trimming은 시퀀싱 데이터 분석에서 품질을 높이기 위한 데이터 정제 과정입니다. 이 과정에서는 각 read 말단에서 나타나는 정확도가 낮은 부분을 잘라내고, read의 정확도 평균 점수가 너무 낮거나 염기서열이 정확히 판별되지 않아 N으로 기록된 위치가 많은 경우 해당 read 전체를 제거합니다.

또한, 라이브러리 제작 과정에서 내부 DNA 서열 길이가 짧은 경우, 시퀀싱 장비가 내부 서열을 모두 읽은 후 NGS 어댑터 서열을 읽게 됩니다. 이 어댑터 서열은 원래 존재하지 않는 서열이므로 분석에 오류를 발생시킬 수 있습니다. 따라서, read 말단에서 어댑터 서열이 인식되면 해당 서열을 제거하는 과정도 필요합니다.

RNA

출처 : https://www.celemics.com/ko/resources/blogs/bioinformatics-standard-ngs-data-analysis-pipeline-2/

02-1. Trimming

Trimmomatic (https://github.com/usadellab/Trimmomatic)

어댑터 서열 제거 및 품질 낮은 서열을 정제하는 과정은 원시 데이터를 개선하기 위해 수행됩니다. 이 과정에서는 최소 품질 임계값(threshold)을 설정하고, 해당 임계값 이하의 염기를 제거하여 고품질 데이터를 확보합니다.

Cutadapt는 Python 기반 도구로 어댑터 서열을 효과적으로 제거하는 데 사용됩니다. 반면, Trimmomatic은 Java 기반으로 개발된 도구이며, Sickle과 마찬가지로 슬라이딩 윈도우(sliding window) 알고리즘을 사용하여 고품질 서열만을 남기는 방식을 채택하고 있습니다. 이를 통해 분석의 신뢰도를 높이고, 데이터 품질을 보장합니다.

  • Input
    • 각 샘플에 대한 Raw data file (forward, reverse read)
    • SRR26528168.sra_1.fastq, SRR26528168.sra_2.fastq
  • Practice ### 02.Trimmomatic #java -jar /path/trimmomatic-[VERSION].jar [SE | PE] [-phred33 | -phred64] [INPUT FILE R1] [INPUT FILE R2] [OUTPUT FILE 1P] [OUTPUT FILE 1U] [OUTPUT FILE 2P] [OUTPUT FILE 2U] [trimmer 1] java -jar ${Tool_path}/trimmomatic-0.39.jar \ PE \ -threads 16 \ -phred33 \ ${RAW_DIR}/SRR26528168.sra_1.fastq \ ${RAW_DIR}/SRR26528168.sra_2.fastq \ ${RESULT_DIR}/SRR26528168.R1.Trim.Paired.fastq.gz \ ${RESULT_DIR}/SRR26528168.R1.Trim.UnPaired.fastq.gz \ ${RESULT_DIR}/SRR26528168.R2.Trim.Paired.fastq.gz \ ${RESULT_DIR}/SRR26528168.R2.Trim.UnPaired.fastq.gz \ ILLUMINACLIP: ${ADAPTER_DIR}/TruSeq3-PE.fa:2:30:10 \ LEADING:3 TRAILING:3 SLIDINGWINDOW:4:15 MINLEN:36
  • Option description [SE | PE] 데이터가 single end면 SE, paired end면 PE 선택 -phred33 Phred score 33 ILLUMINACLIP:[FILE]:[NUM]:[NUM]:[NUM] {Adapter 정보가 있는 파일}: {maximum mismatch counts}: {paired end에서 adapter reads간의 일치도}: {single end에서 adapter reads 간의 일치도} LEADING:[NUM] Read의 시작 부분에서 base를 제거할 최소 품질 기준 TRAILING:[NUM] Read의 끝 부분에서 base를 제거할 최소 품질 기준 SLIDING WINDOW:[NUM] {window size}:{평균 quality}, window를 이동시켜 평균 qulity 이하로 내려가는 read 제거 MINLEN:[NUM] 유지되어야 할 최소 reads 길이
  • Output
    • 각 샘플별 trimming 이후 결과 파일 (R1, R2에 대한 Paired, UnPaired read)
    • SRR26528168.R1.Trim.Paired.fastq.gz
    • SRR26528168.R1.Trim.UnPaired.fastq.gz
    • SRR26528168.R2.Trim.Paired.fastq.gz
    • SRR26528168.R2.Trim.UnPaired.fastq.gz
03. Alignment

전처리가 완료된 Sequence Read 데이터는 일반적으로 참조 유전체 또는 참조 전사체에 정렬(alignment) 및 매핑(mapping)하는 과정을 거칩니다.

이 과정에서 read를 매핑할 적절한 참조 서열을 선택하고 STAR, HISAT2, Bowtie2, Kallisto, Salmon와 같은 도구를 사용하여 정렬을 수행합니다. 도구 선택은 연구자의 선호도 및 사용 가능한 계산 자원에 따라 달라질 수 있습니다.

이 튜토리얼에서는 STAR를 사용하여 FASTQ 파일을 참조 게놈에 매핑하고, 결과로 정렬된 read 정보를 담은 BAM 형태의 파일 생성합니다.

STAR 매뉴얼: https://github.com/alexdobin/STAR/blob/master/doc/STARmanual.pdf

참조 유전체(Reference genome)는 특정 생물 종의 대표적인 유전체 서열로 해당 생물의 유전자와 유전체 구조를 이해하는 데 기본이 되며, 다양한 유전체 연구 및 비교 연구에서 기준점으로 사용됩니다.

※ 매핑 전, 참조 서열(.fa)과 주석(.gff, .gtf) 파일을 기반으로 인덱싱하는 과정이 필요합니다.

STAR (Spliced Transcripts Alignment to a Reference)는 RNA 시퀀싱 데이터를 참조 유전체에 정렬하기 위한 소프트웨어로 높은 정확도와 빠른 매핑 속도를 자랑합니다. 다만, 메모리를 많이 요구하는 단점이 있습니다. STAR 분석은 2단계 프로세스로 이루어집니다.

1. Step 1 : Seed searching

  • STAR는 각 리드에 대해 참조 유전체의 하나 이상의 위치와 정확히 일치하는 가장 긴 서열을 검색합니다. 가장 길게 매핑되는 서열을 MMP(Maximal Mappable Prefixes)라고 합니다.
    RNA
  • 하나의 리드가 참조 유전체에 매핑될 때, 리드의 일부가 분리되어 다른 엑손(exon)에 매칭되는 경우가 있습니다. 이때 리드에서 분리된 각 부분을 seed라 하며, 처음 매칭된 부분을 seed1, 나머지 부분을 seed2 라고 합니다. STAR는 이러한 MMP를 탐색하고 seed를 반복적으로 찾아 매핑 과정을 진행합니다.
    RNA
  • 리드의 일부가 불일치(mismatches) 또는 인델(indel)로 인하여 정확히 매칭되지 않는 경우, MMP는 확장됩니다.
    RNA
  • 확장 부위가 정렬되지 않는다면 이는 품질이 낮거나 어댑터 서열일 가능성이 높으며, 해당 서열은 제거됩니다.
    RNA

2. Step 2 : Clustering, stitching, and scoring

  • Seed 검색 과정이 완료되면, 분리된 seed들을 연결하여 완전한 리드를 만듭니다. 먼저, 분리된 seed들은 근접성을 기준으로 묶여 클러스터링(clustering)한 다음, 하나의 리드로 연결(stitching)합니다. 연결 과정에서 불일치(mismatches), 인델(indels), 갭(gaps) 등 매칭에 영향을 줄 수 있는 요소들을 고려하여 점수(scoring)를 부여합니다.
RNA

출처 : https://hbctraining.github.io/Intro-to-rnaseq-hpc-O2/lessons/03_alignment.html

03-1. STAR indexing
  • Input
    • 샘플에 해당되는 Reference genome sequence(.fa) and annotation (.gff/.gtf), genome.fa, genes.gtf (00-2. 참조 서열 다운로드 참고)
  • Practice ### 03-1. STAR indexing #/path/STAR STAR --runMode genomeGenerate --runThreadN 16 \ --genomeDir ${STAR_INDEX_DIR} \ --genomeFastaFiles genome.fa \ --sjdbGTFfile genes.gtf \ --sjdbOverhang 75
  • Option description --runMode genomeGenerate 게놈 인덱싱 생성모드 --runThreadN [NUM] 분석 시 사용할 thread의 개수 --genomeDir [DIR] 인덱싱 결과 폴더 --genomeFastaFiles [FILE] FASTA 형식의 인덱싱할 참조서열 파일 --sjdbGTFfile [FILE] GTF 형식의 참조서열 주석 파일 --sjdbOverhang [NUM] 주석이 달린 접합부 주변의 게놈 서열 길이로 [ReadLength - 1]가 이상적이며, defualt는 100임
    --sjdbOverhang의 숫자는 FastQC 결과 리포트의 Basic Statistics에서 [Sequence length -1] (76 -1 = 75) 값을 입력하면 됨
  • Output
    • /path/STAR_INDEX_DIR 내에 인덱싱 결과 파일이 생성됨
03-2. STAR mapping
  • Input
    • 각 샘플에 대한 Trimmed raw data file (forward, reverse read) : SRR26528168.R1.Trim.Paired.fastq.gz, SRR26528168.R2.Trim.Paired.fastq.gz
    • 참조 게놈 인덱싱 결과 폴더 : /path/STAR_INDEX_DIR
  • Practice ### 03-2.STAR mapping #/path/STAR STAR --runThreadN 16 \ --genomeDir ${STAR_INDEX_DIR} \ --readFilesIn SRR26528168.R1.Trim.Paired.fastq.gz SRR26528168.R2.Trim.Paired.fastq.gz \ --readFilesCommand zcat \ --quantMode TranscriptomeSAM \ --outSAMtype BAM SortedByCoordinate \ --outFileNamePrefix ${RESULT_DIR}/SRR26528168. \ --twopassMode Basic
  • Option description --runThreadN [NUM] [NUM]개의 thread를 사용 --genomeDir [DIR] 인덱싱 결과 폴더 --readFilesIn [FILE] FASTQ 형식의 입력 파일 (여러 개 가능) --readFilesCommand zcat 입력 파일이 압축되어있을 경우 사용 --quantMode TranscriptomeSAM 정량된 SAM/BAM 파일을 별도의 파일로 출력 --outSAMtype BAM SortedByCoordinate 좌표기준으로 정렬된 BAM 파일을 출력 --outFilesNamePrefix [PRIXED FILEANME] 매핑 결과 폴더 및 pre-fixed 파일명
  • Output
    • SRR26528168.Aligned.sortedByCoord.out.bam
    • SRR26528168.Aligned.toTranscriptome.out.bam
    • SRR26528168.Log.final.out
    • SRR26528168.Log.out
    • SRR26528168.Log.progress.out
  • 결과 해석

    기본적으로 Log 파일은 분석 시간/속도 및 input 정보와 같이 분석 매핑 결과를 제공하며, 최종 매핑 결과에 대한 통계 수치는 Log.final.out 파일에서 확인할 수 있습니다.

    Uniquely mapped reads % 는 매핑의 품질을 판단하는 중요한 지표로, 값이 80% 이상이면 매핑 결과가 좋다고 판단하며, 값이 50% 미만이면 시퀀싱 또는 참조 서열에 문제가 있다고 의심할 수 있습니다.

    출처 : https://pmc.ncbi.nlm.nih.gov/articles/PMC4631051/

04. Quantification

Quantification은 매핑된 RNA 시퀀싱 데이터를 기반으로 유전자의 발현 수준을 정량화하는 중요한 과정입니다. 이 과정은 유전자 발현량을 평가하여, 서로 다른 조건에서의 발현 차이를 비교 분석하고, 다양한 생물학적 질문에 답을 찾는 데 기여합니다.

정량화를 수행하기 위해 일반적으로 RSEM 또는 HTSeq와 같은 도구가 사용되며, 본 튜토리얼에서는 RSEM을 활용한 정량화 과정을 다룹니다.

RSEM은 Expectation-Maximization (EM) 알고리즘을 사용하여 각 read가 유전자 또는 전사체에 매핑될 확률을 기반으로 발현량을 추정합니다. 결과는 TPM (Transcripts Per Million) 또는 FPKM (Fragments Per Kilobase Million) 등의 형식으로 제공되어, 조건 간 발현 비교가 가능하도록 정규화된 값을 제공합니다.

※ 정량 전, 참조 서열(.fa)과 주석(.gff, .gtf) 파일을 기반으로 인덱싱하는 과정이 필요합니다.

04-1. RSEM indexing
  • Input
    • STAR 분석 후 생성된 Aligned BAM file : SRR26528168.Aligned.toTranscriptome.out.bam
    • 참조 서열 인덱싱 결과 폴더 : /path/RSEM_INDEX_DIR/{ref_prefix}
    • 샘플에 해당되는 Reference genome sequence(.fa) and annotation (.gff/.gtf), genome.fa, genes.gtf (00-2. 참조 서열 다운로드 참고)
  • Practice ### 04-1. RSEM indexing #/path/RSEM/rsem-prepare-reference [OPTION] [REFERENCE FASTA FILE] [OUTPUT PREFIX NAME] ${Tool_path}/rsem-prepare-reference \ --num-threads 16 \ --bowtie2 \ --bowtie2-path ${bowtie2_path} \ --gtf reference.gtf \ reference.fa \ ${RSEM_INDEX_DIR}/${ref_prefixed name}
  • Option description --num-threads [NUM] 분석 시 사용할 thread의 개수 --gtf [FILE] GTF 형식의 참조서열 주석 파일 --bowtie2 Aligner 도구 --bowtie2-path Aligner가 설치된 위치 ※ Aligner로 bowtie, bowtie2, star, hisat2-hca가 존재하며, 분석 방법에 따라 변경 가능
  • Output
    • /path/RSEM_INDEX_DIR 내에 인덱싱 결과 파일이 생성됨
04-2. RSEM quantification
  • Input
    • STAR 분석 후 생성된 Aligned BAM file : SRR26528168.Aligned.toTranscriptome.out.bam
    • 참조 게놈 인덱싱 결과 폴더 : /path/RSEM_INDEX_DIR/{ref_prefix}
  • Practice ### 04-2.RSEM quantification #/path/RSEM/rsem-calculate-expression [OPTION] [INDEX PREFIX NAME] [INPUT FILE] [OUTPUT PREFIX NAME] ${Tool_path}/rsem-calculate-expression \ --bam --no-bam-output -p 16 --paired-end \ ${RSEM_INDEX_DIR}/${ref_prefixed name} \ SRR26528168.Aligned.toTranscriptome.out.bam\ ${RESULT_DIR}/SRR26528168
  • Option description --bam Inputs 파일이 BAM format일 때 사용 --no-bam-output 사용 시 여러 BAM 파일을 output 하지 않음 -p / --num-threads [NUM] 분석 시 사용할 threads 개수 --paired-end 데이터가 paired-end reads 기반일 때 사용
  • Output
    • SRR26528168.genes.results
    • SRR26528168.isoforms.results
    RNA
    • gene_id : 유전자 고유 식별자로 Ensembl ID 또는 RefSeq ID가 사용됩니다.
    • transcript_id(s) : 해당 유전자로부터 유래한 전사체 ID 목록으로 하나의 유전자에 여러 전사체를 가질 수 있기 때문에 전사체 ID가 쉼표로 구분되어 나열됩니다.
    • length : 유전자의 총 길이로 주로 엑손(exon) 부분의 길이로 계산됩니다.
    • effective_length : 유전자 발현량을 추정할 때 사용되는 유전자의 실질적인 길이입니다. 이 값은 유전자 길이에서 정렬 가능한 리드의 길이 및 시퀀싱 방법 등을 고려하여 조정된 값입니다.
    • expected_count : 해당 유전자에 정렬된 리드의 예상 개수입니다. 단순한 리드 수가 아니라, 모델을 통해 추정된 값입니다.
    • TPM (Transcripts Per Million) : 백만 개의 전사체 당 특정 유전자의 전사체 수를 나타냅니다. TPM은 샘플 간 발현량을 비교하기 위한 표준화된 척도입니다. TPM은 유전자 길이와 샘플의 총 리드 수를 고려하여 계산되므로 다른 샘플 간의 발현량 비교가 가능합니다.
    • FPKM (Fragments Per Kilobase of transcript per Million mapped reads) : 유전자 발현량을 추정할 때 사용되는 유전자의 실질적인 길이입니다. 이 값은 유전자 길이에서 정렬 가능한 리드의 길이 및 시퀀싱 방법 등을 고려하여 조정된 값입니다.
04-3. Make matrix file (read_count, TPM)

샘플별 분석된 결과를 하나의 파일로 합치는 작업으로 이번 과정부터는 R 프로그램을 기반으로 진행됩니다.

  • Input
    • RSEM 분석 후 생성된 genes.results file
    • SRR26528163.genes.results
    • SRR26528164.genes.results
    • SRR26528165.genes.results
    • SRR26528166.genes.results
    • SRR26528167.genes.results
    • SRR26528168.genes.results
  • Practice #R library(dplyr) ### 폴더 경로 설정 및 파일 리스트 dir_path <- '/path/to/your/directory' file_list <- list.files(path = dir_path, pattern = '*.genes.results', full.names = TRUE) ### Load expected_count file (1, 5 column) extracted_data <- lapply(file_list, function(file) { data <- read.table(file) # 파일 불러오기 if(ncol(data) >= 5) { # 데이터에 최소 5개의 열이 있는지 확인 selected_data <- data %>% select(1, 5) # 1열과 5열 선택 colnames(selected_data) <- c("key", sub("\\..*$", "", basename(file))) # 열 이름 변경 return(selected_data) } else { warning(paste("File", file, "does not have at least 5 columns. Skipping...")) return(NULL) } }) # NULL 값을 제거 extracted_data <- Filter(Negate(is.null), extracted_data) # 초기 데이터 프레임 설정 combined_data <- extracted_data[[1]] # NULL 값을 제거 for (i in 2:length(extracted_data)) { combined_data <- full_join(combined_data, extracted_data[[i]], by = "key") } # 첫 번째 행 제거 및 쳇 번째 열을 열 이름으로 설정 readcount_data <- combined_data %>% slice((-1)) rownames(readcount_data) <- readcount_data$key readcount_data <- readcount_data[,-1] # 파일명을 샘플명으로 변경 new_colnames <- c("PCL_siSlu7_3", "PCL_siSlu7_2", "PCL_siSlu7_1", "PCL_siGL_3", "PCL_siGL_2", "PCL_siGL_1") colnames(readcount_data) <- new_colnames readcount_data <- readcount_data[,rev(colnames(readcount_data))] # 결과 확인 print(readcount_data) write.table(readcount_data, file="00_readcount.txt", sep="\t", quote=FALSE) rm(extracted_data) rm(combined_data) rm(new_colnames) ### Load TPM file (1, 6 column) extracted_data <- lapply(file_list, function(file) { data <- read.table(file) # 파일 불러오기 if(ncol(data) >= 6) { # 데이터에 최소 6개의 열이 있는지 확인 selected_data <- data %>% select(1, 6) # 1열과 6열 선택 colnames(selected_data) <- c("key", sub("\\..*$", "", basename(file))) # 열 이름 변경 return(selected_data) } else { warning(paste("File", file, "does not have at least 6 columns. Skipping...")) return(NULL) } }) # NULL 값을 제거 extracted_data <- Filter(Negate(is.null), extracted_data) # 초기 데이터 프레임 설정 combined_data <- extracted_data[[1]] # NULL 값을 제거 for (i in 2:length(extracted_data)) { combined_data <- full_join(combined_data, extracted_data[[i]], by = "key") } # 첫 번째 행 제거 및 쳇 번째 열을 열 이름으로 설정 tpm_data <- combined_data %>% slice((-1)) rownames(tpm_data) <- tpm_data$key tpm_data <- tpm_data[,-1] # 파일명을 샘플명으로 변경 new_colnames <- c("PCL_siSlu7_3", "PCL_siSlu7_2", "PCL_siSlu7_1", "PCL_siGL_3", "PCL_siGL_2", "PCL_siGL_1") colnames(tpm_data) <- new_colnames tpm_data <- tpm_data[,rev(colnames(tpm_data))] # 결과 확인 print(tpm_data) write.table(tpm_data, file="00_tpm.txt", sep="\t", quote=FALSE) rm(extracted_data) rm(combined_data) rm(new_colnames) # 본 분석에서는 TPM과 expected_count 만 사용하므로, FPKM을 추출하지 않음 # 필요 시 위의 코드에서 5 또는 6 column을 7로 변경하여 코드를 돌리면 해당 파일을 얻을 수 있음
  • Output
    • 00_readcount.txt
    • 00_tpm.txt
05. Expression Profiling

데이터의 정확성과 비교 가능성을 위하여 데이터를 normalization하고 PCA을 적용합니다. Normalization은 각 샘플 간의 리드 수의 차이를 보정하여 유전자의 발현량을 정확하게 비교할 수 있게 합니다. 이는 실험 조건이나 시료 처리로 인해 발생할 수 있는 기술적 변동을 보정함으로써 데이터의 일관성을 유지하고 통계적 검증 및 해석을 정확하게 하기 위한 필수적인 과정입니다. PCA은 고차원의 데이터를 낮은 차원의 데이터로 변환하여 샘플 간의 유사성을 확인하는 기법입니다.

1. Normalization

RNA-seq 데이터는 길이와 함께 유전자 발현량에 영향을 미치는 다양한 요인들이 존재하므로 샘플 간 유전자 발현량을 비교하기 위해서는 정규화가 필요합니다.

  • Sequencing depth
    • 두 샘플에 대한 발현량을 비교한다고 가정할 때, 아래 그림처럼 sequencing depth가 2배 정도 차이가 나는 경우 normalization (정규화) 을 진행하지 않으면 발현량이 두 배 가량 차이가 나는 bias를 얻게 됩니다.
    • 따라서 sequencing depth차이에 의해 발생하는 bias를 없애기 위해 꼭 필요합니다.
      RNA
  • Gene length
    • 아래 그림을 보면, Gene X는 길이가 Gene Y보다 gene length가 길어서 count되는 read의 개수가 더 많습니다.
    • depth는 유사하더라도 gene에 count되는 read의 개수에서 차이가 발생하기 때문에, normalization (정규화)을 진행하지 않으면 bias를 얻게 될 수 있습니다.
      RNA
  • RNA composition
    • 유전자 길이와 depth를 고려하여도 샘플 간의 유전자 수 차이 또는 실험 과정에서 발생한 부정확한 결과로 인해 정규화 방법을 왜곡할 수 있습니다.
    • 아래 그림처럼 특정 유전자의 read수가 샘플 간, 그리고 샘플 내에서 급격하게 증가할 경우 정규화를 진행할 때 bias를 일으킬 수 있는 있습니다. 따라서 이런 부분에 대한 고려가 이루어져야 합니다.
      RNA

2. Common Normalization methods

정규화는 위에서 말한 요인들을 보정하기 위해 TPM, FPKM, RPKM, DESeq, edgeR 등의 기법을 사용합니다.

RNA
  • 정규화 시 gene length, sequence depth, RNA composition 고려 여부에 따라 기법이 달라지기 때문에 유전자 발현량을 분석 시 위의 표를 참고하여 목적에 맞는 분석법을 이용하고 적용해야 합니다.

출처 : Count normalization with DESeq2 | Introduction to DGE - ARCHIVED (hbctraining.github.io)

05-1. Normalization & PCA
  • Input
    • 00_tpm.txt
  • Practice #R library(ggplot2) library(preprocessCore) ### Load a file tpm_data <- read.table('00_tpm.txt', row.names=1, header = T, sep="\t")) ### Normalization data.nor <- normalize.quantiles(as.matrix(log2(tpm_data + 1)), copy = TRUE) dimnames(data.nor) = dimnames(tpm_data) # Figure of normalization colors = c(rep('purple',3), rep('orange',3)) # 설명) 그룹이 구분되도록 color 지정 (그룹의 색(gray), 그룹의 샘플 수(4)) # 예시) colors = c(rep('gray', 4), rep('red', 4), rep('orange',4)) 그룹 3개, 그룹 당 샘플 수가 4개인 경우 pdf("01_boxplot_TPM_Nor_before.pdf") boxplot(log2(tpm_data + 1), boxfill=colors, main="Before Normalization", outline=F, las=2, ylab="log2(TPM + 1)", cex.axis = 0.7, cex.ayis = 0.7) dev.off() pdf("02_boxplot_TPM_Nor_after.pdf") boxplot(data.nor, boxfill=colors, main="After Normalization", outline=F, las=2, ylab="log2(TPM + 1)", cex.axis = 0.7, cex.ayis = 0.7) dev.off() ### PCA library(ggfortify) PCAt = prcomp(t(data.nor)) # Figure of PCA condition = c(rep('PCL_siGL',3), rep('PCL_siSlu7',3)) # 설명) 그룹이 구분되도록 샘플(그룹명) 지정 (그룹명(NC), 그룹의 샘플 수(4)) # 예시) condition = c(rep('NC', 4), rep('T1', 4), rep('T3', 4)) 그룹 3개, 그룹 당 샘플 수가 4개인 경우 PCAb <- cbind(t(data.nor), condition) pdf('03_PCA_TPM.pdf') autoplot(PCAt, data = PCAb, colour = 'condition', size = 4) + ggtitle("PCA") + theme_classic() + theme(plot.title = element_text(hjust = 0.5, face="bold", size=15)) dev.off()
  • R function description
    • pcromp : 주성분 분석을 수행
    • autoplot : ggplot2 object 중 하나로 PCA 결과를 시각화 함
      • ggtitle : 그래프의 제목을 설정
      • theme : 그래프의 제목, 범례, 축의 위치 또는 글자 모양 등을 설정
      • theme_classic() : 배경은 흰색으로 설정, 축의 눈금과 레이블은 기본 스타일로 표시하며 제목, 범례, 주석 등의 텍스트는 기본 폰트와 크기로 표시
  • Output
    • 01_boxplot_TPM_Nor_before.pdf
    • 02_boxplot_TPM_Nor_after.pdf
    • 03_PCA_TPM.pdf
    • 01_boxplot_TPM_Nor_before.pdf
      RNA
    • 02_boxplot_TPM_Nor_after.pdf
      RNA
    • 03_PCA_TPM.pdf
      RNA
06. DEG analysis

DEGs (Differential expressed genes)는 특정 조건에서 통계적으로 유의한 수준으로 발현이 달라지는 유전자들을 가리키는 용어입니다. 예를 들어, 암세포와 정상 세포 간에 유전자 발현 차이를 비교하여 암세포에서 높은 수준으로 발현되는 유전자들을 찾는 경우가 있을 수 있습니다.

이러한 DEGs 분석은 유전자 발현이 변화하는 생리학적 현상 및 기전 또는 질병의 원인과 발생 메커니즘 등을 이해하는 데 도움을 줄 수 있으며, 새로운 약물을 개발하기 위한 초석이 될 수 있습니다.

발현량 차이를 규명하기 위하여 목적에 따라 CPM, TPM, FPKM/RPKM, DESeq2, edgeR, limma 등이 사용되며, 이러한 도구는 각 유전자에 대한 일반화 선형 모델을 사용하여 차이를 식별하거나 통계적으로 발현에 대한 차이를 규정하고 DEG를 정의합니다.

06-1. DEG extract
  • Input
    • 00_readcount.txt
  • Practice #R library("preprocessCore") library("edgeR") # Load a file readcount_data <- read.table("00_readcount.txt", row.names=1, header=T, sep="\t") ### make a group condition = c(rep('PCL_siGL',3), rep('PCL_siSlu7',3)) # 설명) 그룹이 구분되도록 샘플(그룹명) 지정 (그룹명(NC), 그룹의 샘플 수(4)) # 예시) condition = c(rep('NC', 4), rep('T1', 4), rep('T3', 4)) 그룹 3개, 그룹 당 샘플 수가 4개인 경우 ### make a DEGlist readcount_data <- data.frame(sapply(readcount_data, as.numeric)) y <- DGEList(counts = readcount_data, group = condition) ### Filtering low counts keep <- filterByExpr(y) y <- y[keep, , keep.lib.size=FALSE] ### TMM normalize y <- calcNormFactors(y) ### estimate dispersion y <- estimateCommonDisp(y) y <- estimateTagwiseDisp(y) ### making model.matrix design <- model.matrix(~0+group, data=y$samples) ### DEGs - quasi-likelihood F-tests fit <- glmQLFit(y, design) qlf <- glmQLFTest(fit, contrast = c(-1,1)) DEGs <- topTags(qlf, n=Inf,sort.by="logFC") write.table(DEGs, file="04_DEG_list.txt", sep="\t", quote=FALSE)
  • Output
    • 04_DEG_list.txt
    RNA
    • (Gene ID) : 유전자의 고유 식별자로 Ensembl ID, RefSeq ID, 유전자 이름이 될 수 있습니다.
    • logFC (log Fold Change) : 실험 조건 간의 유전자 발현 변화 비율을 로그로 변환한 값입니다. 일반적으로 로그2를 기준으로 변환되며, 값이 1이면 2배 발현 증가, -1이라면 2배 발현 감소를 의미합니다.
    • logCPM (log Counts Per Million) : 유전자의 평균 발현 수준을 로그 변환하여 나타낸 값입니다. CPM은 각 유전자의 read 수를 백만 단위로 표준화 한 값으로 시퀀싱 depth를 고려한 샘플 간의 비교가 가능하도록 합니다.
    • F (F-statistic) : 차등 발현을 검정하기 위한 F-통계량 입니다. F-통계량은 실험 조건 간의 그룹 내 변동과 그룹 간 변동을 비교하여 차이가 유의한지를 평가하는 데 사용됩니다. 값이 클수록 그룹 간의 발현 값의 차이가 크다는 것을 의미합니다.
    • PValue : 유전자가 차등 발현되는지에 대한 통계적 유의성을 나타내는 p-값입니다. p-값이 낮을수록 유전자 발현 차이가 통계적으로 유의미할 가능성이 높습니다. 다만, p-값만으로 유의성을 평가하기에 한계가 있어, FDR 값을 고려합니다.
    • FDR (False Discovery Rate) : Benjamini-Hochberg 절차를 사용하여 다중 검정에 대한 보정을 적용한 p-값으로 발견된 차등 발현 유전자 중 거짓 양성의 비율을 추정합니다. FDR 값이 낮을수록 유전자가 진정으로 차등 발현되었을 가능성이 높으며, 일반적으로 FDR 값이 0.05 이하이면 차등 발현이 유의미한 것으로 간주됩니다.
06-2. Setting cut-off of DEGs

전체 DEGs 리스트 중 | log2FC | 값이 1 이상이며, p-value 나 FDR 이 0.05 이하를 만족하는 DEG를 유의하다고 가정하여 DEGs를 필터링합니다.

하지만, 실험 및 결과에 따라 해당 기준 값은 변경할 수 있으며, 아래와 같이 코드로 필터링하거나 엑셀을 사용하여 필터링할 수 있습니다.

  • Input
    • 위의 06-1.의 코드가 이어짐
  • Practice #R p_value=0.05 logFC=1 # Filtering DEGs_set <- DEGs$table$FDR <= p_value & abs(DEGs$table$logFC) >= logFC DEGs_set <- DEGs[DEGs_set,] write.table(DEGs_set, file="05_DEG_list_fil.txt", sep="\t", quote=FALSE)
  • Output
    • 05_DEG_list_fil.txt
07. Visualization
07-1. Volcano plot

Volcano plot은 mRNA 발현 데이터 분석에서 데이터 시각화를 위해 사용되며, x-축에는 발현의 차이를 나타내는 fold change를, y-축에는 통계적 유의성을 나타내는 -log10(p-value) 값을 표시합니다. Volcano plot에서 발현의 차이가 크고 통계적으로 유의한(p-value가 작은) mRNA는 plot의 양쪽 끝 상단에 위치하며, 이러한 mRNA는 다양한 생물학적 역할을 하는 중요한 유전자들일 가능성이 높다고 판단할 수 있습니다.

  • Input
    • 04_DEG_list.txt (위의 06-1.의 코드에서 이어질 경우, 변수 DEGs$table로 입력)
  • Practice #R library(EnhancedVolcano) p_value=0.05 logFC=1 DEGs <- read.table("04_DEG_list.txt", row.names=1, header=T, sep="\t") volc <- EnhancedVolcano(DEGs, #DEGs$table lab = rownames(DEGs), x = 'logFC', y = 'PValue', pCutoff = p_value, FCcutoff = logFC, # 그래프를 보고 x축 y축 범위 조정 # x축은 DEGs의 logFC 범위 # y축은 DEGs의 PValue의 지수값으로 계산 xlim = c(-7.5, 5), ylim = c(0, 6), legendPosition = 'bottom', legendLabSize = 10) pdf('06_Volcano_plot.pdf') volc dev.off()
  • Output
    • 06_Volcano_plot.pdf
    RNA
07-2. Heatmap plot

Heatmap은 mRNA 발현 데이터 분석에서 데이터 시각화를 위해 사용되며, 색상으로 유전자 발현 수준의 변화를 나타냅니다. Heatmap에서 유사한 발현 패턴을 가진 유전자들은 클러스터링을 통해 그룹화되며, 이는 샘플 간 또는 유전자 간의 관계를 이해하는 데 유용합니다. 발현 패턴이 유사한 유전자들은 종종 동일한 생물학적 경로에 관여할 가능성이 높으며, 다양한 생물학적 역할을 하는 중요한 유전자들을 발견하는 데 도움을 줍니다.

  • Input
    • 00_tpm.txt
    • 05_DEG_list_fil.txt (위의 06-2.의 코드에서 이어질 경우, 변수 DEGs_set 사용))
  • Practice #R library(preprocessCore) library(pheatmap) tpm_data = read.table('00_tpm.txt', row.names=1, header = T, sep="\t")) data.nor <- normalize.quantiles(as.matrix(log2(tpm_data + 1)), copy = TRUE) dimnames(data.nor) = dimnames(tpm_data) DEGs_set <- read.table("05_DEG_list_fil.txt", row.names=1, header=T, sep="\t") ## pdf('07_Heatmap.pdf') pheatmap(data.nor[rownames(DEGs_set), ], show_rownames = F, scale = "row") dev.off()
  • Output
    • 07_Heatmap.pdf
    RNA
08. Functional Profiling
08-1. Gene ontology (BP, MF, CC)

Gene Ontology (GO)는 유전자의 기능과 생물학적 과정을 이해하기 위한 분석입니다. 이 분석은 대규모 유전자 데이터 세트에서 유전자들의 기능과 특성을 파악하거나, 유전자와 단백질의 기능과 상호 작용을 이해하는 데 도움을 줍니다.

대표적으로 아래 3개와 같은 범주로 유전자 세트를 설명합니다.

  • Biological Process (BP) : 세포 분열, 신경 발생과 같은 생물학적 과정
  • Molecular Function (MF) : 효소 활성, DNA 결합과 같은 분자의 기능
  • Component (CC) : 핵, 미토콘드리아와 같은 세포 내 구조

대표적인 GO 분석 도구로는 DAVID, Enrichr, GOstats, clusterProfiler 등 굉장히 다양합니다.

1. DAVID (Database for Annotation, Visualization, and Integrated Discovery)

  • DAVID는 기능적 분석과 주석, 그리고 유전자 집단 분석에 중점을 둔 플랫폼으로, 생물학적 의미를 가진 유전자 집단을 식별하고 이들을 기능적으로 분석하여 결과를 시각화 합니다.
  • 유전자 집단 분석 : 특정 실험 또는 조건에서 관심 있는 유전자들의 집단을 분석하고 기능적으로 연관된 유전자들을 탐색합니다.
  • 기능적 주석: 입력한 유전자 목록에 대한 기능적 주석 정보를 제공합니다. Gene Ontology, KEGG 경로와 같은 공개적인 데이터베이스를 기반으로 합니다.

2. Metascape

  • Metascape는 DAVID와 유사한 기능을 제공하는 무료 온라인 도구로서, 대규모 유전자 분석을 위한 진행적 기능과 통합적 기능을 제공합니다.
  • GO 분석 : 유전자 집단을 분석하고, 기능적으로 관련된 유전자들을 탐색합니다.
  • KEGG 분석 : KEGG 경로를 기반으로 유전자 집단을 분석하여 생물학적 의미를 이해합니다.
  • PPI 분석 : 단백질 상호 작용 네트워크를 분석하여 유전자들 간의 상호작용을 이해합니다.

3. GSEA (Gene Set Enrichment Analysis)

  • GSEA는 유전자 발현 데이터를 분석하여 유전자 세트의 특이한 분포를 찾아내고, 특정 생물학적 조건과 관련된 유전자들의 기능적 유사성을 조사하는 도구입니다.
  • 유전자 세트 정의 : 사용자가 입력한 조건에 따라 유전자들을 유전자 세트로 묶습니다. 이는 특정 생물학적 조건에 따라 발현이 변화하는 유전자들을 그룹으로 분류하는 데 사용됩니다.
  • 통계적 분석 : 유전자 세트가 어떤 조건에서 더 많이 발현되는지를 통계적으로 분석하여 특이한 유전자 세트를 식별합니다.
  • Input
    • 05_DEG_list_fil.txt (위의 06-2.의 코드에서 이어질 경우, 변수 DEGs_set 사용))
  • Practice #R library(org.Hs.eg.db) library(AnnotationDbi) library(clusterProfiler) DEGs_set <- read.table("05_DEG_list_fil.txt", row.names=1, header=T, sep="\t") DEG_list <- rownames(DEGs_set) go_result <- enrichGO(gene = DEG_list, OrgDb = "org.Hs.eg.db", # 유전자 DB (기본: human) keyType="SYMBOL", # 유전자 ID 형식 ont="all") # 분석할 go의 유형 ("BP", "MF", "CC") pdf('08_GO_dotplot.pdf') dotplot(go_result, split="ONTOLOGY") + facet_grid(ONTOLOGY~., scale="free") dev.off() write.table(go_result, file="09_GO_result.txt", sep="\t", quote=FALSE)
  • Output
    • 08_GO_dotplot.pdf
    • 09_GO_result.txt
      • 08_GO_dotplot.pdf
        RNA
      • 09_GO_result.txt
        RNA
        • Ontology : Ontology 종류
        • ID : GO 항목의 ID (예: "GO:0008150")
        • Description : 해당 GO 항목의 설명 (예: "biological_process")
        • GeneRatio : 해당 GO 항목에 속한 유전자 수와 입력 유전자 리스트의 비율
        • BgRatio : 해당 GO 항목에 속한 전체 유전자 수와 데이터베이스 내 전체 유전자 수의 비율
        • pvalue : 해당 GO 항목의 p-value
        • p.adjust : 다중 검정을 수행한 후의 조정된 p-value
        • qvalue : FDR (False Discovery Rate) 기준의 q-value
        • geneID : 해당 GO 항목에 속하는 유전자 ID
        • Count : 해당 GO 항목에 속하는 유전자 수
08-2. Pathway (KEGG)

KEGG 경로 데이터베이스는 분자 상호 작용, 생화학적 반응, 그리고 생물학적 관계를 기반으로 한 네트워크를 경로 지도 형태로 제공합니다. 이러한 지도는 유전자, 단백질, RNA, 화학 화합물, 글리칸 및 화학 반응뿐만 아니라 질병 유전자와 약물 표적까지 통합할 수 있습니다.

  • Input
    • 05_DEG_list_fil.txt (위의 06-2.의 코드에서 이어질 경우, 변수 DEGs_set 사용))
  • Practice #R library(org.Hs.eg.db) library(AnnotationDbi) library(clusterProfiler) DEGs_set <- read.table("05_DEG_list_fil.txt", row.names=1, header=T, sep="\t") DEG_list <- rownames(DEGs_set) # entrez id로 바꾸기 DEGs_entrez <- mapIds(org.Hs.eg.db, DEG_list, 'ENTREZID', 'SYMBOL') length(DEGs_entrez) length(na.omit(DEGs_entrez)) ### KEGG kegg_entrez <- enrichKEGG(DEGs_entrez, organism = 'hsa') kegg_entrez pdf('10_KEGG_dotplot.pdf') dotplot(kegg_entrez) dev.off() kegg_result <- setReadable(kegg_entrez, 'org.Hs.eg.db', 'ENTREZID') write.table(kegg_result, file="11_KEGG_result.txt", sep="\t", quote=FALSE)
  • Output
    • 10_KEGG_dotplot.pdf
    • 11_KEGG_result.txt
      • 10_KEGG_dotplot.pdf
        RNA
      • 11_KEGG_result.txt
        RNA
        • Category : KEGG pathway가 속한 상위 카테고리
        • Subcategory : KEGG pathway가 속한 하위 카테고리
        • ID : KEGG 항목의 ID (예: "hsa04668")
        • Description : 해당 KEGG 항목의 설명 (예: "TNF signaling pathway")
        • GeneRatio : 해당 KEGG 항목에 속한 유전자 수와 입력된 유전자 리스트의 비율
        • BgRatio : 해당 KEGG 항목에 속한 유전자 수와 DB 내 전체 유전자 수의 비율
        • pvalue : 해당 GO 항목의 p-value
        • p.adjust : 다중 검정을 수행한 후의 조정된 p-value
        • geneID : 해당 KEGG pathway에 속한 유전자의 리스트.
        • Count : 해당 KEGG pathway와 관련된 유전자 수.

Metagenome analysis

00. Metagenome analysis Overview

강물이나 바닷물, 흙 같은 자연 환경부터 생물의 장내미생물, 분변에 이르기까지, 세균, 곰팡이, 원생생물, 바이러스 등 다양한 미생물이 존재합니다. 특정 환경이나 숙주 내에 서식하는 모든 미생물의 유전체를 연구하여 어떤 미생물 종이 존재하는지 분석하는 것을 Metagenomics라고 합니다.

Metagenomics는 연구 방법에 따라 targeted metagenomics와 shotgun metagenomics로 구분됩니다.

Targeted metagenomics는 미생물 유전체의 특정 영역을 증폭하여 분석하는 방법입니다. 이 과정에서는 모든 미생물에서 보존되어 있으면서도 종 간의 서열 차이를 식별할 수 있는 유전자 부위를 타겟으로 합니다. 대표적으로 원핵생물에서는 16S 리보솜 DNA(rDNA), 진핵생물에서는 18S rDNA와 internal transcribed spacers(ITS)가 주로 사용됩니다. 이 방법은 적은 시퀀싱 데이터로도 충분히 연구를 수행할 수 있고, 분석이 비교적 간단하다는 장점이 있습니다. 그러나 PCR 과정에서 특정 종의 서열이 과대 또는 과소 증폭되는 편향(bias)이 발생할 수 있으며, 보통 속(Genus) 수준까지의 동정만 가능하다는 한계가 있습니다.

Shotgun metagenomics는 샘플 내 모든 미생물의 전체 유전체 또는 유전체의 일부를 무작위로 시퀀싱하는 방법입니다. 이 방식은 전체 유전체를 분석하기 때문에 종(Species) 수준까지의 정확한 동정이 가능하며, 유전자 구성, 대사 경로 등 군집의 기능적 특성까지 분석할 수 있다는 장점이 있습니다. 또한, PCR 과정을 생략하므로 targeted metagenomics에서 발생할 수 있는 편향이 없습니다. 그러나 상대적으로 비용이 많이 들고, 데이터 분석에 많은 자원이 필요합니다. 특히, 숙주와 관련된 샘플에서는 host DNA가 과도하게 포함되어 분석이 어려운 경우가 있을 수 있습니다.

Targeted metagenomics는 비용 효율성과 분석의 간단함으로 인해 여전히 널리 사용되고 있으며, 미생물 군집 구조를 이해하는 데 유용한 도구로 자리 잡고 있습니다. 이 튜토리얼에서는 targeted metagenomics를 통해 생성된 데이터를 분석하는 방법을 중점적으로 다룹니다. 분석에 널리 사용되는 대표적인 도구로는 Qiime2, Mothur, DADA2, USEARCH/VSEARCH 등이 있으며, 본 튜토리얼에서는 Qiime2를 활용한 분석 과정을 단계별로 자세히 설명합니다.

Qiime2는 미생물 군집 분석을 위한 소프트웨어로, 분석의 전 과정(데이터의 처리, 분석, 시각화)을 모두 수행할 수 있습니다.

untitled

1. Raw Sequences

DNA 서열과 Phred score를 포함하는 FASTQ 형식의 데이터만 사용할 수 있습니다.

2. Demultiplex

여러 샘플을 합쳐서 한 번에 sequencing 했을 경우 그것을 샘플 별로 다시 나누는 과정입니다. 샘플 별로 분리해서 생산된 경우, 해당 과정은 생략됩니다.

3. Denoise / cluster

Noise data를 제거하고 비슷한 서열을 같은 그룹으로 묶어 고유한 서열을 추출합니다.

4. Feature table, Representative Sequences

최종적으로 representative sequence (혹은 feature)로 된 행과 샘플로 된 열을 가진 read 수에 대한 feature table이 출력됩니다. 이 표는 Taxonomic classification, alpha/beta diversity, Phylogenetic relationship, Differential abundance measurements과 같은 다양한 분석에 사용됩니다.

출처 : https://en.wikipedia.org/wiki/Amplicon_sequence_variant

본 튜토리얼은 Qiime2에서 제공하는 EMP 예제 데이터를 사용했습니다.

EMP(Earth Microbiome Project)란 대표적인 미생물 균총 연구 컨소시엄으로 이 곳에서 제공하는 표준화된 연구 프로토콜에 따라 생산된 데이터를 가리키기도 합니다.

01. Install
01-1. Conda 가상 환경

Qiime2는 python conda 환경에서 실행이 가능합니다. 다음 코드로 Qiime2 분석을 위한 가상 환경을 구축할 수 있습니다. 가상 환경 이름은 qiime2-amplicon-2024.5로 지정했습니다.

# Linux - Install QIIME 2 within a conda environment # we’ll name the environments qiime2-<distro>-2024.5 to indicate what QIIME 2 release is installed conda env create -n qiime2-amplicon-2024.5 --file https://data.qiime2.org/distro/amplicon/qiime2-amplicon-2024.5-py39-linux-conda.yml # Activate the conda environment conda activate qiime2-amplicon-2024.5 # Test your installation qiime --help
02. Importing & Demultiplexing
02-1. import

Raw data를 해당 프로그램에서 인식할 수 있는 artifact 형태로 변환하는 과정이 필요합니다. 디렉터리를 입력합니다.

Qiime2는 다양한 import 옵션이 존재합니다. 다음 Qiime2 tutorial 페이지를 참조하시길 바랍니다. (https://docs.qiime2.org/2024.10/tutorials/importing/)

  • Input
    • Raw data path (emp-single-end-sequences)
  • Practice qiime tools import \ --type EMPSingleEndSequences \ --input-path emp-single-end-sequences \ --output-path emp-single-end-sequences.qza
  • Option description --type : import 하는 데이터의 유형, 예를 들어 이번에 사용한 예제 데이터는 EMP single-end 데이터임으로 EMPSingleEndSequences를 입력 --input-path : import 하는 파일이나 디렉터리의 위치 --output-path : qiime2 artifact 형태로 변환된 결과 파일 이름
  • Output
    • emp-single-end-sequences.qza
02-2. Demultiplexing sequences

예제 데이터인 EMP 데이터와 같이 모든 샘플을 합쳐 시퀀싱하는 방식으로 생산된 데이터는 바코드에 따라 샘플 별로 데이터를 나누는 demultiplexing 과정이 필요합니다.

  • Input
    • emp-single-end-sequences.qza
  • Practice qiime demux emp-single \ --i-seqs emp-single-end-sequences.qza \ --m-barcodes-file sample_metadata.tsv \ --m-barcodes-column barcode-sequence \ --o-per-sample-sequences demux.qza \ --o-error-correction-details demux-details.qza
  • Option description --i-seqs: 입력 시퀀스 파일 (.qza). --m-barcodes-file: 샘플 메타데이터 파일 (TSV 형식). --m-barcodes-column: 메타데이터에서 사용할 바코드 열 이름. --o-per-sample-sequences: 각 샘플의 시퀀스를 포함하는 출력 파일. --o-error-correction-details: 오류 수정 정보 기록 파일
  • Output
    • demux.qza
    • demux-details.qza
02-3. Sequence summary 시각화

qza 파일은 Qiime2 tool 내에서만 사용되는 전용 artifact 파일입니다. 때문에 일반적인 방법으로 내용을 확인할 수 없어 qzv 파일 형태로 변환한 뒤 Qiime2 Viewer (https://view.qiime2.org/)에서 열람해야 합니다.

demux.qza를 demux.qzv로 변환하면 시퀀스 데이터에 대해 전체적인 통계 수치를 얻을 수 있습니다.

  • Input
    • demux.qza
  • Practice qiime demux summarize \ --i-data demux.qza \ --o-visualization demux.qzv
  • Option description --i-data : input 파일 이름 --o-visualization : output 파일 이름
  • Output
    • demux.qzv
  • demux.qzv
image image
03. Denoising & Clustering
03-1. DADA2

Qiime2는 데이터 품질 관리를 위해 실험 과정에서 발생하는 노이즈 데이터를 제거(denoising)하는 다양한 도구를 제공합니다. 대표적으로 DADA2, Deblur 등이 있습니다.

이후 추출된 서열은 각각 고유한 서열로 간주되어 임의의 feature identifier가 부여됩니다. 이 정보는 rep-seq.qza에 저장됩니다. 그리고 각 고유 서열의 수를 counting한 데이터는 table 형태로 table.qza에 저장됩니다. 이 두 데이터는 이후 Metagenome 분석에 사용되는 기본 데이터인 feature table을 이룹니다.

Raw data의 경우 여러 미생물의 서열이 구분 없이 혼재되어 있기 때문에, 이후 효율적인 분석을 위해 같은 종으로 추정되는 유사한 서열들을 하나의 그룹으로 분류하는 과정이 필요합니다. 이런 각각의 미생물 그룹, 단위를 feature라고 합니다. 이 때 각 feature를 대표하는 서열을 representative sequence이라고 합니다. 이렇게 서열들을 같은 feature로 분류하는 방식에는 크게 OTU(Operational Taxonomic Unit) 와 ASV(Amplicon Sequence Variant) 방식이 있습니다.

  • OTU (Operational Taxonomic Unit)
    image

    OTU는 서열 간의 유사성을 기준으로 서열을 클러스터링 합니다. 일반적으로 97% 서열 유사성을 기준으로 합니다.

    크게 reference DB에 매핑하는 Closed-reference OTU picking과 샘플 내의 유사성만을 기반으로 하는 De-novo OTU picking 방식이 있습니다.

    하지만, OTU는 서열 유사성 기준에 의존하기 때문에, 서로 다른 종도 같은 OTU로 묶일 수 있습니다. 이외에도 De-novo OTU 방식의 경우 해당 데이터 세트 내 서열 간의 유사성을 기준으로 하기에 다른 연구 간의 비교가 불가능하다는 점과, PCR, 시퀀싱 등의 실험 과정에서 발생하는 Noise 데이터가 clustering에 영향을 끼치는 등의 한계를 가져 최근에는 ASV 방식이 더 주목받고 있습니다.

  • ASV
    image

    ASV는 우선 noise 데이터를 제거하는 denoising 과정을 수행합니다. DADA2와 같은 알고리즘을 사용해 각 서열의 p-value를 계산하고, 통계적으로 신뢰할 수 있는 서열만을 남깁니다.

    이후 추출된 서열들은 clustering 없이 고유의 개별적인 representative sequence로 취급합니다. 이로 인해 실제 biological variation도 찾아낼 수 있고, 다른 연구 간에도 쉽게 비교가 가능하며 종 수준에서의 식별이 가능하게 합니다. 기존 OTU 방식보다 더 높은 해상도와 정확성을 제공하기 때문에 최근에 널리 사용되는 방식입니다.

출처 : https://en.wikipedia.org/wiki/Amplicon_sequence_variant

이 튜토리얼에서는 여러 denoising 방법 중 DADA2 파이프라인을 사용하였습니다.

DADA2는 Illumina 시퀀스 데이터의 품질 관리를 위한 파이프라인으로, raw data에서 phiX 서열 및 키메라 서열과 같은 노이즈 데이터를 제거하는 과정을 포함합니다. 이를 통해 최종적으로 고품질의 시퀀스 데이터만을 확보하여 이후의 분석에 활용할 수 있습니다.

  • Input
    • demux.qza
  • Practice # DADA2 denoising qiime dada2 denoise-single \ --i-demultiplexed-seqs demux.qza \ --p-trim-left 0 \ --p-trunc-len 120 \ --o-representative-sequences rep-seqs.qza \ --o-table table.qza \ --o-denoising-stats stats.qza
  • Option description --i-demultiplexed-seqs: 입력으로 사용할 demultiplex 된 시퀀스 파일 (.qza). --p-trim-left: 서열의 시작에서 자를 염기 수를 지정. 위의 경우 0이므로 자르지 않음. --p-trunc-len: 각 서열을 잘라낼 위치를 지정. 위의 경우 120번째 위치에서 서열을 자름. --o-representative-sequences: denoising 후 생성된 representative sequence를 포함하는 출력 파일 이름 (.qza) --o-table: denoising 결과로 생성된 feature 테이블을 포함하는 출력 파일 이름 (.qza) --o-denoising-stats: denoising 과정에서 생성된 통계 정보를 포함하는 출력 파일 이름 (.qza)
  • Output
    • rep-seqs.qza
    • table.qza
    • stats.qza
03-2. 결과 시각화

결과 파일(table.qza, rep-seqs.gza)을 qzv 형식으로 변환하면 Qiime2 view에서 내용을 확인할 수 있습니다.

또 stats.qza는 qzv로 변환하면 전체적인 denoising 결과에 대한 통계 수치를 얻을 수 있습니다.

qzv 파일은 Qiime2 viewer(https://view.qiime2.org/)에서 visualization이 가능합니다.

  • Input
    • table.qza
    • rep-seqs.qza
    • stats.qza
    • sample_metadata.tsv
  • Practice # table.qza visulization qiime feature-table summarize \ --i-table table.qza \ --o-visualization table.qzv \ --m-sample-metadata-file sample_metadata.tsv # rep-seqs.qza visulization qiime feature-table tabulate-seqs \ --i-data rep-seqs.qza \ --o-visualization rep-seqs.qzv # stats.qza visulization qiime metadata tabulate \ --m-input-file stats.qza \ --o-visualization stats.qzv
  • Option description --i-table : 입력할 feature table 파일 (.qza) --i-data : 입력할 representative sequence 파일 (.qza) --m-input-file : 입력할 statistic 파일 (.qza) --o-visualization : 시각화된 결과 파일 (.qzv)
  • Output
    • table.qzv
    • rep-seqs.qzv
    • stats.qzv
  • table.qzv
    image
  • rep-seqs.qzv
    image
  • stats.qzv
    image
04. Generating a tree
04-1. align-to-tree-mafft-fasttree

계통발생학적 다양성 분석에는 어떤 공통 조상으로부터 분기한 관계를 보여주는 계통수(rooted tree) 정보가 필수입니다. 이 분석을 위하여 align-to-tree-mafft-fasttree을 사용하여 representative sequence를 처리합니다.

먼저, MAFFT(Multiple Alignment using Fast Fourier Transform)은 Fast Fourier 알고리즘을 기반으로 빠르고 효율적으로 다중 정렬을 수행하는 도구입니다. 이 과정에서 계통학적 정보가 부족하거나 애매하게 정렬된 열은 제거됩니다. 정렬된 데이터는 masked 상태로 표현됩니다. 그 다음, 정렬된 서열을 바탕으로 FastTree를 사용하여 계통수(phylogenetic tree)를 추론합니다. FastTree는 최대 우도(maximum likelihood) 방법을 이용하여 대규모 데이터 세트를 신속하고 효율적으로 처리합니다. 최종적으로 이 과정에서 계통수의 중간 지점에서 공통 조상, 즉 분기점에 대한 데이터도 산출됩니다.

  • Input
    • rep-seqs.qza
  • Practice qiime phylogeny align-to-tree-mafft-fasttree \ --i-sequences rep-seqs.qza \ --o-alignment aligned-rep-seqs.qza \ --o-masked-alignment masked-aligned-rep-seqs.qza \ --o-tree unrooted-tree.qza \ --o-rooted-tree rooted-tree.qza
  • Option description --i-sequences : 입력할 representative sequence 파일 (.qza) -o-alignment: 정렬된 서열 파일 (.qza) -o-masked-alignment: 정보가 적거나 불분명한 열이 제거된 정렬 서열 파일 (.qza) -o-tree: 생성된 분기 정보가 없는(unrooted) 계통수를 출력 (.qza) -o-rooted-tree: 분기 정보가 있는 (rooted) 계통수를 출력 (.qza)
  • Output
    • aligned-rep-seqs.qza
    • masked-aligned-rep-seqs.qza
    • unrooted-tree.qza
    • rooted-tree.qza
05. Diversity analyses
05-1. core-metrics-phylogenetic

샘플 내 혹은 샘플 간에 미생물의 다양성을 수치로 나타낼 수 있으며, 이를 alpha diversity와 beta diversity로 구분합니다.

Alpha diversity에서 단일 샘플 내의 다양성을 수치로 나타낼 수 있는데, 대표적으로 shannon 지수, observed_features 등이 있습니다. 반면 beta diversity는 서로 다른 샘플 간의 다양성을 나타냅니다. 그래서 샘플 조합 별로 수치가 다르게 나옵니다. 대표적인 지표로 bray-curtis, jaccard, unweighted unifrac, weighted unifrac 등이 있습니다.

아래 코드를 통해 이러한 결과를 한 번에 얻을 수 있습니다. 이후 Beta diversity 결과는 emperor이라는 tool에서 주성분 분석(PCoA, Principle Coordinates Analysis)을 통해 시각화할 수 있습니다.

  • Input
    • rooted-tree.qza
    • table.qza
  • Practice qiime diversity core-metrics-phylogenetic \ --i-phylogeny rooted-tree.qza \ --i-table table.qza \ --p-sampling-depth 1103 \ --m-metadata-file sample_metadata.tsv \ --output-dir core-metrics-results
  • Option description --i-phylogeny : rooted 계통수 파일 (.qza) --i-table : 샘플들에 대한 feature table 파일 (.qza) --p-sampling-depth : 각 샘플에서 무작위로 선택할 read의 수(샘플링의 깊이 설정) --m-metadata-file : Emperor 플롯에 사용할 metadata 파일 (.tsv) --output-dir : 실행 결과를 저장할 디렉터리
  • Output
    • alpha diversity result
      • core-metrics-results/shannon_vector.qza
      • core-metrics-results/observed_features_vector.qza
      • core-metrics-results/evenness_vector.qza
      • core-metrics-results/faith_pd_vector.qza
      • core-metrics-results/rarefied_table.qza
    • beta diversity result
      • core-metrics-results/bray_curtis_distance_matrix.qza
      • core-metrics-results/bray_curtis_pcoa_results.qzv
      • core-metrics-results/jaccard_distance_matrix.qza
      • core-metrics-results/jaccard_pcoa_results.qzv
      • core-metrics-results/unweighted_unifrac_distance_matrix.qza
      • core-metrics-results/unweighted_unifrac_pcoa_results.qzv
      • core-metrics-results/weighted_unifrac_distance_matrix.qza
      • core-metrics-results/weighted_unifrac_pcoa_results.qzv
      • core-metrics-results/unweighted_unifrac_emperor.qzv
      • core-metrics-results/jaccard_emperor.qzv
      • core-metrics-results/bray_curtis_emperor.qzv
      • core-metrics-results/weighted_unifrac_emperor.qzv
  • core-metrics-results/unweighted_unifrac_emperor.qzv
    image
  • core-metrics-results/jaccard_emperor.qzv
    image
  • core-metrics-results/bray_curtis_emperor.qzv
    image
  • core-metrics-results/weighted_unifrac_emperor.qzv
    image
05-2. alpha-group-significance

Alpha diversity는 샘플 내에서 종 풍부도와 다양성을 측정하는 지표로, 샘플 그룹 간의 유의미한 차이를 비교하기 위해서는 샘플 그룹 간의 통계적 검정이 필요합니다. 주로 Kruskal-Wallis test와 같은 비모수 검정을 사용하며, 이들 간의 차이를 평가합니다. 이러한 분석 결과는 boxplot로 시각화되며 p-value 같은 통계적 수치도 함께 표시됩니다. 이는 서로 다른 조건에 따른 생물 다양성의 차이를 평가할 때 유용한 방법입니다.

  • Input
    • faith_pd_vector.qza
    • evenness_vector.qza
  • Practice qiime diversity alpha-group-significance \ --i-alpha-diversity core-metrics-results/faith_pd_vector.qza \ --m-metadata-file sample_metadata.tsv \ --o-visualization core-metrics-results/faith-pd-group-significance.qzv qiime diversity alpha-group-significance \ --i-alpha-diversity core-metrics-results/evenness_vector.qza \ --m-metadata-file sample_metadata.tsv \ --o-visualization core-metrics-results/evenness-group-significance.qzv
  • Option description --i-alpha-diversity : 입력할 alpha diversity 파일 (.gza) --m-metadata-file : metadata 파일 (.tsv) --o-visualization : 결과 시각화 파일(.qzv)
  • Output
    • core-metrics-results/faith-pd-group-significance.qzv
    • core-metrics-results/evenness-group-significance.qzv
  • core-metrics-results/faith-pd-group-significance.qzv
    image image
  • core-metrics-results/evenness-group-significance.qzv
    image image
06. Taxonomy analysis
06-1. classify-sklearn

샘플마다 어떠한 미생물 분류군이 존재하는지, 그 분류학적 분포를 파악하는 단계입니다. 각 feature의 representative sequence와 참조 데이터베이스의 서열을 비교하여 해당 feature가 어떠한 분류학적 그룹(taxonomy)에 속하는지를 식별합니다. 이번 분석에서는 Qiime2에서 제공한 Greengenes라는 DB 기반의 gg-13-8-99-515-806-nb-classifier.qza 파일을 활용했습니다.

  • Input
    • rep-seqs.qza
    • gg-13-8-99-515-806-nb-classifier.qza
  • Practice qiime feature-classifier classify-sklearn \ --i-classifier gg-13-8-99-515-806-nb-classifier.qza \ --i-reads rep-seqs.qza \ --o-classification taxonomy.qza
  • Option description --i-classifier : 훈련된 classifier 파일 (.qza) --i-reads : 입력할 representative sequence 파일 (.qza) --o-classification : taxonomy 매칭 결과 파일(.qza)
  • Output
    • taxonomy.qza
06-2. Taxonomy 결과 시각화 (table)

Qiime2 viewer에서 taxonomy.qza를 볼 수 있도록 qzv 파일로 변환합니다.

  • Input
    • taxonomy.qza
  • Practice # Making qzv file qiime metadata tabulate \ --m-input-file taxonomy.qza \ --o-visualization taxonomy.qzv
  • Option description --m-input-file : 입력할 taxonomy 파일 (.qza) --o-visualization : 결과 시각화 파일(.qzv)
  • Output
    • taxonomy.qzv
  • taxonomy.qzv
    image
06-3. Taxonomy 결과 시각화 (barplot)

Taxonomy 결과와 기존 feature table 결과를 통합하여 샘플별로 존재하는 taxonomy를 barplot 형태로 볼 수 있도록 시각화합니다. metadata 정보를 입력해 x축, y축을 그룹, 임상 정보 별로 정렬할 수 있습니다.

  • Input
    • table.qza
    • taxonomy.qza
    • sample_metadata.tsv
  • Practice qiime taxa barplot \ --i-table table.qza \ --i-taxonomy taxonomy.qza \ --m-metadata-file sample_metadata.tsv \ --o-visualization taxa-bar-plots.qzv
  • Option description --i-table : 입력할 feature table 파일 (.qza) --i-taxonomy : 입력할 taxonomy 파일 (.qza) --m-metadata-file : metadata 파일 (.tsv) --o-visualization : 결과 시각화 파일(.qzv)
  • Output
    • taxa-bar-plots.qzv
  • taxa-bar-plots.qzv
    image
07. Differential abundance testing
07-1. table 추출

서로 다른 실험 조건이나 집단 간에 특정 미생물 종이 유의미하게 차이가 나는지를 확인하기 위해 Differential Abundance Testing을 수행합니다. 이는 RNA-seq의 DEG(Differentially Expressed Genes) 분석과 유사한 목적을 가지고 있으며, metagenome 분석에서도 두 그룹 간의 미생물 분류군에서 유의미한 차이를 식별할 수 있도록 도와줍니다. 예를 들어, 건강한 사람과 질병을 앓고 있는 사람의 microbiome 차이를 분석하거나, 환경 변화에 따른 미생물 군집의 변화를 평가할 수 있습니다.

본 튜토리얼에서는 피실험자(subject)의 장내 미생물(gut microbiome) 군집 데이터를 비교 분석하여, 두 피실험자 간에 어떤 미생물이 차별적으로 풍부한지 확인하고자 합니다. 따라서 기존 분석된 데이터에서 gut의 데이터 만을 따로 추출하였습니다.

  • Input
    • table.qza
  • Practice qiime feature-table filter-samples \ --i-table table.qza \ --m-metadata-file sample_metadata.tsv \ --p-where "[body-site]='gut'" \ --o-filtered-table gut-table.qza
  • Option description --i-table : 입력할 feature table 파일 (.qza) --m-metadata-file : 메타데이터 (.tsv) --p-where : table에서 추출한 값의 조건 --o-filtered-table : 필터링된 결과 table 파일(.qzv)
  • Output
    • gut-table.qza
07-2. ANCOM-BC

ANCOM-BC는 군집 내 미생물의 차등 풍부도 차이를 평가하는 통계적 방법으로, 미생물 군집 데이터의 편향을 교정하여 정확한 결과를 제공합니다. 특히 회귀 모델을 사용하여 각 미생물의 절대 풍부도를 추정하고, 이를 바탕으로 두 집단 간 차이를 평가합니다.

ANCOM-BC를 이용해 두 피실험자 간의 장내 미생물 군집에서 통계적으로 유의미한 차이를 확인하고, 결과를 barplot으로 시각화하였습니다.

  • Input
    • gut-table.qza
    • sample_metadata.tsv
  • Practice qiime composition ancombc \ --i-table gut-table.qza \ --m-metadata-file sample_metadata.tsv \ --p-formula 'subject' \ --o-differentials ancombc-subject.qza qiime composition da-barplot \ --i-data ancombc-subject.qza \ --p-significance-threshold 0.001 \ --o-visualization da-barplot-subject.qzv
  • Option description [ancombc] --i-table : 입력할 feature table 파일 (.qza) --m-metadata-file : metadata 파일 (.tsv) --p-formula : 분석에 사용할 임상정보 열의 이름 --o-differentials : 차등 풍부도 결과 파일 (.qza) [da-barplot] --i-data ancombc-subject.qza : 차등 풍부도(ANCOM-BC) 결과 파일 (.qza) --p-significance-threshold : 유의성 임계값. 위의 경우 p-value 0.001 이하일 때 유의미한 차이로 간주함. --o-visualization : 결과 시각화 파일(.qzv)
  • Output
    • ancombc-subject.qza
    • da-barplot-subject.qzv
  • da-barplot-subject.qzv
    image