Palmsonntagmorgen

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

STAR-RSEMによる発現量推定 その2 (2020/08/20 追記)

前回の記事↓の続きです。

STAR-RSEMによる発現量推定 その1 - Palmsonntagmorgen

Stranded/Unstranded RNA-seq

RNA-seqにはunstrandedとstranded の二種類があります。unstrandedの場合はmRNAに対して半々の確率で順鎖と逆鎖が読まれ、stranded の場合は逆鎖のみが読まれます(Illumina TruSeq kitの場合)。 最近のRNA-seqはほぼ全てStranded RNA-seqになっていると思いますが、古いデータはunstrandedである場合があります。 それぞれマッピング時のパラメータが異なりますので、事前にチェックしておく必要があります。

どちらかわからんという場合は以下のように簡単にマッピングすることで確かめることができます。 indexは既知のmRNA配列から作成したindexとします。

$ index=NCBI-H_sapiens-RNA
$ bowtie $index <(zcat SRR065495_1.fastq.gz) -p12 | cut -f2 | sort | uniq -c
# reads processed: 50170737
# reads with at least one reported alignment: 34437131 (68.64%)
# reads that failed to align: 15733606 (31.36%)
Reported 34437131 alignments
17168386 +
17268745 -

詳細は割愛しますが、この結果はマップされた34437131リードのうち、17168386リードが順鎖、17268745が逆鎖にマップされたことを表しています。つまりほぼ半々なので、今回のデータはunstranded RNA-seqとわかります。

(2019/7/11 追記)
ご質問があったので、stranded RNA-seqの場合にどうなるかを追記します。ここでは例として以下のサンプルを使います。

https://www.ebi.ac.uk/ena/data/view/SRR2952390

Paired-endのサンプルですが、F3側だけを使います。

$ wget ftp://ftp.sra.ebi.ac.uk/vol1/fastq/SRR295/000/SRR2952390/SRR2952390_1.fastq.gz
$ index=NCBI-H_sapiens-RNA
$ bowtie $index <(zcat SRR2952390_1.fastq.gz) -p12 | cut -f2 | sort | uniq -c
# reads processed: 98531979
# reads with at least one reported alignment: 78815814 (79.99%)
# reads that failed to align: 19716165 (20.01%)
Reported 78815814 alignments to 1 output stream(s)
78463223 -
 352591 +

マップされた 78815814 リードのうち、大半の 78463223 リードが逆鎖(-)にマップされています。従って、このサンプルはStranded RNAであるということがわかります。

STARでマッピング

それでは改めてSTARでマッピングします。 RSEMコマンド中でSTARのマッピングもできるのですが、ログの出力が貧弱なため、私は独立でSTARを動かしてマッピングしています。
STARのコマンドは以下のようになります。

mkdir star # 出力フォルダを作成
STAR --outSAMtype BAM SortedByCoordinate \   # sort済BAM を出力
     --quantMode TranscriptomeSAM \    # RSEMでの発現量推定に必要なオプション
     --runThreadN 12 \            # 使用CPU数
     --outSAMattributes All \     # 出力BAMファイルに含まれる情報を最大に
     --readFilesCommand zcat \    # gzip圧縮のfastqを入力にする場合のみ必要
     --genomeDir rsem-star-index/UCSC-hg38 \     # indexファイルを指定
     --readFilesIn SRR065504_1.fastq.gz SRR065504_2.fastq.gz \  # 入力fastq
     --outSAMstrandField intronMotif \    #   unstranded RNA-seqの場合のみ必要
     --outFileNamePrefix star/Myers_H1-hESC_cell_2x75_200_1.  # 出力ファイル名(最後のピリオドを忘れず)

STARは相当メモリを食いますので注意してください(十数GB程度)。

4サンプルに対して上記を実行しますが、入力ファイル名と出力ファイル名が異なるので、今回はfor文は使いません。 色々やり方はありますが、ここでは以下のようにパラメータ列をまとめることにします。

starparam="--genomeLoad NoSharedMemory \
     --outSAMtype BAM SortedByCoordinate \
     --quantMode TranscriptomeSAM \
     --runThreadN 12 \
     --outSAMattributes All \
     --readFilesCommand zcat \
     --genomeDir rsem-star-index/UCSC-hg38 \
     --outSAMstrandField intronMotif"

STAR $starparam \
     --readFilesIn SRR065504_1.fastq.gz SRR065504_2.fastq.gz \
     --outFileNamePrefix star/Myers_H1-hESC_cell_2x75_200_1.
STAR $starparam \
     --readFilesIn SRR065495_1.fastq.gz SRR065495_2.fastq.gz \
     --outFileNamePrefix star/Myers_H1-hESC_cell_2x75_200_2.
STAR $starparam \
     --readFilesIn SRR065509_1.fastq.gz SRR065509_2.fastq.gz \
     --outFileNamePrefix star/Myers_HUVEC_cell_2x75_200_1.
STAR $starparam \
     --readFilesIn SRR065524_1.fastq.gz SRR065524_2.fastq.gz \
     --outFileNamePrefix star/Myers_HUVEC_cell_2x75_200_2.

starディレクトリの中に以下のようにファイルが生成されていれば成功です。

$ ls star
Myers_H1-hESC_cell_2x75_200_1.Aligned.sortedByCoord.out.bam
Myers_H1-hESC_cell_2x75_200_1.Aligned.toTranscriptome.out.bam
Myers_H1-hESC_cell_2x75_200_1.Log.final.out
Myers_H1-hESC_cell_2x75_200_1.Log.out
Myers_H1-hESC_cell_2x75_200_1.Log.progress.out
Myers_H1-hESC_cell_2x75_200_1.SJ.out.tab
Myers_H1-hESC_cell_2x75_200_2.Aligned.sortedByCoord.out.bam
Myers_H1-hESC_cell_2x75_200_2.Aligned.toTranscriptome.out.bam
Myers_H1-hESC_cell_2x75_200_2.Log.final.out
Myers_H1-hESC_cell_2x75_200_2.Log.out
Myers_H1-hESC_cell_2x75_200_2.Log.progress.out
Myers_H1-hESC_cell_2x75_200_2.SJ.out.tab
Myers_HUVEC_cell_2x75_200_1.Aligned.sortedByCoord.out.bam
Myers_HUVEC_cell_2x75_200_1.Aligned.toTranscriptome.out.bam
Myers_HUVEC_cell_2x75_200_1.Log.final.out
Myers_HUVEC_cell_2x75_200_1.Log.out
Myers_HUVEC_cell_2x75_200_1.Log.progress.out
Myers_HUVEC_cell_2x75_200_1.SJ.out.tab
Myers_HUVEC_cell_2x75_200_2.Aligned.sortedByCoord.out.bam
Myers_HUVEC_cell_2x75_200_2.Aligned.toTranscriptome.out.bam
Myers_HUVEC_cell_2x75_200_2.Log.final.out
Myers_HUVEC_cell_2x75_200_2.Log.out
Myers_HUVEC_cell_2x75_200_2.Log.progress.out
Myers_HUVEC_cell_2x75_200_2.SJ.out.tab

マッピングスタッツを確認してみましょう。*.Log.final.outにスタッツが記載されています。

$ cat star/Myers_HUVEC_cell_2x75_200_2.Log.final.out 
                                 Started job on |   Dec 21 14:48:27
                             Started mapping on |   Dec 21 14:50:50
                                    Finished on |   Dec 21 15:09:14
       Mapping speed, Million of reads per hour |   156.28

                          Number of input reads |   47926048
                      Average input read length | 150
                                    UNIQUE READS:
                   Uniquely mapped reads number |   37351930
                        Uniquely mapped reads % |   77.94%
                          Average mapped length |   147.79
                       Number of splices: Total |   20037714
            Number of splices: Annotated (sjdb) |   19925915
                       Number of splices: GT/AG |   19886116
                       Number of splices: GC/AG |   121436
                       Number of splices: AT/AC |   15391
               Number of splices: Non-canonical |   14771
                      Mismatch rate per base, % |   1.13%
                         Deletion rate per base |   0.01%
                        Deletion average length |   1.44
                        Insertion rate per base |   0.00%
                       Insertion average length |   1.34
                             MULTI-MAPPING READS:
        Number of reads mapped to multiple loci |   3004986
             % of reads mapped to multiple loci |   6.27%
        Number of reads mapped to too many loci |   9073
             % of reads mapped to too many loci |   0.02%
                                  UNMAPPED READS:
       % of reads unmapped: too many mismatches |   0.00%
                 % of reads unmapped: too short |   14.25%
                     % of reads unmapped: other |   1.53%
                                  CHIMERIC READS:
                       Number of chimeric reads |   0
                            % of chimeric reads |   0.00%

マップリード数のほか、スプライスサイトの情報なども載っていて便利です。

RSEMで発現量推定

STARで出力された*.Aligned.toTranscriptome.out.bamを使ってRSEMで発現量推定をします。今度はfor文が使えます。

for prefix in Myers_H1-hESC_cell_2x75_200_1 \
              Myers_H1-hESC_cell_2x75_200_2 \
              Myers_HUVEC_cell_2x75_200_1 \
              Myers_HUVEC_cell_2x75_200_2
do
    rsem-calculate-expression \
               --paired-end --alignments \
               --estimate-rspd \
               --strandedness none \
               --no-bam-output \
               -p 12 \
               star/$prefix.Aligned.toTranscriptome.out.bam \
               rsem-star-index/UCSC-hg38/UCSC-hg38 \
               star/$prefix
done

(2020/08/20追記)
stranded RNAを指定する際にこれまで用いていた --forward-prob オプションがdeprecatedとなり、--strandedness というオプションに置き換わったようです。 ですので、stranded RNA-seqの場合は --strandedness reverse, unstrandedの場合は --strandedness none と指定してください。 デフォルトはnoneなので上のコマンドにおいて--strandedness noneは省略可能ですが、わかりやすさのために敢えて記載しています。

indexの指定方法がSTARの時と異なることに注意してください。完了するとstarディレクトリの中に*.genes.results*.isoforms.results というファイルが生成され、それぞれ遺伝子単位、transcript単位の発現量(count, TPM, FPKM)が出力されます。 発現量としてはTPMを使うのが最も望ましいでしょう。
ここではstarディレクトリの中に発現量も出力していますが、場合によっては別にrsemディレクトリを作って発現量をそちらに格納する方がSTARとRSEMの区別がはっきりして良いかもしれません。

また長くなったので、ファイルのマージ方法は次回に回します。 次回は年明けの予定です。

STAR-RSEMによる発現量推定 その3 - Palmsonntagmorgen

STAR-RSEMによる発現量推定 その1

私が普段使っているSTAR, RSEMを使った発現量推定法を紹介します。 あまり最新のアップデート情報などをフォローできていないので、もっと良いやり方をご存知の方はご教示ください。

ここでは例題として、ヒトES細胞とHUVEC細胞をペアエンドで読んだサンプル(各2サンプル)の発現量を比較し、発現変動遺伝子を抽出するというケースを考えます。 リファレンスゲノムはhg38、遺伝子のアノテーションEnsemblのGRCh38です。
以下のサイトも併せて参考にしてください。

RSEM (A. thaliana, paired-end RNA-Seq) | STAR-RSEM による転写産物の発現量推定

サンプルのダウンロード

RNA-seqのfastqをダウンロードします。

$ fastq-dump --split-files --gzip SRR065504   # Myers_H1-hESC_cell_2x75_200_1
$ fastq-dump --split-files --gzip SRR065495   # Myers_H1-hESC_cell_2x75_200_2
$ fastq-dump --split-files --gzip SRR065509   # Myers_HUVEC_cell_2x75_200_1
$ fastq-dump --split-files --gzip SRR065524   # Myers_HUVEC_cell_2x75_200_2

これにはものすごく時間がかかるので、 コマンド末に&をつけて同時に回すのがよいですね。それでも一晩くらいはかかりました。
時間がかかりすぎるので、手元にご自身のサンプルがある場合はそちらを代用してください。

ゲノム配列・遺伝子情報のダウンロード

UCSC hg38のゲノムをダウンロードする方法は以下を参考に。

常染色体と性染色体のみのゲノム配列ファイル genome.fa を作成する - Palmsonntagmorgen

gtfファイルはEnsemblからGRCh38のデータをダウンロードし、一部修正します。方法は以下を参考にしてください。

Gene annotation データを用意する(gtf形式) - Palmsonntagmorgen

RSEM, STARのインストール

RSEMはGitHubからクローンして、makeでコンパイルしています。

$ git clone https://github.com/deweylab/RSEM.git
$ cd RSEM
$ make

STARはソースコードアーカイブをダウンロード後解凍、コンパイルします。

$ wget https://github.com/alexdobin/STAR/archive/2.6.1d.tar.gz
$ tar -xzf 2.6.1d.tar.gz
$ cd STAR-2.6.1d/source
$ make STAR              # Linuxの場合
$ make STARforMacStatic  # Macの場合 

RSEM, STARの両方にパスを通してください。RSEMはRSEMディレクトリ直下、STARは STAR-2.6.1d/bin/ 以下の Linux_x86_64_static または MacOSX_x86_64 ディレクトリ以下に実行ファイルがあります。
パスの通し方は以下を参考:

環境変数PATHの通し方 - Palmsonntagmorgen

STARのインデックスを作成する

rsem-prepare-reference コマンドを使います。これはRSEMの中でSTARを使うためのインデックス作成コマンドですが、STAR単体で動かす時のインデックスとしても使えます。

$ mkdir rsem-star-index  # index用ディレクトリの作成
$ rsem-prepare-reference --star \    
  -p 12 \      # 使用CPU数
  --gtf Homo_sapiens.GRCh38.94.addchr.gtf \ # 入力gtfファイル
  UCSC-hg38.fa \             # 入力ゲノムファイル
  rsem-star-index/UCSC-hg38  # 出力されるindexファイル名
Parsed 200000 lines
Parsed 400000 lines
Parsed 600000 lines
Parsed 800000 lines
Parsed 1000000 lines
Parsed 1200000 lines
Parsed 1400000 lines
Parsed 1600000 lines
Parsed 1800000 lines
Parsed 2000000 lines
Parsed 2200000 lines
Parsed 2400000 lines
Parsed 2600000 lines
Parsing gtf File is done!
UCSC-hg38.fa is processed!
Warning: Cannot extract transcript ENST00000361681's sequence since the chromosome it locates, chrMT, is absent!
Warning: Cannot extract transcript ENST00000361739's sequence since the chromosome it locates, chrMT, is absent!
Warning: Cannot extract transcript ENST00000361789's sequence since the chromosome it locates, chrMT, is absent!
Warning: Cannot extract transcript ENST00000361453's sequence since the chromosome it locates, chrMT, is absent!
...

おや…何やらWarningが出てきました。"chrMTなんて染色体はないよ"と怒られているようです。 EnsemblではミトコンドリアをMTと表記していますが、UCSCではchrMとしているので、ゲノムと遺伝子ファイルで染色体名が異なっているのですね。

大した数ではないので無視してもよさそうですが、ここではきちんとgtfの染色体名を変換しておきましょう。

$ sed -e 's/chrMT/chrM/g' Homo_sapiens.GRCh38.94.addchr.gtf \
> Homo_sapiens.GRCh38.94.addchr.new.gtf

sedというのはファイル内の文字列を置換してくれるコマンドで、ここではHomo_sapiens.GRCh38.94.addchr.gtfファイル内の"chrMT"を"chrM"に置換してHomo_sapiens.GRCh38.94.addchr.new.gtfに出力しています。 sedコマンドはこんな感じに使える便利コマンドなので、ぜひ覚えましょう。 一括置換の際は関係ない部分文字列までヒットして置換されていないか確認が必要ですが、今回は大丈夫でしょう。
(例えば"chr1"で置換したりすると、"chr11,chr12, ..."が全部ヒットしてしまいます)

では新しいgtfファイルを使って再びインデックス作成にチャレンジしましょう。

$ rsem-prepare-reference --star -p 12 \
  --gtf Homo_sapiens.GRCh38.94.addchr.new.gtf \
  UCSC-hg38.fa \
  rsem-star-index/UCSC-hg38
...
Parsing gtf File is done!
UCSC-hg38.fa is processed!
206534 transcripts are extracted.
Extracting sequences is done!
Group File is generated!
Transcript Information File is generated!
Chromosome List File is generated!
Extracted Sequences File is generated!

rsem-preref rsem-star-index/UCSC-hg38.transcripts.fa 1 rsem-star-index/UCSC-hg38
Refs.makeRefs finished!
Refs.saveRefs finished!
rsem-star-index/UCSC-hg38.idx.fa is generated!
rsem-star-index/UCSC-hg38.n2g.idx.fa is generated!

STAR  --runThreadN 12  --runMode genomeGenerate  --genomeDir rsem-star-index  --genomeFastaFiles /home/Database/UCSC/hg38/genome.fa  --sjdbGTFfile Homo_sapiens.GRCh38.94.addchr.new.gtf  --sjdbOverhang 100  --outFileNamePrefix rsem-star-index/UCSC-hg38
...

今度はエラーなくきちんと通っています。 一番下にSTARで始まるコマンドが記載されていますが、これがSTARのインデックスを作るコマンドです。つまりRSEMは内部でSTARを起動してSTARのインデックスを作成しているのです。

完了したら、インデックスが正しく生成されているか確認しましょう。

$ ls rsem-star-index/UCSC-hg38/
Genome                UCSC-hg38.ti              exonInfo.tab
SA                    UCSC-hg38.transcripts.fa  geneInfo.tab
SAindex               UCSC-hg38Log.out          genomeParameters.txt
UCSC-hg38.chrlist     chrLength.txt             sjdbInfo.txt
UCSC-hg38.grp         chrName.txt               sjdbList.fromGTF.out.tab
UCSC-hg38.idx.fa      chrNameLength.txt         sjdbList.out.tab
UCSC-hg38.n2g.idx.fa  chrStart.txt              transcriptInfo.tab
UCSC-hg38.seq         exonGeTrInfo.tab

長くなりましたので続きは次回。年内更新予定です。

STAR-RSEMによる発現量推定 その2 - Palmsonntagmorgen

Gene annotation データを用意する(gtf形式)

RNA-seq解析の記事を書こうとしたらgtfファイルの部分が長くなり過ぎたので単独記事にしました。

Gene annotation

既知遺伝子の情報を記載するファイルにはいくつかの形式があり、gtf形式はそのひとつです。 よく似たgff形式というものもありますが、微妙に異なります。

gtf形式の詳細については以下の記事を参考にしてください(丸投げ)。

GTFファイル | 遺伝子アノテーションファイルの処理

GTFファイルのダウンロード

遺伝子情報はダウンロード元のデータベースによってIDや情報の詳細度がかなり違います。 ここでは私がよく使うUCSC genome browserとEnsemblからダウンロードしてみたいと思います。

UCSC genome browser

Table browserで遺伝子情報を指定し、"get output" ボタンを押します。RefseqのHuman build hg38 であれば、以下のようになります。

Table Browser

Ensembl

Ensemblは各種データを↓のFTP siteからダウンロード可能です。

http://asia.ensembl.org/info/data/ftp/index.html

Human のGRCh38 (hg38に対応)データであれば、以下のコマンドでダウンロードできます。

$ wget ftp://ftp.ensembl.org/pub/release-94/gtf/homo_sapiens/Homo_sapiens.GRCh38.94.gtf.gz

scaffoldなどの遺伝子情報を含んだgtfファイルも別にありますが、通常は使いません。

ダウンロードした二つのファイルを解凍後、サイズを比較してみましょう。

$ gunzip *.gtf.gz
$ ls -lh *.gtf
-rwxrwxrwx 1 rnakato rnakato 1.1G Dec 13 11:17 Homo_sapiens.GRCh38.94.gtf
-rwxrwxrwx 1 rnakato rnakato  50M Dec 13 11:13 UCSC.hg38.gtf

Ensemblの方がファイルサイズが圧倒的に大きいですね。解凍すると1Gbを超えています。Ensemblの方がprocessed transcriptやpseudogeneなどの情報が多く、アノテーションも詳細に記述されていますので、遺伝子情報をもとに詳細な解析をしたい場合はEnsemblを使う方が良いと思います。

染色体名の違い

UCSCEnsembl はgene IDが違いますが、染色体名も違います。UCSCの方は 1番染色体は"chr1"となっていますが、Ensemblは単に"1"となっています。UCSCのgenomeファイルを用いて解析している場合、この違いを考慮しないツールであれば「染色体名が異なる」とエラーになり、これが地味に面倒です。
ゲノムの染色体名の方をEnsemblに揃えるやり方もありますが、ここではEnsemblの遺伝子名にchrを追加する方法を試してみましょう。

修正前

$ head Homo_sapiens.GRCh38.94.gtf
#!genome-build GRCh38.p12
#!genome-version GRCh38
#!genome-date 2013-12
#!genome-build-accession NCBI:GCA_000001405.27
#!genebuild-last-updated 2018-07
1       havana  gene    11869   14409   .       +       .       gene_id "ENSG00000223972"; gene_version "5"; gene_name "DDX11L1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene";
1       havana  transcript      11869   14409   .       +       .       gene_id "ENSG00000223972"; gene_version "5"; transcript_id "ENST00000456328"; transcript_version "2"; gene_name "DDX11L1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "DDX11L1-202"; transcript_source "havana"; transcript_biotype "processed_transcript"; tag "basic"; transcript_support_level "1";
1       havana  exon    11869   12227   .       +       .       gene_id "ENSG00000223972"; gene_version "5"; transcript_id "ENST00000456328"; transcript_version "2"; exon_number "1"; gene_name "DDX11L1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "DDX11L1-202"; transcript_source "havana"; transcript_biotype "processed_transcript"; exon_id "ENSE00002234944"; exon_version "1"; tag "basic"; transcript_support_level "1";
1       havana  exon    12613   12721   .       +       .       gene_id "ENSG00000223972"; gene_version "5"; transcript_id "ENST00000456328"; transcript_version "2"; exon_number "2"; gene_name "DDX11L1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "DDX11L1-202"; transcript_source "havana"; transcript_biotype "processed_transcript"; exon_id "ENSE00003582793"; exon_version "1"; tag "basic"; transcript_support_level "1";
1       havana  exon    13221   14409   .       +       .       gene_id "ENSG00000223972"; gene_version "5"; transcript_id "ENST00000456328"; transcript_version "2"; exon_number "3"; gene_name "DDX11L1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "DDX11L1-202"; transcript_source "havana"; transcript_biotype "processed_transcript"; exon_id "ENSE00002312635"; exon_version "1"; tag "basic"; transcript_support_level "1";

冒頭が染色体名になっているので、行頭にchrを付加するだけでよいですね。これは以下のようなワンライナーで実行可能です。

# 冒頭のコメントアウト文を除外し、各行の行頭にchrを追加して出力
$ grep -v \# Homo_sapiens.GRCh38.94.gtf | awk '{print "chr" $0 }' > Homo_sapiens.GRCh38.94.addchr.gtf
# 内容確認
$ head Homo_sapiens.GRCh38.94.addchr.gtf
 head Homo_sapiens.GRCh38.94.addchr.gtf
chr1    havana  gene    11869   14409   .       +       .       gene_id "ENSG00000223972"; gene_version "5"; gene_name "DDX11L1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene";
chr1    havana  transcript      11869   14409   .       +       .       gene_id "ENSG00000223972"; gene_version "5"; transcript_id "ENST00000456328"; transcript_version "2"; gene_name "DDX11L1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "DDX11L1-202"; transcript_source "havana"; transcript_biotype "processed_transcript"; tag "basic"; transcript_support_level "1";
chr1    havana  exon    11869   12227   .       +       .       gene_id "ENSG00000223972"; gene_version "5"; transcript_id "ENST00000456328"; transcript_version "2"; exon_number "1"; gene_name "DDX11L1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "DDX11L1-202"; transcript_source "havana"; transcript_biotype "processed_transcript"; exon_id "ENSE00002234944"; exon_version "1"; tag "basic"; transcript_support_level "1";
chr1    havana  exon    12613   12721   .       +       .       gene_id "ENSG00000223972"; gene_version "5"; transcript_id "ENST00000456328"; transcript_version "2"; exon_number "2"; gene_name "DDX11L1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "DDX11L1-202"; transcript_source "havana"; transcript_biotype "processed_transcript"; exon_id "ENSE00003582793"; exon_version "1"; tag "basic"; transcript_support_level "1";
chr1    havana  exon    13221   14409   .       +       .       gene_id "ENSG00000223972"; gene_version "5"; transcript_id "ENST00000456328"; transcript_version "2"; exon_number "3"; gene_name "DDX11L1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "DDX11L1-202"; transcript_source "havana"; transcript_biotype "processed_transcript"; exon_id "ENSE00002312635"; exon_version "1"; tag "basic"; transcript_support_level "1";
chr1    havana  transcript      12010   13670   .       +       .       gene_id "ENSG00000223972"; gene_version "5"; transcript_id "ENST00000450305"; transcript_version "2"; gene_name "DDX11L1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "DDX11L1-201"; transcript_source "havana"; transcript_biotype "transcribed_unprocessed_pseudogene"; tag "basic"; transcript_support_level "NA";
chr1    havana  exon    12010   12057   .       +       .       gene_id "ENSG00000223972"; gene_version "5"; transcript_id "ENST00000450305"; transcript_version "2"; exon_number "1"; gene_name "DDX11L1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "DDX11L1-201"; transcript_source "havana"; transcript_biotype "transcribed_unprocessed_pseudogene"; exon_id "ENSE00001948541"; exon_version "1"; tag "basic"; transcript_support_level "NA";
chr1    havana  exon    12179   12227   .       +       .       gene_id "ENSG00000223972"; gene_version "5"; transcript_id "ENST00000450305"; transcript_version "2"; exon_number "2"; gene_name "DDX11L1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "DDX11L1-201"; transcript_source "havana"; transcript_biotype "transcribed_unprocessed_pseudogene"; exon_id "ENSE00001671638"; exon_version "2"; tag "basic"; transcript_support_level "NA";
chr1    havana  exon    12613   12697   .       +       .       gene_id "ENSG00000223972"; gene_version "5"; transcript_id "ENST00000450305"; transcript_version "2"; exon_number "3"; gene_name "DDX11L1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "DDX11L1-201"; transcript_source "havana"; transcript_biotype "transcribed_unprocessed_pseudogene"; exon_id "ENSE00001758273"; exon_version "2"; tag "basic"; transcript_support_level "NA";
chr1    havana  exon    12975   13052   .       +       .       gene_id "ENSG00000223972"; gene_version "5"; transcript_id "ENST00000450305"; transcript_version "2"; exon_number "4"; gene_name "DDX11L1"; gene_source "havana"; gene_biotype "transcribed_unprocessed_pseudogene"; transcript_name "DDX11L1-201"; transcript_source "havana"; transcript_biotype "transcribed_unprocessed_pseudogene"; exon_id "ENSE00001799933"; exon_version "2"; tag "basic"; transcript_support_level "NA";

無事追加されました。 冒頭のコメント文を除外したくない場合は後から付け足すか、最初のコマンドでgrep部分を使わずに出力してください(後で手作業で#前のchrを取り除く)。

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

前回の記事の続きです。

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

発現量データ生成

前回の記事で発現量データを生成するのを忘れていたので、ここで生成します。stringtieを使います。

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

これでballgown/${prefix} というディレクトリが自動生成され、その中に発現量データが出力されます。
ディレクトリの中身を見てみましょう。

$ ls ballgown/ERR188044/
ERR188044_chrX.gtf  e2t.ctab  e_data.ctab  i2t.ctab  i_data.ctab  t_data.ctab

gtfファイルと、いくつかのテキストファイルができています。 eはexon, iはid, tがtranscriptの情報を表しているようですね。

比較するサンプルの確認

サンプルの情報はchrX_data/geuvadis_phenodata.csvに記述されています。 どんなサンプルなのか確認しましょう。

$ cat chrX_data/geuvadis_phenodata.csv
"ids","sex","population"
"ERR188044","male","YRI"
"ERR188104","male","YRI"
"ERR188234","female","YRI"
"ERR188245","female","GBR"
"ERR188257","male","GBR"
"ERR188273","female","YRI"
"ERR188337","female","GBR"
"ERR188383","male","GBR"
"ERR188401","male","GBR"
"ERR188428","female","GBR"
"ERR188454","male","YRI"
"ERR204916","female","YRI"

サンプルIDごとに、性別とpopulation情報が載っています。 解析内容は、population間のばらつきを除去しながら性別間の遺伝子発現変動を見る、というもののようです。

Ballgownで解析

BallgownはRで動きますので、同じディレクトリでRを起動しましょう。
以降のコマンドはR上で実行するものとします。Nature Protocolのコマンドから少し修正しています。

# ライブラリ読み込み
library(ballgown)
library(RSkittleBrewer)
library(genefilter)
library(dplyr)
library(devtools)
# サンプル情報の読み込み(通常は自分で用意する)
pheno_data = read.csv("chrX_data/geuvadis_phenodata.csv")
# 先程生成した発現量データの読み込み
bg_chrX = ballgown(dataDir = "ballgown", samplePattern = "ERR", pData=pheno_data)

# bg_chrXに格納されたものを確認
bg_chrX
ballgown instance with 3520 transcripts and 12 samples

bg_chrX という名前のballgownインスタンスが生成されました。

# 低発現遺伝子の除去
bg_chrX_filt = subset(bg_chrX,"rowVars(texpr(bg_chrX)) >1",genomesubset=TRUE)

# 発現変動遺伝子の推定(transcript単位)
results_transcripts = stattest(bg_chrX_filt,
                   feature="transcript",
                   covariate="sex",
                   adjustvars = c("population"),
                   getFC=TRUE,
                   meas="FPKM")

# 得られた発現変動遺伝子の確認
head(results_transcripts)
     feature id        fc      pval      qval
1 transcript  1 0.9347423 0.7043147 0.9373013
2 transcript  2 1.2006990 0.8716451 0.9723579
3 transcript  3 1.0173174 0.9896415 0.9990549
4 transcript  4 0.3814504 0.5200179 0.9192672
5 transcript  5 0.6014996 0.3216161 0.9192672
6 transcript  6 0.6540123 0.3264784 0.9192672

同様に、遺伝子単位の発現変動情報を抽出します。

results_genes = stattest(bg_chrX_filt,
             feature="gene",
             covariate="sex",
             adjustvars = c("population"),
             getFC=TRUE,
             meas="FPKM")

head(results_genes)
  feature         id        fc      pval      qval
1    gene    MSTRG.1 1.0824443 0.6847873 0.9196130
2    gene   MSTRG.10 0.9335310 0.8132130 0.9599962
3    gene  MSTRG.100 0.6126762 0.5687947 0.8823732
4    gene MSTRG.1000 1.2044223 0.4500794 0.8360675
5    gene MSTRG.1001 1.3799856 0.6140598 0.8936018
6    gene MSTRG.1003 0.9087684 0.5909100 0.8867180

以下ではresults_transcripts に遺伝子名の情報を付加します。

results_transcripts = data.frame(geneNames=ballgown::geneNames(bg_chrX_filt),
                 geneIDs=ballgown::geneIDs(bg_chrX_filt),
                 results_transcripts)

head(results_transcripts)
  geneNames geneIDs geneNames.1 geneIDs.1    feature   id          fc
1         . MSTRG.2           . MSTRG.528 transcript 1668 0.030602170
2    PLCXD1 MSTRG.2        XIST MSTRG.528 transcript 1667 0.002990002
3         . MSTRG.2           . MSTRG.528 transcript 1666 0.015949119
4         . MSTRG.2           . MSTRG.528 transcript 1669 0.028359333
5         . MSTRG.3        TSIX MSTRG.527 transcript 1665 0.077438632
6    PLCXD1 MSTRG.2           . MSTRG.612 transcript 1862 7.335431029
          pval         qval
1 1.474474e-10 2.824911e-07
2 2.497711e-10 2.824911e-07
3 6.564345e-10 4.949516e-07
4 6.871521e-08 3.885845e-05
5 1.911435e-06 8.647331e-04
6 1.331176e-05 5.018534e-03

遺伝子名はid順にソートされていますが、発現変動遺伝子が見たいので、p値の小さい順にソートしなおします。

results_transcripts = arrange(results_transcripts,pval)
results_genes = arrange(results_genes,pval)

head(results_transcripts)
  geneNames   geneIDs    feature   id          fc         pval         qval
1         . MSTRG.528 transcript 1668 0.030602170 1.474474e-10 2.824911e-07
2      XIST MSTRG.528 transcript 1667 0.002990002 2.497711e-10 2.824911e-07
3         . MSTRG.528 transcript 1666 0.015949119 6.564345e-10 4.949516e-07
4         . MSTRG.528 transcript 1669 0.028359333 6.871521e-08 3.885845e-05
5      TSIX MSTRG.527 transcript 1665 0.077438632 1.911435e-06 8.647331e-04
6         . MSTRG.612 transcript 1862 7.335431029 1.331176e-05 5.018534e-03

head(results_genes)
  feature        id          fc         pval         qval
1    gene MSTRG.528 0.002409209 2.041411e-11 2.086323e-08
2    gene MSTRG.527 0.082689539 6.110906e-06 2.409310e-03
3    gene MSTRG.143 3.158100078 7.719104e-06 2.409310e-03
4    gene MSTRG.612 7.327271932 1.073484e-05 2.409310e-03
5    gene MSTRG.763 0.278924648 1.178723e-05 2.409310e-03
6    gene MSTRG.618 9.109365087 4.555636e-05 7.759766e-03

以下のコマンドを実行すると、得られたresults_transcripts, results_genesをテキストファイルに出力します。(ファイル名は任意)

write.csv(results_transcripts, "chrX_transcript_results.csv", row.names=FALSE)
write.csv(results_genes, "chrX_gene_results.csv", row.names=FALSE)

可視化

以下は可視化のコマンドです。得られた発現変動遺伝子についてさらに調査する時に用います。

# 色の設定
tropical= c('darkorange', 'dodgerblue', 'hotpink', 'limegreen', 'yellow')
palette(tropical)

# 箱ひげ図
fpkm = texpr(bg_chrX,meas="FPKM")
fpkm = log2(fpkm+1)
boxplot(fpkm,col=as.numeric(pheno_data$sex),las=2,ylab='log2(FPKM+1)')

ラベルが見切れていますが、サンプルごとの遺伝子発現量の分布が性別ごとに色分けされて箱ひげ図で表示されました。 縦軸のFPKMというのは遺伝子ごとにマップされたリード数を遺伝子長と全リード数で正規化したものです。

次に、特定の遺伝子について可視化してみましょう。 ここでは例として12番めの遺伝子について可視化します。

ballgown::transcriptNames(bg_chrX)[12]
         12 "NR_027231" 
ballgown::geneNames(bg_chrX)[12]
         12 "LINC00685" 

おや、、、何故だかNature Protocolの例と表示される遺伝子名が違います。順番が変わったのでしょうか。
ともかく表示してみましょう。

plot(fpkm[12,] ~ pheno_data$sex, border=c(1,2),
     main=paste(ballgown::geneNames(bg_chrX)[12],' : ',
        ballgown::transcriptNames(bg_chrX)[12]),
     pch=19,
     xlab="Sex",
     ylab='log2(FPKM+1)')
points(fpkm[12,] ~ jitter(as.numeric(pheno_data$sex)),
       col=as.numeric(pheno_data$sex))

サンプルごとの発現量のばらつきを性別で分けてプロットしているのですが、全てのサンプルで発現量が0のため、差が見えません。
この遺伝子ではない遺伝子が例になっていたはずなのですが。僕のスクリプトにどこか間違っているところを見つけたら教えてください。

plotTranscripts(ballgown::geneIDs(bg_chrX)[1729],
        bg_chrX,
        main=c('Gene XIST in sample ERR188234'),
        sample=c('ERR188234'))

遺伝子の簡単なisoform情報も表示することができます。

plotMeans('MSTRG.56', bg_chrX_filt, groupvar="sex", legend=FALSE)

ここではおそらく性別間で差がある遺伝子構造を可視化しているのですが、差がない遺伝子を指定していまっているのでよくわかりません。

おわりに

最後ミスったためしまりがないことになってしまいましたが、ともかく一通りの作業ができるようになりました。
新規転写物を探索したい時には有効なワークフローなので、機会があれば利用されると良いと思います。

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つの大きなピークが細切れになってカウントされていたりすることもあるので、ピーク数をカウントしてものを言いたい時には実際に得られたピークを確認する作業を忘れないようにしましょう。