rnaskim

42
RNA-Skim: a rapid method for RNA-Seq quantification at transcript level ISMB2014読み会@CBRC 露崎弘毅 東京理科大学 薬学研究科 生命情報科学研究室 理化学研究所 バイオインフォマティクス研究開発ユニット

Upload: antiplastics

Post on 02-Dec-2014

415 views

Category:

Science


1 download

DESCRIPTION

ISMB2014読み会@CBRCの資料

TRANSCRIPT

Page 1: RNASkim

RNA-Skim: a rapid method forRNA-Seq quantification at transcript levelISMB2014読み会@CBRC!

!露崎弘毅!東京理科大学 薬学研究科 生命情報科学研究室!

理化学研究所 バイオインフォマティクス研究開発ユニット

Page 2: RNASkim

RNA-seqで発現量を示すための指標

Page 3: RNASkim

RNA-seqで発現量を示すための指標Count

RPK/CPK (Reads/Counts per kilobase of exon) [Mortazavi, et al., 2008]

RPM/CPM (Reads/Counts per million mapped reads) [Mortazavi, et al., 2008]

Relative abundance [式変形の中でよく出てくる]

配列に何個リードが張り付いたか!例 6

全リードのうち、何割張り付いたか!例 6 × 1 / 107 = 6 × 10-7

×全リード数

1ρ =

100万リードのうち、何リード張り付いたか!例 0.6

配列の1000bp当たり、何リード張り付いたか!例 6 × 103 / 2000 = 3

×全リード数

106

×103

配列長

カウント

カウント

カウント

カウント

Page 4: RNASkim

RNA-seqで発現量を示すための指標RPKM (Reads per kilobase of exon per million mapped reads) [Mortazavi, et al., 2008, Marioni, et al., 2008]

FPKM (Fragments per kilobase of exon per million mapped reads) [Trapnell, et al., 2010]

×全リード数

106

RPK + RPM!例 0.6 × 103 / 2000 = 0.3

Paired-endに対応すべく、リードでは無くリードのペア(しいてはその元となるフラグメント)毎に考える!

例 0.6 / 500 = 1.2 × 10-3

×103

配列長

全フラグメント数

106

×103

フラグメント長の期待値

×

フラグメント!(長さが一定ではない)

flagment length

カウント

カウント

Page 5: RNASkim

RNA-seqで発現量を示すための指標TPM (Transcripts per million) [Li, et al., 2010, Patro, et al., 2014]

106×

マッピングされたリードは、全transcriptomeが106個ある場合、何transcript相当か!(リードのcoverageや、全transcriptの長さが一定であると暗に仮定)!

例 6 × 10-7 × 106 = 0.6

ソフトウェアによって何を計算するか違う!RNA-SkimはRPKMとTPMに対応している!

本当は配列長で割るところは正確には”有効配列長”というものを使う!(詳しくは、@yag_aysさんのブログなど)

配列長×

1カウント

配列長

カウント

Σall transcripts

Page 6: RNASkim

RNA-seq定量化におけるEMアルゴリズム

Page 7: RNASkim

フラグメント割当て問題gene Isoform Read

現象

データ解析

exon1 exon2 exon3 exon4

exon1exon2exon3exon4

exon1exon2

exon1exon3

FASTQ

6 × 4 = 24 reads

6 × 3 = 18 reads

12 × 2 = 24 reads

どのIsoform由来かわからない

同じエクソンを共有しているところで、重複が出る

exon1 exon2 exon3 exon4

exon1 exon2

exon1 exon3

マッピング

2 (0.22)

3 (0.33)

4 (0.44)

exon1 exon2 exon3 exon4

exon1 exon2

exon1 exon3

欲しいのはこういった相対値

マルチマップ 実はこうなってる

exon1 exon2 exon3 exon4

exon1 exon2

exon1 exon3

○!※□◇#△!?

66 reads

42 reads

45 reads

Page 8: RNASkim

HTSeq, DNAnexusの場合

そのまま使う(早いが不正確)

exon1 exon2 exon3 exon4

exon1 exon2

exon1 exon3

66 reads

42 reads

45 reads

Page 9: RNASkim

NEUMAの場合

他のIsoformと共有している配列は低く見積もり、ユニークな配列だけ見る!(情報のロスが激しい)

6 + α reads

α’ reads

α’’ reads

exon1 exon2 exon3 exon4

exon1 exon2

exon1 exon3

Page 10: RNASkim

rQuant, IsoInferの場合

カバレッジの期待値と観測値の誤差を最小化!(rQuantはリード毎にどのIsoformに割り当て、IsoInferはexon-intronの区間毎に割り当て)!ハードに割当て、最適解である保証は無い、個々のフラグメントの情報は失われる

exon1 exon2 exon3 exon4

exon1 exon2

exon1 exon3

Isoformのcoverage

exon1 exon2 exon3 exon4

Geneのcoverage

どのIsoformも、極力Geneのcoverageに似

るように

Page 11: RNASkim

Cufflinks (default)

重複した場合は平等に割る

exon1 exon2 exon3 exon4

exon1 exon2

exon1 exon3

1 / 3にする

1 / 2にする

Page 12: RNASkim

Cufflinks (-u), RSEM, TIGAR, IsoEM, eXpress…の場合

EMアルゴリズムを利用してリードを各Isoformに振り分ける!(現在の主流?、一番正確だと言われる)

exon1 exon2 exon3 exon4

exon1 exon2

exon1 exon3

確率的に!最も尤もらしい

exon1 exon2 exon3 exon4

exon1 exon2

exon1 exon3

2. Relative abundance!ρ = (ρ1, ρ2, ρ3)!を求める(E-Step)

3. ρからαを再計算!(M-Step、暗に一様分

布を仮定)

1. このリードがここに張り付く確率!α = (α1, α2, α3)!を設定

ρ1

ρ2

ρ3

Page 13: RNASkim

Sailfishの場合 (k-mer counting)

あらかじめk-merの場所を把握しておく & 高速、省メモリなハッシュの利用で高速化を図る

exon1 exon2 exon3 exon4

exon1 exon2

exon1 exon3

Index

20-mer程度で短く見ていく

exon1 exon2 exon3 exon4

exon1 exon2

exon1 exon3

k-merのカウントを振り分け!(EMアルゴリズム)

リードのk-mer

Minimum perfect hash function!Lock-Free memory-efficient hash table

Page 14: RNASkim

RNA-Skimの場合 (sig-mer counting)

あらかじめ似ている配列をクラスタリングしておき、そのクラスターにだけ存在するk-mer(sig-mer)に限定し、さらに見るところをまばらにする事で高速化を図る!

(全k-merのうち、3.5%程度しか使わない)

exon1 exon2 exon3 exon4

exon1 exon2

exon1 exon3

Indexsig-merのカウントを振り分け!(EMアルゴリズム)

リードのsig-mer

other sequence

クラスター

このクラスターにのみ存在するk-mer (sig-mer)

exon1 exon2 exon3 exon4

exon1 exon2

exon1 exon3

other sequence

at least 50bp

Page 15: RNASkim

離れた二カ所のdepth

transcriptome上のある箇所でのfragment depthちょっとずれたところで!みても大体同じ!-> 「全k-mer見ないで、所々かいつまんで見ても問題無い」という著者らの主張

0.985

x x + 20

fragment!depth

Page 16: RNASkim

Methods

Page 17: RNASkim

全体の流れ

reference transcriptomeに対する操作

RNA-seqデータに対する操作

Page 18: RNASkim

Preparation Stage (Transcriptome Partitioning)例1 : k-mer-Similarity(t1, t2)、5-merの場合!k-mer (t1) = (AAAGG, AAGGG, …, CTCTC)!k-mer (t2) = (AAAGG, AAGGG, …, GGGTT)!

|k-mer (t1)| = 11!|k-mer (t2)| = 11!

k-mer (t1) ∩ k-mer(t2) = (AAAGG, …, GAAAA)!| k-mer (t1) ∩ k-mer(t2)| = 6!

より、!max(11/6, 11/6) = 1.83!

!例2 : k-mer-Similarity(A, B)、5-merの場合!k-mer (A) = (AAAGG, AAGGG, …, CTATC)!

k-mer (B) = (ATTTC, TTTCA, …, CTCTC)!|k-mer (A)| = 19!|k-mer (B)| = 12!

k-mer (A) ∩ k-mer(B) = (CTCTC)!| k-mer (A) ∩ k-mer(B)| = 1!

より、!max(1/19, 1/12) = 0.08k-mer()とはここでは与えられた配列のk-merを返す関数とする

(φは1配列でも、複数の配列でも良い)!しきい値(γ)よりも大きい類似度同士は同じクラスターとする(論文では0.2を利用)

A

B

Page 19: RNASkim

Preparation Stage (sig-mer discovery)

このクラスター内にだけに存在するk-merをsig-merとする(下線のやつ)

A

B

Page 20: RNASkim

Bloom Filter「たまに間違った値を返す時(偽陽性)があるけど、その分高速なハッシュ」みたいなもの!

データを削除できない、値自体は取り出せないといった特徴がある

クラスター毎に、このk-merが他のクラスターには無いかどうか判定するのに使っている(有る無し判定だけできれば良い)

Page 21: RNASkim

Preparation Stage (Sig-mers selection)

全てのsig-merは使わない!少なくとも50bpは離れるようにsig-merを選択

Page 22: RNASkim

Quantification Stage (Filtering by rolling hash)Rabin-Karp String Search Algorithmで利用されるハッシュ関数!

大量のテキストデータに、複数のキーワード検索をかける時とかに使うらしい

Page 23: RNASkim

Quantification Stage (Counting, Quantification)

sig-merは他のクラスターには無い(定義から)!EMアルゴリズムは各クラスター毎に完全に独立して計算できる!

=> 並列化が容易

Page 24: RNASkim

Results

Page 25: RNASkim

クラスタリングについて

「Transcriptレベルは、同じexonを共有しているisoformが存在するから、sig-merを見つける事が難しい」という事を言いたいらしい

分割しないk-mer-similarityをベースに分割Geneレベルで分割(同じgeneのtranscriptは同じクラスターとする)Transcriptレベルで分割(全て異なるクラスターとする)

このsig-mer coverageが何を指しているのか不明!(文脈的に「sig-merを一つでも持っている配列の割合」?)!

x軸をtranscript / clusterとして、!ランダムにxだけtranscript / clusterを選択して、sig-merが実際に他のtranscript / clusterに存在しないか確かめた、とかだろうか…

Page 26: RNASkim

検証1 (人口データ)

Ensembl!Mouse reference sequence (GRCm38 build70)

100サンプル!(リード数が2×107 ~ 1×108)

Sailfish論文でも利用されていた

人口SAMファイル作成プログラム

Page 27: RNASkim

検証1 (人口データ)RSEM, Sailfish, eXpress, Cufflinksと比較した!

RNA-Skimはsig-merの長さを20 - 95bpに変えてみた

(a), (b) : 相関係数 (0.01より大きなRPKMの対数値)!- Truthと書いてあるのはFlux Simulatorがそういうデータを作るらしい!- どの手法も大して変わらない!- sig-merは長すぎても良くない(あてがわれるリードの数が減る)

(c) : significant false positive rate!(RPKMの推定値が0.1より大きいのに、true RPKMが0.01より小さい

transcriptの割合)!

(d) : significant false negative rate!(RPKMの推定値が0.01よりも小さいのに、true RPKMは0.1より大きい

transcriptの割合)!

- sig-merは長過ぎても良くない(理由は上と同じ)

経験的に60-merくらいが良いとの事

Page 28: RNASkim

検証1 (人口データ)sig-merの数を変えてみた

(a), (b) : 相関係数!

- sig-merが多いほど良い

(c) : significant false positive rate!- ほとんど変化無し

(d) : significant false negative rate!- sig-merが多いほど良い

sig-merは沢山使うほどよい!(論文では2.58だった)

Page 29: RNASkim

検証1 (人口データ)sig-mer-similarityのしきい値(γ)を変えてみた!

-> それほど変化無し

True RPKMとRPKMの推定値は、綺麗に線形回帰する

Page 30: RNASkim

検証2 (リアルデータも利用)

RNA-Skimと他4手法で比較した

相関係数は、real data / simulationデータでさほど変わらない!

!実際のデータの方がばらつきやすい

18の近交系のマウスと!58のF1マウス!

(CAST/EiJ, PWK/PhJ, WSB/EiJの3パターンのかけ合わせ)!のデータを使った(脳からサンプリング)

Page 31: RNASkim

実行時間

この時はまだマルチスレッドに対応してなかった

Page 32: RNASkim

展望

❖ より省メモリなデータ構造!

❖ より良いsig-mer selection (一様 -> 情報がある箇所だけ!

❖ バイアスを考慮!

❖ マルチスレッドに対応

Page 33: RNASkim

実際に使ってみた

Page 34: RNASkim

インストール (1/3)# GCC-4.8のインストール!# 自分のホームディレクトリにだけ、新しいGCCを入れたい場合!mkdir /PATH/TO/YOUR/HOME/GCC!mkdir /PATH/TO/YOUR/HOME/GCC/lib!cd /PATH/TO/YOUR/HOME/GCC!wget http://ftp.gnu.org/gnu/gcc/gcc-4.8.3/gcc-4.8.3.tar.gz!tar zxvf gcc-4.8.3.tar.gz!cd gcc-4.8.3!./contrib/download_prerequisites!./configure --disable-multilib --prefix= /PATH/TO/YOUR/HOME/GCC \!--libdir= /PATH/TO/YOUR/HOME/GCC/lib!make!make install!!# マシンのデフォルトgcc/g++を確認!gcc --version!g++ —version!!# PATH/TO/YOUR/HOME/GCCにあるgcc/g++を確認!/PATH/TO/YOUR/HOME/GCC/bin/gcc --version!/PATH/TO/YOUR/HOME/GCC/bin/g++ --version

Page 35: RNASkim

インストール (2/3)

# RNA-Skimのインストール!wget https://github.com/zzj/RNASkim/archive/master.zip!unzip master.zip!cd RNASkim-master!export CXX=/PATH/TO/YOUR/HOME/GCC/bin/g++!!./prepare.sh!cd src!make all!make all # なぜか二回やらないとコンパイルされない

Page 36: RNASkim

インストール (3/3)

##### refMrnaを以下のような形式に変換!##### (Ensemblの場合はソースコード有り、RefSeqの場合は自力で)!##### > 遺伝子名|アイソフォーム名1|アイソフォーム名2!

##### 配列1|配列2!

!cat Mus_musculus/UCSC/mm10/Annotation/Genes/genes.gtf |\!awk '{print $10,$16}' | sed 's/"//g' | sed 's/;//g' | sort | uniq > list_mm10.txt!!# 自力の場合!R CMD BATCH RNASkim_Merge.R!!

Page 37: RNASkim

RNASkim_Merge.Rの中身library("Biostrings")!!# Gene|Iso!Gene_Iso <- read.table("list_mm10.txt", header=F)!colnames(Gene_Iso) <- c("Gene", "Iso")!!# Iso|Seq!Iso_Seq <- readDNAStringSet("mm10.fa")!# Iso!Iso <- names(Iso_Seq)!# Seq!Seq <- as.vector(as.character(Iso_Seq))!!# Iso|Gene|Seq!TMP <- data.frame(Iso=Iso, Seq=Seq)!!# Gene|Iso1|Iso2|Seq1|Seq2!out <- merge(Gene_Iso, TMP, by="Iso")!!# >Gene|Iso1|Iso2!# Seq1|Seq2!Gene <- unique(as.character(Gene_Iso[,1]))!sink(file="mm10_merged.fa")!for(i in 1:length(Gene)){!! locus <- which(out[,2] == Gene[i])!! if(length(locus) != 0){!! ! cat(paste(paste(">", Gene[i], sep=""), paste(out[locus, 1], collapse="|"), sep="|"))!! ! cat("\n")!! ! cat(paste0(out[locus,3], collapse="|"))!! ! cat("\n")!! }!}!sink()!

Page 38: RNASkim

コマンドexport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/PATH/TO/YOUR/HOME/GCC/lib64!Soft="/PATH/TO/YOUR/HOME/RNASkim-master/src"!!# reference transcriptomeに対する操作 (3コマンド)!

GLOG_logtostderr=1 $Soft/rs_cluster -gene_fasta=mm10_merged.fa \!-num_threads=4 -output=mm10_clustered.fa -rs_length=60!GLOG_logtostderr=1 $Soft/rs_index -gene_fasta=mm10_clustered.fa \!-index_file=mm10_clustered_gene.fa.pb -rs_length=60 -num_threads 4!GLOG_logtostderr=1 $Soft/rs_select -index_file=mm10_clustered_gene.fa.pb \!-selected_keys_file=mm10_clustered_gene.fa.sk!!# fastqに対する操作 (2コマンド) GLOG_logtostderr=1 $Soft/rs_count -selected_keys_file=mm10_clustered_gene.fa.sk \!-count_file=XXXXX_clustered_gene.fa.cf -read_files1=XXXXX_1.trim.fastq \!-read_files2=XXXXX_2.trim.fastq -num_threads=4!!$Soft/rs_estimate -count_file=XXXXX_clustered_gene.fa.cf > FPKM_TABLE.txt

Page 39: RNASkim

そもそも扱えるreference transcriptomeが少ない?

Software reference hg19(RefSeq, Human)

mm10(RefSeq, Mouse)

cufflinks genome 43497 genes 30608 genes

RSEM transcriptome 47246 transcripts 32987 transcripts

TIGAR transcriptome 47246 transcripts 32987 transcripts

eXpress transcriptome 47246 transcripts 32987 transcripts

Sailfish transcriptome 47246 transcripts 32987 transcripts

RNA-Skim transcriptome 33727 transcripts 26568 transcripts

Warningメッセージを見る限り、referenceのうちIUPAC表記(R, W, Y, Nとか)が含まれているものは扱えないから?

Page 40: RNASkim

実際はさほど早くない?

Page 41: RNASkim

参考# 発現量の指標!・Transcript assembly and quantification by RNA-Seq reveals unannotated transcripts and isoform

switching during cell differentiaion!・RSEM: accurate transcript quantification from RNA-Seq data with or without a reference genome!

・RNA-Seq gene expression estimation with read mapping uncertainty!

・Sailfish: Rapid Alignment-free Quantification of Osoforms from RNA-Seq Reads!

・Measurement of mRNA abundance using RNA-seq data: RPKM measure is inconsistent among samples

!# EMアルゴリズム!・潜在変数モデルと学習法に関して!・不完全データの統計解析!・RでEMアルゴリズムによる混合ガウスモデル最尤推定!・パターン認識と機械学習 第9章 「混合モデルとEM」!・EM algorithm@Slideshare

Page 42: RNASkim

参考# フラグメント割当て問題!・What’s the FPKM?!

・「RNA-Seqの数理 - 生成モデルによる発現量推定」シリーズ!・(Rで)塩基配列解析!・トランスクリプトームデータ解析戦略2014!

・CSHL Keynote; Dr. Lior Pachter, UC Berkeley (youtube)!

・Gene and transcript discovery and expression analysis with RNA-Seq!

・eXpress: Streaming read deconvolution and abundance estimation applied to RNA-Seq!

!# Bloom filter!・ブルームフィルタ(Wikipedia)!・Bloom filterの説明!!# Rolling Hash!・ラビン-カープ文字列検索アルゴリズム