Palmsonntagmorgen

NGSデータを使った解析と、その周辺。

HISAT-StringTie-Ballgown を試してみよう

せっかくNature Protocolの論文があるので試してみよう企画。
Nature Protocolはスクリプトがそのまま載っているので、追試に最適です。 一方、古いライブラリが指定されていると手元の環境で動かなかったり、著者のレベルによってへんてこなスクリプトになっていたりしますが…

今回使うのは以下の論文です。

www.nature.com

HISAT-StringTie-Ballgown については前回の記事を参照してください。

RNA-seqによる発現量解析 - Palmsonntagmorgen

hisat2, stringtieをインストール

hisat2, stringtie およびgffcompareも必要になりますので、コンパイル済ファイルをダウンロード、解凍します。

$ wget http://ccb.jhu.edu/software/hisat2/dl/hisat2-2.1.0-Linux_x86_64.zip
$ wget http://ccb.jhu.edu/software/stringtie/dl/stringtie-1.3.5.Linux_x86_64.tar.gz
$ wget http://ccb.jhu.edu/software/stringtie/dl/gffcompare-0.10.6.Linux_x86_64.tar.gz
$ unzip hisat2-2.1.0-Linux_x86_64.zip
$ tar zxvf stringtie-1.3.5.Linux_x86_64.tar.gz
$ tar zxvf gffcompare-0.10.6.Linux_x86_64.tar.gz

解凍したらパスを通します。 ~/.barhrcに以下のような感じで記述し(場所は自分のディレクトリに合わせる)、source ~/.barhrcを実行します。

export PATH=$PATH:$HOME/hisat2-2.1.0/:$HOME/stringtie-1.3.5.Linux_x86_64:$HOME/gffcompare-0.10.6.Linux_x86_64/

パスが通ったか確認しましょう。

$ hisat2 --version
/home/rnakato/git/binaries/hisat2-2.1.0/hisat2-align-s version 2.1.0
64-bit
Built on login-node03
Wed Jun  7 15:53:42 EDT 2017
Compiler: gcc version 4.8.2 (GCC) 
Options: -O3 -m64 -msse2 -funroll-loops -g3 -DPOPCNT_CAPABILITY
Sizeof {int, long, long long, void*, size_t, off_t}: {4, 8, 8, 8, 8, 8}

$ stringtie --version
1.3.5

$ gffcompare --version
gffcompare v0.10.6

バージョンが返ってきたら成功です。Not foundであればパスが通っていませんので.bashrcを見直しましょう。

Ballgownのインストール

BallgownはRで動きますので、R上で以下のコマンドを実行してインストールします。

> install.packages("devtools",repos="http://cran.us.r-project.org")
> source("http://www.bioconductor.org/biocLite.R")
> biocLite(c("alyssafrazee/RSkittleBrewer","ballgown","genefilter","dplyr","devtools"))

上記コマンドはNature protocolそのままですが、ballgownと共に必要になる関連ツール群もインストールされているようです。 最初にdevtoolsをインストールしていますが、これはgithub上のツールをインストールするためのツールです。 biocLiteBioconductorからツールをインストールするコマンドで、sourceコマンドで参照元URLを指定します。

データダウンロード

次に使用するデータ群をダウンロードします。これは論文で提供されているものです。

$ wget ftp://ftp.ccb.jhu.edu/pub/RNAseq_protocol/chrX_data.tar.gz
$ wget ftp://ftp.ccb.jhu.edu/pub/RNAseq_protocol/hg38_ucsc.annotated.gtf
$ tar zxvf chrX_data.tar.gz 

これはけっこう時間がかかります。
解凍されたディレクトリに何が入っているか確認しましょう。

$ ls chrX_data/*
chrX_data/geuvadis_phenodata.csv  chrX_data/mergelist.txt

chrX_data/genes:
chrX.gtf

chrX_data/genome:
chrX.fa

chrX_data/indexes:
chrX_tran.1.ht2  chrX_tran.3.ht2  chrX_tran.5.ht2  chrX_tran.7.ht2
chrX_tran.2.ht2  chrX_tran.4.ht2  chrX_tran.6.ht2  chrX_tran.8.ht2

chrX_data/samples:
ERR188044_chrX_1.fastq.gz  ERR188257_chrX_1.fastq.gz  ERR188401_chrX_1.fastq.gz
ERR188044_chrX_2.fastq.gz  ERR188257_chrX_2.fastq.gz  ERR188401_chrX_2.fastq.gz
ERR188104_chrX_1.fastq.gz  ERR188273_chrX_1.fastq.gz  ERR188428_chrX_1.fastq.gz
ERR188104_chrX_2.fastq.gz  ERR188273_chrX_2.fastq.gz  ERR188428_chrX_2.fastq.gz
ERR188234_chrX_1.fastq.gz  ERR188337_chrX_1.fastq.gz  ERR188454_chrX_1.fastq.gz
ERR188234_chrX_2.fastq.gz  ERR188337_chrX_2.fastq.gz  ERR188454_chrX_2.fastq.gz
ERR188245_chrX_1.fastq.gz  ERR188383_chrX_1.fastq.gz  ERR204916_chrX_1.fastq.gz
ERR188245_chrX_2.fastq.gz  ERR188383_chrX_2.fastq.gz  ERR204916_chrX_2.fastq.gz

ゲノム配列や遺伝子ファイル、hisat2用のインデックス、fastqデータなどが入っています。 ファイルサイズと計算量を抑えるために、chrXだけを抽出したもののようですね。

マッピング

ツールとデータが揃いましたので、早速実験しましょう。まずはhisat2によるマッピングです。

for prefix in ERR188044 ERR188104 ERR188234 ERR188245 ERR188257 ERR188273 ERR188337 ERR188383 ERR188401 ERR188428 ERR188454 ERR204916
do
    hisat2 -p 16 --dta -x chrX_data/indexes/chrX_tran \
       -1 chrX_data/samples/${prefix}_chrX_1.fastq.gz \
       -2 chrX_data/samples/${prefix}_chrX_2.fastq.gz \
       -S ${prefix}_chrX.sam
    samtools sort -@ 16 -o ${prefix}_chrX.bam ${prefix}_chrX.sam
done

論文ではわかりやすさのため1サンプルずつ順番に書き下していますが、面倒なので、ここではfor文を使って全サンプルを順にマッピングしています。
${prefix} のところにERR188044, ERR188104, ... と順に入っていく感じです。
論文ではCPU数を8に指定していましたが、早く計算したいのでここでは16にしています。
ついでにsamtoolsによるsort.bamへの変換も同時に行っています。
手元の環境では1サンプルにつき数十秒で計算終了しました。

遺伝子ファイル作成、発現量計測

次にStringtieを使って発現量を計測します。こちらもfor文で回します。

for prefix in ERR188044 ERR188104 ERR188234 ERR188245 ERR188257 ERR188273 ERR188337 ERR188383 ERR188401 ERR188428 ERR188454 ERR204916
do
    stringtie -G chrX_data/genes/chrX.gtf -o ${prefix}_chrX.gtf \
              -p 16 -l ${prefix} ${prefix}_chrX.bam
done

入力がbamファイル、出力がgtfファイルです。 完了したら、各サンプルのgtfファイルをマージしましょう。

$ stringtie --merge -p 8 -G chrX_data/genes/chrX.gtf \
 -o stringtie_merged.gtf chrX_data/mergelist.txt

入力となる各サンプルのgtfファイルは、chrX_data/mergelist.txt内に記載されています。
ここでは著者が親切にリストを既に作ってくれていますが、通常は自分で新規作成するものです。

遺伝子ファイルの比較

論文ではoptionalとなっていますが、gffcompareを使って、生成された遺伝子リストとreferenceの遺伝子リストを比較することができます。

$ gffcompare -r chrX_data/genes/chrX.gtf -G -o merged stringtie_merged.gtf

この作業により、referenceに含まれない新規転写物を探索することができます。

次回に続きます。

HISAT-StringTie-Ballgown を試してみよう その2 - Palmsonntagmorgen

RNA-seqによる発現量解析

本業の方で色々忙しくなっておりまして、更新の間が開いてしまいました。

今回はRNA-seqについて語りたいと思います。 RNA-seqはChIP-seqよりもメジャーなので、日本語での解説ブログも充実していますが、情報が古いものだと今だにtophat-cufflinksを使っていたりします。それじゃだめだよ!というお話。

ここではツールのレビューがメインです。RNA-seq解析のHowtoそのものについては下記サイトが大変わかりやすいですので、参照されてください。RベースでのRNA-seq解析法です。

RNA-Seq | 遺伝子発現量解析

RNA-seq

RNA-seqの目的は大きく分けて、

  • 既知遺伝子の発現量を網羅的に計測し、複数サンプルで発現変動比較する
  • 未知の転写物(isoform含む)を同定する

の2つがあり、前者のケースが大半かと思います。
前者の場合、既知RNAのデータベースに対してリードをマッピングします。後者の場合はゲノムに直接マッピングした後アセンブリングするか、まずリードをアセンブリングしてからゲノムにマッピングすることになります。

RNA-seqでの発現量解析

RNA-seqの一般的なプロトコルは、

  • リードを遺伝子・ゲノムにマッピングマッピング
  • 遺伝子ごとにマップリード数をカウント、正規化(発現量計測)
  • サンプルごとに発現量を比較(発現変動解析)

の3ステップに分けられ、それぞれ異なるプログラムが必要です。 ステップの詳細が知りたい方はConesaらの論文*1を参照されると良いでしょう。

Tophat-cufflinks

Tophatはリードをマッピングするツール、cufflinksは発現量計測、発現変動解析、新規転写物の同定などのコマンドがセットになったプログラム集です。
tophat-cufflinksは様々な目的に利用可能であること、解説ページが豊富に公開されていたこと、1 replicateでも発現変動比較ができるといったメリットがあり、一時期はかなり普及していました。

その後tophat-cufflinksは開発・サポートが終了し、後継のhisat2またはkallistoに切り替えることが開発者より推奨されています。精度面の問題も明らかになってきており、今ではほとんど使われることもなくなったのですが、論文の査読をしているとtophat-cufflinksを使っているものに未だに出くわします。初心者ならともかく、ある程度サーベイして知識を持った人が未だに使っているのは正直勉強不足だろうと思いますが。。。

最近のツール事情

RNA-seqのツール開発は今でも群雄割拠の様相を呈しており、ツールごとの精度比較を行ったサーベイ論文がいくつか発表されています*2*3。この論文によれば、cufflinksはsingle exonの遺伝子に対して非常に精度が低くなることが報告されています。また、single-end RNA-seqでisoformレベルの発現量を推定した場合にも精度が悪いようです。また、1サンプルからの発現変動比較が可能ですが、1サンプルだと当然精度が悪いです。 従って、paired-endを使って遺伝子レベルの発現量比較をしている場合のみ、tophat-cufflinksはいちおう今でも利用可能ですが、特に使い続けるメリットはありません…査読者にも必ず突っ込まれるでしょう。

ツールの推奨組み合わせ

基本的にはマッピングー発現量計測ー発現変動解析の流れで用いるツール群はセットになっています。 検証されていない組み合わせを用いると予期せぬエラーが起きる可能性がありますので、素直に推奨組み合わせを使いましょう。 具体的には以下のような組み合わせがあります(/ で挟んでいるものはどちらも利用可という意味です)。

  • (bowtie2/STAR)ーRSEMー(edgeR/DESeq2)
  • Hisat2ーStringTieーBallgown
  • kallistoーsleuth
  • Salmonー(edgeR/DESeq2)

いわゆる正統派の「マッピングー発現量計測ー発現変動解析」という意味では、 (bowtie2/STAR)-RSEM-(edgeR/DESeq2)を使うのが良いと個人的には思います。精度は最高レベルで、single-endでも利用可、遺伝子単位にもtranscript単位にも対応しており、利用実績も多いです。bowtie2とSTARは精度はそれほど変わりませんが、STARの方が高速です(そのかわりメモリ消費がとても大きい)。edgeRとDESeq2はどちらも優れたツールなので、お好みでよいと思います。他にもいくつかツールはありますが、精度面でこれらを大きく超えることはありません。TIGAR2という国産の発現量計測ツールもありますが、ものすごく遅い割に精度はそんなに変わりません。。

Hisat2-StringTie-Ballgownは新規転写物の同定が可能で、プロトロルがNature protocolsに公開されています*4。一方、既知の遺伝子発現計測では精度はそれほどでもないです。 グラフゲノムアラインメントというコンセプトが取られており、最近はメタゲノム(細菌叢)の解析への応用が検討されています。 なお、eXpressという類似のツールがありますが、こちらはサポート終了していますので使わないようにしましょう。

kallistoとSalmonは"pseudo-alignment (偽アラインメント)"と言って、リードを遺伝子にひとつひとつマップすることなく遺伝子発現を計測可能となったツールです。そのため大変高速です(試してみるとびっくりします)。これはひとつのエポックメイキングであり、精度面でも最高レベルに近いため、「これからはpseudo-alignment だろう!」という機運はあるのですが、デフォルトではBAMファイルを生成してくれない(マッピングしないので)ことや、利用実績が少なくちょっと怖いこともあり、今のところ様子見している人が多いように感じます。なおSailfishというツールもありますが、これはSalmonの先行ツールです。
kallistoは少し癖があります。基本的にはpaired-endのみに対応で、sleuthという独自の発現変動解析ツールがペアになっており、これ以外は使わないことが推奨されています(組み合わせた場合にどうなるのかは未確認です)。そのためedgeRなどを使いたい人は使えないということになってしまいますね。
また、kallisto・Salmonともtranscript単位でしか発現量を出力してくれません。遺伝子単位での発現量マトリクスを生成したい場合はtximport*5というツールを併せて使いましょう。

まとめ

ここではマッピングー発現量解析ー発現変動解析のためのツールを簡単に紹介しました。 他にも、正規化手法やread assembling, alternative splicingなどさまざまな目的の手法が本当にたくさんあり、全てサーベイするのは難しいほどです。

ちなみに私はSTAR-RSEM-edgeRを使っています。pseudo-alignmentの高速性は大変魅力的なのですが、万一後から大問題が発覚すると怖いので、今のところ保守的に行っとこうという感じですね。。。お試しレベルではkallistoもSalmonも使ってはいます。おそらく二年後くらいにはまた様子がすっかり変わっているのでしょうね。

*1:A. Conesa et al., A survey of best practices for RNA-seq data analysis, Genome biology 2016, DOI 10.1186/s13059-016-0881-8

*2:A. Kanitz et al., Comparative assessment of methods for the computational inference of transcript isoform abundance from RNA-seq data, Genome Biology, 2015, DOI 10.1186/s13059-015-0702-5

*3:M. Teng et al., A benchmark for RNA-seq quantification pipelines, Genome Biology, 2016, DOI 10.1186/s13059-016-0940-1

*4:M. Pertea et al., Transcript-level expression analysis of RNA-seq experiments with HISAT, StringTie and Ballgown, Nature Protocols, 2016, doi:10.1038/nprot.2016.095

*5:http://bioconductor.org/packages/release/bioc/html/tximport.html

2サンプル間ピーク比較

2つのサンプルから得られたピークセットがどのくらい重なるのか調べたい!という時の方法です。

今回はBEDtoolsを使うやり方と、拙作のcompare_bsを使うやり方を紹介します。

ピークデータのダウンロード

ピークはBED形式であれば何でもよいのですが、ここでは例としてUCSCからH1細胞のCjunとMaxのピークファイルをダウンロードします。
(.narrowPeak という拡張子のファイルですが、これらはMACS2で得られたピークファイルで、BED形式として扱えます。)

 $ wget http://hgdownload.soe.ucsc.edu/goldenPath/hg19/encodeDCC/wgEncodeAwgTfbsUniform/wgEncodeAwgTfbsSydhH1hescCjunIggrabUniPk.narrowPeak.gz
 $ wget http://hgdownload.soe.ucsc.edu/goldenPath/hg19/encodeDCC/wgEncodeAwgTfbsUniform/wgEncodeAwgTfbsSydhH1hescMaxUcdUniPk.narrowPeak.gz

解凍後、ピーク数を確認してみましょう。

 $  gunzip *.gz
 $  wc -l wgEncode*
   2148 wgEncodeAwgTfbsSydhH1hescCjunIggrabUniPk.narrowPeak
  11129 wgEncodeAwgTfbsSydhH1hescMaxUcdUniPk.narrowPeak
  13277 total

Cjunのピークはやや少ないようです。

bedtools

bedtoolsのintersectを使うと、共通するピーク領域を出力してくれます。その後数をカウントすればピーク数が判明します。

(Bedtoolsの詳細はこちら: BEDtoolsワンライナー覚書 - Palmsonntagmorgen

 $ bedtools intersect \ 
    -a wgEncodeAwgTfbsSydhH1hescCjunIggrabUniPk.narrowPeak \
    -b wgEncodeAwgTfbsSydhH1hescMaxUcdUniPk.narrowPeak \
     > and.bed
 $  wc -l and.bed
377 and.bed

Cjunの2148ピークのうち、Maxと重なるものは377ピークになりました。

bedtools intersectは2つのピークが1塩基でも重なっている場合にoverlapと判定します。 また、サンプルAの1つのピークに大してサンプルBの3つのピークが重なる場合、出力されるピーク数は3つになります。コマンドに -wa オプションをつけると、1つのピークとして出力されます。
intersectで出力される領域については、以下に図解があります。
intersect — bedtools 2.29.2 documentation

compare_bs

compare_bsは以下の記事で説明したChIPseqTools の中にあります。

GitHubからプログラムをダウンロード・インストール - Palmsonntagmorgen

compare_bsを使うと以下のようになります。

 $ compare_bs -and \
    -1 wgEncodeAwgTfbsSydhH1hescCjunIggrabUniPk.narrowPeak \
    -2 wgEncodeAwgTfbsSydhH1hescMaxUcdUniPk.narrowPeak \
    > and.bed
 $ head and.bed
#file1: wgEncodeAwgTfbsSydhH1hescCjunIggrabUniPk.narrowPeak
#file2: wgEncodeAwgTfbsSydhH1hescMaxUcdUniPk.narrowPeak
#num1: 2148     num2: 11129     num1_overlap: 373 (17.4%)       num1_notoverlap: 1775 (82.6%)   num2_overlap: 378 (3.4%)num2_notoverlap: 10751 (96.6%)
#peakwidth total1: 523816 bp    peakwidth total2: 3534874 bp    overlappeaks total: 70413 bp (13.44% / 1.99%)
chromosome      start   end     summit  length  enrich  intensity
chr10   80917404        80917527        80917465        123     0.00    149.81
chr22   39570815        39571059        39570937        244     0.00    142.53
chr18   9643685 9643754 9643719 69      0.00    133.02
chr6    20811494        20811738        20811616        244     0.00    132.72
chr1    205263766       205264010       205263888       244     0.00    116.91

compare_bsの出力では、冒頭にピーク数のスタッツが表示されます。 この場合、Cjunのピーク数2148、Maxのピーク数11129で、CjunのうちMaxと重なるものが373ピーク、MaxのうちCjunと重なるものが378ピークとわかります。
(CjunとMaxでそれぞれ重なったピーク数がずれているのは、ピークの重なりが1対1対応でないことに起因します。つまり1つのピークに対して複数の相手方ピークが重なる可能性があるということです。)

その下の行の #peakwidth total は、ピークの数でなく延べピーク幅で重なりをカウントしたものです。

compare_bs はデフォルトでは「サンプル1のピークのうち、サンプル2と重ならないもの」を出力し、-and オプションをつけると重なるものを出力します。 ですので、出力されるピークは bedtools intersect の -waオプションと同じく、サンプル1のピーク幅になります。

重なりの定義もbedtools と同じく、1塩基でも重なればoverlapと判定します。 -l 10000 とオプションをつけると、10kbpまで離れたピークをoverlapとして判定します。

 $  ~/git/ChIPseqTools/bin/compare_bs -and -l 10000  \
     -1 wgEncodeAwgTfbsSydhH1hescCjunIggrabUniPk.narrowPeak  \
     -2 wgEncodeAwgTfbsSydhH1hescMaxUcdUniPk.narrowPeak \
     -nobs
#file1: wgEncodeAwgTfbsSydhH1hescCjunIggrabUniPk.narrowPeak
#file2: wgEncodeAwgTfbsSydhH1hescMaxUcdUniPk.narrowPeak
#num1: 2148     num2: 11129     num1_overlap: 689 (32.1%)       num1_notoverlap: 1459 (67.9%)   num2_overlap: 787 (7.1%)num2_notoverlap: 10342 (92.9%)
#peakwidth total1: 523816 bp    peakwidth total2: 3534874 bp    overlappeaks total: 6727767 bp (1284.38% / 190.33%)

ここでは-nobs オプションをつけて、ピークリストを出力せずに冒頭のスタッツのみを表示しています。 10kbpまで重なりの閾値をゆるめたことで、少し重なりが増えました。
(注:overlapped peakwidthは10kbp extensionも考慮してoverlapを出すので、パーセンテージは少しおかしくなってしまいます)

まとめ

bedtools, compare_bsで得られる結果を図にまとめると以下のようになります。

f:id:rnakato:20180806141533p:plain

得られるピークサイトはほぼ同じですが、compare_bsの優位点としては、statsを出してくれることとサンプル1と2のoverlap peak数をそれぞれ出してくれること、peak widthでもstatsを出してくれることがあります。
ピーク比較の時にはピークの幅は一定であると暗黙に仮定してしまいがちですが、幅の分布はかなり広がっているのが普通で、 1つの大きなピークが細切れになってカウントされていたりすることもあるので、ピーク数をカウントしてものを言いたい時には実際に得られたピークを確認する作業を忘れないようにしましょう。

GitHubからプログラムをダウンロード・インストール

NGS解析のための新規ツールは日々論文で発表されており、それらのほとんどは世界中の人が無償で利用可能なライセンス形態になっています。
今日はその中でも多くの人に利用されている「GitHub」に公開されたツールのインストール方法を紹介します。

オープンソースについて

今のBioinformatics界は極めてオープンソース志向が強く、「良いものや知見は共有されることでより良いものができる」という性善説的な発想に基づいています。bioRxivのようなopen preprintにも積極的です。
ので、新規のプログラムで論文を書く場合はそのプログラムがオープンソースで公開されていることが必須条件となっている論文誌がほとんどです。オープンにする際も、自分のラボページにzipファイルをアップするだけ、のようなあやしげな状態ではなく、GitHubBioconductorのような広く使われバージョン管理がしっかりしているコミュニティスペースに公開されることが推奨されます。Bioinformatics誌のレビュアーの一人は、「GitHubに公開されていないプログラムはその時点でrejectにする」とツイートしていました。

一方、たとえばNatureやCellのような大きな論文内で使わている個々の解析技術はin-houseで作られたスクリプトであることが多く、そういうのはあまり公開はされません。Wetのラボはソースの公開に消極的なところが多い印象です。

GitHub

このブログでは僕のツールを使うことが多いので、僕のアカウント(rnakato)を例に以下説明します。 僕のGitHubサイトはこちらです。DROMPAやSSPなど、今まで開発したツールやスクリプトを置いています。

github.com

GitHubについて

Git・GitHubとは非常に平たく言うと、作成したソースコードをネット上に公開して誰でもダウンロードできるようにするためのしくみです。ファイルのバージョン管理機能に優れており、複数の人が同時にソースを修正するような開発に特に向いています。
(どこかの新聞記事では「設計図共有サイト」とか言っててコーヒー吹いた
より詳しく知りたい場合は「GitHub 入門」でググってください。

GitHub上のツールをダウンロードするだけならばアカウントは作成しなくとも大丈夫です。

GitとGitHubのちがい

Gitはファイルのバージョン管理のしくみそのもので、GitHubはGitをWeb上で利用するためのサービス(Gitホスティングサービス)です。 GitHub以外にもBitbucketやGitLabなどいくつかのGitホスティングサービスがあります。

Gitのインストール

gitとコマンドを打ってみて、「そんなツールないよ」とエラーが出たら、以下のコマンドでインストールしましょう。

 $ sudo apt install git

GitHubからインストール(スクリプトの場合)

スクリプトとは、そのファイルをダウンロードすればコンパイル無しでそのまま使えるソースコードです。 私が作っているスクリプトを以下で公開しています。(自分用なので、大半は使い物にはならないと思いますが、一部は有用と思います。)

GitHub - rnakato/script_rnakato

上のリンクを開くと↓のような画面になります。画面右にある"Clone or download"をクリックするとクローン用URLが表示されますので(図の赤枠部分)、コピーしてください(URL右のアイコンをクリックすると自動でコピーされます)。

f:id:rnakato:20180804142534j:plain

またはURL下の"Download zip"をクリックすると、圧縮ファイルとしてダウンロードすることもできます。

git clone <コピーしたURL> とコマンド実行すると、内容がクローン(ダウンロード)されます。

 $ git clone https://github.com/rnakato/script_rnakato.git
Cloning into 'script_rnakato'...
remote: Counting objects: 1674, done.
remote: Compressing objects: 100% (25/25), done.
remote: Total 1674 (delta 15), reused 17 (delta 7), pack-reused 1642
Receiving objects: 100% (1674/1674), 6.72 MiB | 3.53 MiB/s, done.
Resolving deltas: 100% (1002/1002), done.
Checking connectivity... done.
 $ ls  # ダウンロードされたフォルダを確認
script_rnakato

これで、script_rnakatoフォルダの中にあるスクリプトが全てダウンロードされました。

内容の更新

git cloneでクローンしたフォルダの内部でgit pull origin masterとコマンドを打つと、クローン後に加えられたGitHub上の更新内容を取り込むことができます。

 $ cd script_rnakato
 $ git pull origin master
From https://github.com/rnakato/script_rnakato
 * branch            master     -> FETCH_HEAD
Already up-to-date.

今はクローンしたばかりですので、当然修正はありません。

GitHubからインストール(プログラムの場合)

DROMPA3をダウンロード・インストールしてみます。 スクリプトと同じ要領ですが、C言語ソースのため、ダウンロード後にコンパイルが必要です。

GitHub - rnakato/DROMPA3: DROMPA version 3 (Peak-calling, Visualization, Normalization and QC for ChIP-seq analysis)

 $ git clone https://github.com/rnakato/DROMPA3
 $ cd DROMPA3
 $ make

GitHubからインストール(submoduleを含むプログラムの場合)

以下のChIPseqToolsはC++プログラムですが、レポジトリ内部にSSPのレポジトリを含んでいます。 これはsubmoduleという機能で入れ子構造になったGitHubレポジトリです。

GitHub - rnakato/ChIPseqTools

submoduleを含むレポジトリをクローンする場合は、--recursiveオプションをつけます。

 $ git clone --recursive https://github.com/rnakato/ChIPseqTools.git
 $ cd ChIPseqTools
 $ make

また、内容を更新したい場合は以下のようにします。

 $ git pull origin master    # ChIPseqToolsレポジトリの更新
 $ git submodule foreach git pull origin master # ChIPseqTools内のSSPレポジトリの更新

まとめ

3種類のパターンに分けてGitHubからのツールのインストール方法を紹介しました。インストール方法は通常はページ下部のREADMEに書いてあるので、それを見れば大丈夫です。 NGS解析のツールの大半はGitHub上で公開されているので、GitHubを使いこなせるようになると自由度が各段にアップします。

またGitHub上に自分のアカウントを作成すれば、自分のスクリプトをアップすることもできるようになります。 GitHubは常に最新バージョンが保てる点がメリットなので、例えば職場と自宅でスクリプトを共有したいというような目的にも使えますし、 外部の人にスクリプトを送るのにも便利です。
(Dropboxでも共有はできますが、ファイル喪失の危険はありますし)

なおGitHubは無料プランだとファイル公開しか選べません。もしWeb上にアップしたいけれども公開にはしたくないという場合にはBitbucketかGitLabを利用しましょう。 (2019/1/16追記 GitHubは無料アカウントでもプライベートリポジトリを作成できるようになりました。)

LiftOver: BEDファイルを異なるbuildへ変換

公開されているゲノム配列は現在も更新中であるため、いくつかのバージョン (build) があります。 humanだとhg18, hg19, hg38などがあり、hg38が現時点で最新です。
NGS解析をするうえでは全ての解析データのbuildを統一する必要がありますが、「既存論文のデータの一部を用いたい」というような場合、buildが合わずに困ることがあります。 「自分はhg38で統一しているのに、既存論文のBEDファイルはhg19しか提供されてない」というような場合ですね。

そういった場合には LiftOver というツールを使うと、バージョンに合わせてBEDファイルを再生成してくれます。 詳細は以下のリンクを参照してください。

LiftOver - Genome Analysis Wiki

(話がそれますが、hg38がリリースされて既に久しいのですが、2018年の論文でも普通にhg19が使われています。 おそらくhg19で生成されたデータベース、アノテーションの類があまりに多すぎるため、 hg38にアップデートできない状態なのではないかと思います。ROADMAPもJuicerToolsもhg19ですしね。 既存データベースのデータを多く使う実験を組む際にはbuildをhg19にするのも手かもしれません。)

LiftOver (web)

hg19のBEDファイル(sample.bed)をhg38に変換する例です。
最も簡単なのは、UCSC web browser上で変換する方法です。

Lift Genome Annotations

デフォルトではhg19 -> hg38への変換になっていますので、そのまま使いましょう。 sample.bedをアップロードするか、bedの内容を直接テキストボックスに貼りつけてsubmitします。

submit すると、下にResultsができ、生成されたBEDファイルをダウンロードすることができます。

LiftOver (コマンドライン)

LiftOverはコマンドラインツールでも提供されています。 変換したいファイルが大量にあるような場合はこちらのほうが便利でしょう。

以下のようにしてバイナリファイルをダウンロードしましょう。

wget http://hgdownload.cse.ucsc.edu/admin/exe/linux.x86_64/liftOver
chmod +x liftOver  # 実行権限の付与

変換にはLiftOverツールそのものの他に、変換用のchainfileが必要になります。

以下のディレクトリから、hg19 -> hg38 用のchainfile hg19ToHg38.over.chain.gz をダウンロードしましょう。

http://hgdownload.cse.ucsc.edu/goldenPath/hg19/liftOver/

ダウンロード後、解凍しておきます。

gunzip hg19ToHg38.over.chain.gz 

liftOver コマンドは、 liftOver <入力ファイル> <chainfile> <出力ファイル> <変換失敗したサイトを格納するファイル>というかたちで実行します。 今回の場合は以下のコマンドで変換完了です。

liftOver sample.bed hg19ToHg38.over.chain output.bed unlifted.bed

unlifted.bedには、何らかの理由で変換できなかったbedサイトが格納されます。変換できない理由は以下を参照してください。

https://genome.sph.umich.edu/wiki/LiftOver#Various_reasons_that_lift_over_could_fail

注意点

LiftOverを使っての変換は同一生物種の異なるbuildが想定されており、異なる生物種への変換は可能ではあるものの推奨はされていません。

また、変換失敗するサイトが発生することからもわかるように、変換は厳密なものではありません。 例えば、hg19でピークコールしたものをhg38に変換したピークリストと、hg38でピークコールしたピークリストはけっこう違います。遺伝子のアノテーションなどもかなり変わっています。
ので、大規模に統合したい場合には面倒でもfastqファイルから(条件を統一して)解析しなおす方がおすすめです。open chromatin regionのリストが欲しい、くらいであれば問題ないとは思います。

DROMPA3: その10 ヒートマップ

今回はDROMPAを用いたヒートマップの描画について説明します。

HEATMAPコマンド(TSS周辺)

前回の記事では、DROMPAを用いたリードプロファイルの描画について解説しました。

rnakato.hatenablog.jp

使ったコマンドは以下のようなものです。(詳しくは前回の記事を参照してください)

drompa_draw PROFILE \
-i parse2wigdir/H3K4me3,parse2wigdir/Input,H3K4me3 \
-i parse2wigdir/H3K27me3,parse2wigdir/Input,H3K27me3 \
-i parse2wigdir/H3K36me3,parse2wigdir/Input,H3K36me3 \
-p profile.K562 -gene refFlat.txt -gt genometable.txt 

ヒートマップの描画はプロファイルと非常に似ています。 上のコマンドを以下のように少し変えるだけでヒートマップのコマンドになります。

drompa_draw HEATMAP \
-i parse2wigdir/H3K4me3,parse2wigdir/Input,H3K4me3 \
-i parse2wigdir/H3K27me3,parse2wigdir/Input,H3K27me3 \
-i parse2wigdir/H3K36me3,parse2wigdir/Input,H3K36me3 \
-p K562 -gene refFlat.txt -gt genometable.txt -png

変えた部分は、PROFILEをHEATMAPに変更したことと、ファイル名(-pオプション)、-pngオプションを付け加えたことです。
デフォルトではpdfでファイルが出力されますが、ヒートマップをpdfで出力するとしばしばファイルサイズが大きくなりすぎる&そこまで高解像度は必要ないため、-pngオプションを付けて.pngで出力させた方が扱いやすくなります。

PROFILEコマンドと同様、デフォルトでは入力された遺伝子の転写開始点周辺5kbを可視化します。 出力されたK562.heatmap.pngを開いてみましょう。 f:id:rnakato:20180709155123j:plain:w350

全遺伝子をヒートマップ化しているのでかなり縦長になります。ここに表示したのは一部です。
H3K4me3はTSSまわりに濃縮が見られる一方、H3K27me3, H3K36me3は強い濃縮が見られないことがわかります。

しかし、色のスケールを変えることで違いが出るかもしれません。 -scale_tag 5 オプションを追加して、色のMAX値を5に変更してみましょう。

drompa_draw HEATMAP \
-i parse2wigdir/H3K4me3,parse2wigdir/Input,H3K4me3 \
-i parse2wigdir/H3K27me3,parse2wigdir/Input,H3K27me3 \
-i parse2wigdir/H3K36me3,parse2wigdir/Input,H3K36me3 \
-p K562-2 -gene refFlat.txt -gt genometable.txt -png -scale_tag 5

f:id:rnakato:20180709160156j:plain:w350

どうやら、H3K27me3よりはH3K36me3 の方がTSSまわりに濃縮があるようです。

HEATMAPコマンド(ピーク周辺、ソートなし)

HEATMAPコマンドもPROFILEコマンド同様、ピーク周辺を可視化することができます。 また、複数のピークファイルを入力とすることができます。

ここではENCODEのオープンクロマチン領域を利用してみます。まずデータをダウンロードしましょう。

wget http://hgdownload.soe.ucsc.edu/goldenPath/hg19/encodeDCC/wgEncodeOpenChromSynth/wgEncodeOpenChromSynthK562Pk.bed.gz
wget http://hgdownload.soe.ucsc.edu/goldenPath/hg19/encodeDCC/wgEncodeOpenChromSynth/wgEncodeOpenChromSynthHepg2Pk.bed.gz
# 解凍
gunzip wgEncodeOpenChromSynthK562Pk.bed.gz
gunzip wgEncodeOpenChromSynthHepg2Pk.bed.gz
# ピーク数が多いので、最初の1000行を抽出
head -n 1000 wgEncodeOpenChromSynthHepg2Pk.bed > wgEncodeOpenChromSynthHepg2Pk.1000.bed
head -n 1000 wgEncodeOpenChromSynthHepg2Pk.bed > wgEncodeOpenChromSynthHepg2Pk.1000.bed

DROMPAコマンドは以下のようになります。 -bed コマンドは、ファイル名とラベル(出力図y軸に表示されるもの)をコンマで区切って指定します。

drompa_draw HEATMAP \
            -i parse2wigdir/H3K4me3,parse2wigdir/Input,H3K4me3 \
            -i parse2wigdir/H3K27me3,parse2wigdir/Input,H3K27me3 \
            -i parse2wigdir/H3K36me3,parse2wigdir/Input,H3K36me3 \
            -bed wgEncodeOpenChromSynthK562Pk.1000.bed,open_K562 \
            -bed wgEncodeOpenChromSynthHepg2Pk.1000.bed,open_HepG2 \
            -p K562-3 -ptype 4 -gt genometable.txt -png

f:id:rnakato:20180709163118p:plain:w340

2つのbedファイルで指定された領域が線で区切られて出力されました。

HEATMAPコマンド(ピーク周辺、ソートあり)

y軸はデフォルトでは入力ファイルの通りの順で出力されますが、 以下のように-hmsort オプションをつけると、ピーク強度でソートされます。

drompa_draw HEATMAP \
            -i parse2wigdir/H3K4me3,parse2wigdir/Input,H3K4me3 \
            -i parse2wigdir/H3K27me3,parse2wigdir/Input,H3K27me3 \
            -i parse2wigdir/H3K36me3,parse2wigdir/Input,H3K36me3 \
            -bed wgEncodeOpenChromSynthK562Pk.1000.bed,open_K562 \
            -bed wgEncodeOpenChromSynthHepg2Pk.1000.bed,open_HepG2 \
            -p K562-4 -ptype 4 -gt genometable.txt -png -hmsort 1

f:id:rnakato:20180709163005p:plain

-hmsort 1とすると、1番目のサンプル(ここではH3K4me3)のピーク強度に基づいてソートされます。また、中心のリード数が0のサイトは除外されます。
こうしてみると、K562のオープンクロマチンサイトだけでなく、HepG2のオープンクロマチンサイトにもH3K4me3の濃縮が見られます。両方の細胞で共通するオープンクロマチンサイトなのかもしれません。

ここではH3K4me3にしか強い濃縮が見られませんが、共起するピークとそうでないピークに分けてベン図と組み合わせてヒートマップを使うと効果的にピークの濃縮を可視化することができます。

ヒートマップの特徴

PROFILEコマンドでは平均値(と信頼区間)を可視化しますが、この場合、全入力領域のうち全てに濃縮が出ているのか、あるいは半々程度にばらついているのか区別ができません。ヒートマップを使うと、全体のどのくらいの割合に濃縮が出ているのか、サンプル間で共通性・排他性があるのかなどを視覚的にとらえることができます。
一方、ヒートマップは統計的な処理をしているわけではないので、通常のリードプロファイルと同様、特徴的な領域を直感的に例示する場合などには有効ですが、全ゲノムを定量的に分析するような用途には使えません。

余談ですが、ヒートマップの描画はpythonの方がきれいにできるので、pythonに修正しようか考え中です。。

DROMPA3: その9 リードプロファイル

DROMPA3を用いたリードプロファイルの描画です。
ここでプロファイルと呼んでいるものは、遺伝子回り、あるいはピーク回りにおけるマップリードの平均分布のことで、aggregation plotと呼ばれることもあります。
全遺伝子や全ピークの平均値として見ることにより、通常のピーク抽出では得られない微小なリードの濃縮を捉えたり、発現遺伝子群と非発現遺伝子群の間でのリード濃縮の違いを可視化することができます。

インストール

DROMPA3のインストール方法はこの記事を参照してください。

PROFILEコマンドは内部でRスクリプトを実行しますので、Rが必要になります。

Genome table作成

DROMPA3の実行にはGenome tableファイルが必要になります。 Genome tableの作成は以下の記事を参照してください。

genome tableを作成する - Palmsonntagmorgen

遺伝子アノテーション

可視化する際に必要になる遺伝子アノテーションデータ(refFlat形式)をUCSCのサイトからダウンロードします。

$ wget http://hgdownload.soe.ucsc.edu/goldenPath/hg19/database/refFlat.txt.gz
$ gunzip refFlat.txt.gz  # 解凍

parse2wig

今回もENCODE projectにあるK562のヒストン修飾群、遺伝子アノテーションを用います。

$ wget http://hgdownload.soe.ucsc.edu/goldenPath/hg19/encodeDCC/wgEncodeUwHistone/wgEncodeUwHistoneK562H3k4me3StdAlnRep1.bam
$ wget http://hgdownload.soe.ucsc.edu/goldenPath/hg19/encodeDCC/wgEncodeUwHistone/wgEncodeUwHistoneK562H3k27me3StdAlnRep1.bam
$ wget http://hgdownload.soe.ucsc.edu/goldenPath/hg19/encodeDCC/wgEncodeUwHistone/wgEncodeUwHistoneK562H3k36me3StdAlnRep1.bam
$ wget http://hgdownload.soe.ucsc.edu/goldenPath/hg19/encodeDCC/wgEncodeUwHistone/wgEncodeUwHistoneK562InputStdAlnRep1.bam
$ parse2wig -i wgEncodeUwHistoneK562H3k4me3StdAlnRep1.bam -o H3K4me3 -gt genometable.txt -f BAM
$ parse2wig -i wgEncodeUwHistoneK562H3k27me3StdAlnRep1.bam -o H3K27me3 -gt genometable.txt -f BAM
$ parse2wig -i wgEncodeUwHistoneK562H3k36me3StdAlnRep1.bam -o H3K36me3 -gt genometable.txt -f BAM
$ parse2wig -i wgEncodeUwHistoneK562InputStdAlnRep1.bam -o Input -gt genometable.txt -f BAM

PROFILEコマンド

drompa_draw PROFILE とタイプするとヘルプが表示されます。

$ drompa_draw PROFILE
Usage: drompa_draw PROFILE [options] -p <output> -gt <genometable> -i <ChIP>,<Input>,<name> [-i <ChIP>,<Input>,<name> ...]
       <output>: Name of output files
       <genometable>: Tab-delimited file describing the name and length of each chromosome
       -i: specify ChIP data, Input data and name of ChIP sample (separated by ',', <Input> and <name> can be omitted)

Options:
       (以下オプションが続く)

まずはデフォルトで実行してみましょう。コマンドは以下のようになります。

drompa_draw PROFILE \
-i parse2wigdir/H3K4me3,parse2wigdir/Input,H3K4me3 \
-i parse2wigdir/H3K27me3,parse2wigdir/Input,H3K27me3 \
-i parse2wigdir/H3K36me3,parse2wigdir/Input,H3K36me3 \
-p profile.K562 -gene refFlat.txt -gt genometable.txt 

このコマンドにより以下のprofile.K562.pdfが生成されます。

f:id:rnakato:20180524223541p:plain:w350

このプロファイルは遺伝子の転写開始点(TSS)周辺5kbp (±2.5kbp) の平均マップリード数を可視化したものです。ラインが各サンプルの平均リード分布、陰になっている領域が95%信頼区間を表しています。
この図を見ると、H3K4me3はTSS周辺にリードの濃縮がみられる一方、H3K27me3とH3K36me3は濃縮がみられないことがわかります。

オプション

-cwオプションをつけると可視化する周辺長の長さを変えることができます。±5kbpのプロファイルを生成するには以下のようにします。

drompa_draw PROFILE \
-i parse2wigdir/H3K4me3,parse2wigdir/Input,H3K4me3 \
-i parse2wigdir/H3K27me3,parse2wigdir/Input,H3K27me3 \
-i parse2wigdir/H3K36me3,parse2wigdir/Input,H3K36me3 \
-p profile.K562 -gene refFlat.txt -gt genometable.txt -cw 5000

f:id:rnakato:20180524223642p:plain:w350

デフォルトではChIPサンプルのリードの平均値を描画しますが、-stype 1 をつけるとChIP/InputのEnrichmentの平均値を描画します。

drompa_draw PROFILE \
-i parse2wigdir/H3K4me3,parse2wigdir/Input,H3K4me3 \
-i parse2wigdir/H3K27me3,parse2wigdir/Input,H3K27me3 \
-i parse2wigdir/H3K36me3,parse2wigdir/Input,H3K36me3 \
-p profile.K562 -gene refFlat.txt -gt genometable.txt -stype 1

f:id:rnakato:20180524223834p:plain:w350

この例だとChIP readの時との差がわかりにくいですが、broad markや酵母の複製解析などでは差が顕著になることもあります。
(これは各TSSのChIP/Input の平均値であり、ChIP平均/Input平均のEnrichmentではないことに注意。)

遺伝子全長プロファイル

次に、遺伝子全長を100分割したプロファイルを作ってみましょう。 -ptype 3をつけて実行します。

drompa_draw PROFILE -ptype 3 \
-i parse2wigdir/H3K4me3,parse2wigdir/Input,H3K4me3 \
-i parse2wigdir/H3K27me3,parse2wigdir/Input,H3K27me3 \
-i parse2wigdir/H3K36me3,parse2wigdir/Input,H3K36me3 \
-p profile.K562.ptype3 -gene refFlat.txt -gt genometable.txt 

f:id:rnakato:20180519134337p:plain:w400

このプロファイルは各遺伝子について長さを一定に正規化したうえで遺伝子長を100分割し、遺伝子内(gene body)でどのように濃縮しているかを見たものです。 x軸の0がTSS、100がTES(転写終了点)で、その両側に遺伝子長と同じ長さだけ伸長した領域について計測します。 (従って遺伝子ごとに計測している領域の幅が異なることに注意)
100分割した1つのウィンドウがwigファイルの1bin (100bp)より大きい場合、その領域内の全binの平均値を出力します。

TSS周辺の可視化ではほとんど平らだったH3K36me3ですが、遺伝子全体で見るとgene bodyに広くゆるやかな濃縮が広がっていることがわかります。H3K36me3は転写中のgene bodyに入る修飾ですので、これは妥当な結果と言えます。
H3K27me3の方はTSS周辺に微小な濃縮があるようですが、こちらは意味があるかどうか微妙なところです。

領域内でのリード数正規化

3つのサンプル間で縦軸がずれている(平均リード値が異なる)のが気になる場合は、-ntype 1オプションを追加すると、観測している領域内の総リード数でサンプルごとに正規化します。

drompa_draw PROFILE -ptype 3 -ntype 1 \
-i parse2wigdir/H3K4me3,parse2wigdir/Input,H3K4me3 \
-i parse2wigdir/H3K27me3,parse2wigdir/Input,H3K27me3 \
-i parse2wigdir/H3K36me3,parse2wigdir/Input,H3K36me3 \
-p profile.K562.ptype3 -gene refFlat.txt -gt genometable.txt 

f:id:rnakato:20180519151326p:plain:w350

完全ではありませんが、遺伝子外領域の高さがだいたい同じになりました。

まとめ

遺伝子全長の可視化は、H3K36me3のようにgene bodyに入るヒストン修飾や、RNA pol2のようにgene bodyに広く分布する(伸長する)タンパク質のChIP-seqを可視化するのに有効です。 今回はTSS周辺と遺伝子全長について可視化しましたが、-ptype 2でTES周辺、-ptype 4で指定したピークリスト周辺の濃縮を可視化することができます。

また、同時に生成されるRスクリプトprofile.K562.R を編集の後以下のように実行することで、ラベルやy軸のスケールを変更したpdfファイルを再生成することも可能です。

 R --vanilla < profile.K562.R

プロファイルの場合全体の何割で濃縮が入っているかはわかりませんが、信頼区間の幅を見ることである程度推測することが可能です。