rnaskim
DESCRIPTION
ISMB2014読み会@CBRCの資料TRANSCRIPT
RNA-Skim: a rapid method forRNA-Seq quantification at transcript levelISMB2014読み会@CBRC!
!露崎弘毅!東京理科大学 薬学研究科 生命情報科学研究室!
理化学研究所 バイオインフォマティクス研究開発ユニット
RNA-seqで発現量を示すための指標
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
配列長
カウント
カウント
カウント
カウント
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
カウント
カウント
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
RNA-seq定量化におけるEMアルゴリズム
フラグメント割当て問題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
HTSeq, DNAnexusの場合
そのまま使う(早いが不正確)
exon1 exon2 exon3 exon4
exon1 exon2
exon1 exon3
66 reads
42 reads
45 reads
NEUMAの場合
他のIsoformと共有している配列は低く見積もり、ユニークな配列だけ見る!(情報のロスが激しい)
6 + α reads
α’ reads
α’’ reads
exon1 exon2 exon3 exon4
exon1 exon2
exon1 exon3
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に似
るように
Cufflinks (default)
重複した場合は平等に割る
exon1 exon2 exon3 exon4
exon1 exon2
exon1 exon3
1 / 3にする
1 / 2にする
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
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
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
離れた二カ所のdepth
transcriptome上のある箇所でのfragment depthちょっとずれたところで!みても大体同じ!-> 「全k-mer見ないで、所々かいつまんで見ても問題無い」という著者らの主張
0.985
x x + 20
fragment!depth
Methods
全体の流れ
reference transcriptomeに対する操作
RNA-seqデータに対する操作
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
Preparation Stage (sig-mer discovery)
このクラスター内にだけに存在するk-merをsig-merとする(下線のやつ)
A
B
Bloom Filter「たまに間違った値を返す時(偽陽性)があるけど、その分高速なハッシュ」みたいなもの!
データを削除できない、値自体は取り出せないといった特徴がある
クラスター毎に、このk-merが他のクラスターには無いかどうか判定するのに使っている(有る無し判定だけできれば良い)
Preparation Stage (Sig-mers selection)
全てのsig-merは使わない!少なくとも50bpは離れるようにsig-merを選択
Quantification Stage (Filtering by rolling hash)Rabin-Karp String Search Algorithmで利用されるハッシュ関数!
大量のテキストデータに、複数のキーワード検索をかける時とかに使うらしい
Quantification Stage (Counting, Quantification)
sig-merは他のクラスターには無い(定義から)!EMアルゴリズムは各クラスター毎に完全に独立して計算できる!
=> 並列化が容易
Results
クラスタリングについて
「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に存在しないか確かめた、とかだろうか…
検証1 (人口データ)
Ensembl!Mouse reference sequence (GRCm38 build70)
100サンプル!(リード数が2×107 ~ 1×108)
Sailfish論文でも利用されていた
人口SAMファイル作成プログラム
検証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くらいが良いとの事
検証1 (人口データ)sig-merの数を変えてみた
(a), (b) : 相関係数!
- sig-merが多いほど良い
(c) : significant false positive rate!- ほとんど変化無し
(d) : significant false negative rate!- sig-merが多いほど良い
sig-merは沢山使うほどよい!(論文では2.58だった)
検証1 (人口データ)sig-mer-similarityのしきい値(γ)を変えてみた!
-> それほど変化無し
True RPKMとRPKMの推定値は、綺麗に線形回帰する
検証2 (リアルデータも利用)
RNA-Skimと他4手法で比較した
相関係数は、real data / simulationデータでさほど変わらない!
!実際のデータの方がばらつきやすい
18の近交系のマウスと!58のF1マウス!
(CAST/EiJ, PWK/PhJ, WSB/EiJの3パターンのかけ合わせ)!のデータを使った(脳からサンプリング)
実行時間
この時はまだマルチスレッドに対応してなかった
展望
❖ より省メモリなデータ構造!
❖ より良いsig-mer selection (一様 -> 情報がある箇所だけ!
❖ バイアスを考慮!
❖ マルチスレッドに対応
実際に使ってみた
インストール (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
インストール (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 # なぜか二回やらないとコンパイルされない
インストール (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!!
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()!
コマンド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
そもそも扱える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とか)が含まれているものは扱えないから?
実際はさほど早くない?
参考# 発現量の指標!・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
参考# フラグメント割当て問題!・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!・ラビン-カープ文字列検索アルゴリズム