case3 - nibb-gitc/gitc2021mar-rnaseq GitHub Wiki

Case study 3: Transcript-based RNA-Seq pipeline (alignment-free)

シロイヌナズナ(Arabidopsis thaliana)のRNA-seqを行った。ライブラリは2D sample (2days dark conditionで生育させた黄色芽生え)と2D2L sample (その後さらに2days light conditionで生育させた緑化芽生え),4D sample (2days dark condition後引き続き 2days dark conditionで生育させたもの) の3条件、それぞれbiological replicates を3つ用意した。シーケンスはpaired-end(インサートの両端を読む)で76bpシークエンスした(MiSeq)。

これらのシーケンスファイルは、DDBJ/DRAに登録されている。公的データベースに登録されているNGSデータを取得して解析するパイプラインを学ぶために、sratools を使ってデータを取得するステップから実習する。また、この演習では、alignment-free のTranscript-base のパイプラインで解析を進める。3条件以上のRNAseq解析の例として、MDS plot やクラスタリング、ヒートマップ描画などの多変量解析も学ぶ。

基本パイプライン:Salmon -> edgeR

多変量解析は R

Data

(ファイルは、~/gitc/data/EX/case3 以下 にある)

Reference

  • transcript sequence: Athaliana_167_TAIR10.transcript_primaryTranscriptOnly.fa (シロイヌナズナのトランスクリプト。1遺伝子1トランスクリプトの代表配列。詳細は後述。)

Reads

  • DRP004823_SRR_Acc_List.txt に書かれてあるaccession番号に基づいて、自分でダウンロードする。

Software

salmon (installed)
edgeR (installed)

Setup

case3 ディレクトリをつくり、以下の解析はその下で作業しよう。

$ mkdir case3
$ cd case3

Download Illumina sequences

DRP004823_SRR_Acc_List.txt に書かれてあるaccession番号のNGSデータをNCBI SRA から取得したい。

[DRP004823_SRR_Acc_List.txt]

DRR168786
DRR168787
DRR168788
DRR168789
DRR168790
DRR168791
DRR168792
DRR168793
DRR168794

まず、NCBI SRAのウェブサイトでどのような情報が登録されているか、ウェブ上で確認してみよう。

https://www.ncbi.nlm.nih.gov/sra/

にアクセスし、DRR168786 などのアクセション番号を検索してみよう。 情報をまとめると下記の通り。

Run	        Library_Name  treatment
----------------------------------------
DRR168786	2D_rep1       2D
DRR168787	2D_rep2       2D
DRR168788	2D_rep3       2D
DRR168789	4D_rep1       4D
DRR168790	4D_rep2       4D
DRR168791	4D_rep3       4D
DRR168792	2D2L_rep1     2D2L
DRR168793	2D2L_rep2     2D2L
DRR168794	2D2L_rep3     2D2L

それでは、sratoolkit を使ってこれらのNGSデータをダウンロードしよう。

prefetch DRR168786

一括ダウンロードも可能

prefetch DRR168787 DRR168788 DRR168789 DRR168790

prefetch に -p オプションをつけると進行の度合いが表示されるのでオススメです。

sraフォーマットのファイルがダウンロードされる。ダウンロードされたファイルは、カレントディレクトリにそれぞれのIDのディレクトリの下に保存される。

注)以前のバージョンのsratoolkitのデフォルト設定では、~/ncbi/public/sra に保存される。という挙動だった。sratoolkitのバージョンに注意。

9 file全てダウンロードしよう。

次に、sraフォーマットをfastqに変換しよう。

fastq-dump --split-files --origfmt  DRR168786/DRR168786.sra

今回はpaird-endライブラリなので、それぞれRead1, Read2のファイルが生成される。

  • DRR168786_1.fastq
  • DRR168786_2.fastq

9 file全てについて、fastq変換をしよう。上記コマンドをDRR168786.sraの部分だけ変えて8回繰り返しても良いが、シェルスクリプトを使うと便利。

for f in DRR1687*/*sra
do
  fastq-dump --split-files --origfmt $f
done

seqkit の stats サブコマンドを使って生成されたfastqのシーケンス数などの基礎情報を取得する。

seqkit stats DRR1687*fastq
file               format  type  num_seqs     sum_len  min_len  avg_len  max_len
DRR168786_1.fastq  FASTQ   DNA    477,502  36,290,152       76       76       76
DRR168786_2.fastq  FASTQ   DNA    477,502  36,290,152       76       76       76
DRR168787_1.fastq  FASTQ   DNA    414,943  31,535,668       76       76       76
DRR168787_2.fastq  FASTQ   DNA    414,943  31,535,668       76       76       76
DRR168788_1.fastq  FASTQ   DNA    604,501  45,942,076       76       76       76
DRR168788_2.fastq  FASTQ   DNA    604,501  45,942,076       76       76       76
DRR168789_1.fastq  FASTQ   DNA    463,620  35,235,120       76       76       76
DRR168789_2.fastq  FASTQ   DNA    463,620  35,235,120       76       76       76
DRR168790_1.fastq  FASTQ   DNA    616,252  46,835,152       76       76       76
DRR168790_2.fastq  FASTQ   DNA    616,252  46,835,152       76       76       76
DRR168791_1.fastq  FASTQ   DNA    501,444  38,109,744       76       76       76
DRR168791_2.fastq  FASTQ   DNA    501,444  38,109,744       76       76       76
DRR168792_1.fastq  FASTQ   DNA    856,831  65,119,156       76       76       76
DRR168792_2.fastq  FASTQ   DNA    856,831  65,119,156       76       76       76
DRR168793_1.fastq  FASTQ   DNA    564,622  42,911,272       76       76       76
DRR168793_2.fastq  FASTQ   DNA    564,622  42,911,272       76       76       76
DRR168794_1.fastq  FASTQ   DNA    460,199  34,975,124       76       76       76
DRR168794_2.fastq  FASTQ   DNA    460,199  34,975,124       76       76       76

Prepare reference transcripts

tarsncrtip-base RNA-seq パイプラインで、referenceに何を使うかはとても重要です。ここでは、JGIのPhytozome (https://phytozome.jgi.doe.gov/pz/portal.html) が整理した、Athaliana_167_TAIR10.transcript_primaryTranscriptOnly.fa.gz をリファレンスとして使うことにします。1遺伝子につき代表的なスプライシングバリアントが1つ選ばれているので、得られた結果の解釈やその後の解析がgene単位でやりやすいためです。

cp ~/gitc/data/EX/case3/JGI/Athaliana_167_TAIR10.transcript_primaryTranscriptOnly.fa.gz ./
gunzip Athaliana_167_TAIR10.transcript_primaryTranscriptOnly.fa.gz

これでreferenceとreadsの両方が準備完了です。

Salmon: alignment-free quantification

build reference index

salmon index -t Athaliana_167_TAIR10.transcript_primaryTranscriptOnly.fa -i Athaliana_167_TAIR10.transcript_primaryTranscriptOnly.fa.salmon.idx -k 31

この作業は一度やればよい。case1でも同じリファレンスを使ったので、コピーしても良い。

Mapping and quantification

DRR168786の場合、

salmon quant \
  -i Athaliana_167_TAIR10.transcript_primaryTranscriptOnly.fa.salmon.idx \
  -l A \
  -1 DRR168786_1.fastq -2 DRR168786_2.fastq \
  -o salmon_out_DRR168786

case1 と異なり、今回はpaired-end readsなので、オプションがいくつか異なる点に注意。

9 reads 全て同様に解析する。

salmon quant -i Athaliana_167_TAIR10.transcript_primaryTranscriptOnly.fa.salmon.idx -l A -1 DRR168786_1.fastq -2 DRR168786_2.fastq -o salmon_out_DRR168786
salmon quant -i Athaliana_167_TAIR10.transcript_primaryTranscriptOnly.fa.salmon.idx -l A -1 DRR168787_1.fastq -2 DRR168787_2.fastq -o salmon_out_DRR168787
...

(option, advanced) 上記ように、手動で一つずつコマンドを実行しても良いが、以下のようなシェルスクリプトでまとめて実行すると便利だし、ファイル名のミスなどのヒューマンエラーも防げる

for n in DRR168786 DRR168787 DRR168788 DRR168789 DRR168790 DRR168791 DRR168792 DRR168793 DRR168794
do 
  salmon quant -i Athaliana_167_TAIR10.transcript_primaryTranscriptOnly.fa.salmon.idx -l A -1 ${n}_1.fastq -2 ${n}_2.fastq -o salmon_out_${n} > run_salmon_${n}.log 2>&1
done

Results =>

salmon_out_DRR168786
salmon_out_DRR168787
salmon_out_DRR168788
salmon_out_DRR168789
salmon_out_DRR168790
salmon_out_DRR168791
salmon_out_DRR168792
salmon_out_DRR168793
salmon_out_DRR168794

の9つのディレクトリが生成されそれらの下にsalmonの結果が保存されたと仮定して、以降進める。

Expression analysis using edgeR

Prepare count matrix

このあとの解析がしやすいように、サンプルごとに別々のファイルに記録されているsalmonのカウントデータを、ひとつのファイルにまとめる。salmon quantmerge サブコマンドを使う。salmon.quant.matrix.txt ファイルに書き出すことにする。

$salmon quantmerge --column numreads -o salmon.quant.matrix.txt --quants salmon_out_DRR168786 salmon_out_DRR168787 salmon_out_DRR168788 salmon_out_DRR168789 salmon_out_DRR168790 salmon_out_DRR168791 salmon_out_DRR168792 salmon_out_DRR168793 salmon_out_DRR168794

output: salmon.quant.matrix.txt

$head salmon.quant.matrix.txt
Name	salmon_out_DRR168786	salmon_out_DRR168787	salmon_out_DRR168788	salmon_out_DRR168789	salmon_out_DRR168790	salmon_out_DRR168791	salmon_out_DRR168792	salmon_out_DRR168793	salmon_out_DRR168794
AT5G67620.1	0	0	0	0	0	0	0	0	0
AT5G67580.1	5	5	2.185	9	11.809	12.082	13	11.865	5
AT5G67550.1	0	0	0	0	0	1	0	0	0
AT5G67540.2	2	2	3	12	5	6	9	7	2
AT5G67520.1	2	2	0	2	3	0	4	0	3
AT5G67490.1	2	8	10	9	10	6	12	14	11
AT5G67460.1	0	0	1	0	0	1	4	0	0
AT5G67450.1	0	0	1	3	0	1	0	0	1
AT5G67440.1	3	2	9	8	9	10	16	15	9

Analysis with edgeR

準備

ここからRでの解析。RをローカルPCで解析する場合、salmon.quant.matrix.txt をサーバからコピーしておく。scpを使用。

Rを起動し、scpのあるディレクトリで作業をする。setwdコマンドなどを使ってワーキングディレクトリを設定する。

[R] (例)

setwd("~/Documents/case3")

(作業ディレクトリが上記と異なる場合は各自の環境に合わせて入力すること)

edgeRとgplotsのライブラリを読み込んでおく。

libary(edgeR)
library(gplots)

Normalization

[R]

library(edgeR)
tab <- read.delim("salmon.quant.matrix.txt", comment.char="#", row.names=1)
new.colnames <- sub("salmon_out_", "", colnames(tab))
colnames(tab) <- new.colnames
treat <- factor(c(rep("2D", 3), rep("4D", 3), rep("2D2L", 3)))
treat <- relevel(treat, ref="2D")
dat <- DGEList(tab, group=treat)
dat <- calcNormFactors(dat, method="TMM")
dat$samples
          group lib.size norm.factors
DRR168786    2D   233143    1.0753172
DRR168787    2D   212285    1.0847719
DRR168788    2D   238443    1.0507711
DRR168789    4D   300049    1.0496378
DRR168790    4D   361092    1.0118684
DRR168791    4D   288957    1.0429869
DRR168792  2D2L   473029    0.9035653
DRR168793  2D2L   362166    0.9036133
DRR168794  2D2L   316781    0.9020538

MDS plot

MDS plot はサンプル間の関係性を可視化する。これは unsupervised clustering(教師なしクラスタリング)の一種である。replicatesどうしが近くにクラスタリングされることが期待される。MDS plot は実験の妥当性の評価にも有用である。edgeRでは plotMDSコマンドでMDS plotを簡単に描くことができる。

plotMDS(dat)

DEG analysis

GLMを用いて、ANOVA-likeな解析を行う。3つの実験条件でいずれかの条件で発現変動のある遺伝子を検出する。

design <- model.matrix(~treat)
dat <- estimateDisp(dat, design)
fit <- glmFit(dat, design)
lrt <- glmLRT(fit, coef=2:3)

計算結果を確認しよう。

topTags(lrt)

DEG遺伝子はいくつあるだろうか?

lrt.fdr.sorted <- topTags(lrt, n=nrow(dat))$table
sum(lrt.fdr.sorted$FDR < 0.05)
sum(lrt.fdr.sorted$FDR < 0.01)

多変量解析

sampleの階層的クラスタリング

MDS plot でサンプル間の関係性を可視化することができたが、ここでは階層的クラスタリングでサンプル間の関係性を捉えてみよう。

ここではDEG遺伝子のみを使って、サンプルの階層的クラスタリングを行う。

deg <- subset(lrt.fdr.sorted, lrt.fdr.sorted$FDR<0.01)
logcpm <- cpm(dat, prior.count=1, log=TRUE)
logcpm.deg <- logcpm[rownames(deg), ]
d2 <- as.data.frame(t(logcpm.deg))
sampleTree <- hclust(dist(d2), method="ward.D2")
plot(sampleTree, hang=0.05)

MDS plot と同様、replicate間は非常に似ていることが確認できた。さらに、2Dと4Dがクラスターを形成しているが、全く光を当てない2条件が、光をあてる条件よりお互い似ているのはリーズナブルな結果といえよう。

heatmap

ここではDEG上位200位までの遺伝子を使ってヒートマップを描いてみよう。

top200 <- topTags(lrt, n=200)
logcpm <- cpm(dat, prior.count=1, log=TRUE)
logcpm.top200 <-  logcpm[rownames(top200$table), ]

heatmapColors <- colorpanel(40, low="blue", high="yellow")
heatmap.2(as.matrix(logcpm.top200), col=heatmapColors, scale="row", trace="none")

heatmap.2のdefaultではクラスタリングにユークリッド距離が使われる。遺伝子のクラスタリングに相関係数 (Pearson correlation coefficient) を使って、ヒートマップ・クラスタリングをやり直してみよう。

hcl.genes <- hclust(as.dist(1-cor(t(logcpm.top200))))
heatmap.2(as.matrix(logcpm.top200), col=heatmapColors, scale="row", trace="none", Rowv=as.dendrogram(hcl.genes) )

最初に書いたヒートマップよりクラスタリングがよりリーズナブルになっているように見える。

さて、遺伝子の発現パターンは大まかにいくつに分類できるだろうか。ヒートマップとクラスタリングの樹形図を見ると3〜5がリーズナブルなグループ数に見える。ここでは4グループとして、遺伝子を発現パターンで分類してみよう。cutree関数を使うと階層的クラスタリングの結果に基づいてグルーピングしてくれる。

> mycl <- cutree(hcl.genes, k=4)
> head(mycl)
AT2G34430.1 AT1G29920.1 AT5G54770.1 AT3G54890.1 AT1G29910.1 AT2G34420.1 
          1           1           1           2           1           1 

> table(mycl)
mycl
 1  2  3  4 
78 43 55 24 

このグルーピング結果も合わせてヒートマップ図に描画する。

mycolhc <- rainbow(length(unique(mycl)), start=0.1, end=0.9)
mycolhc <- mycolhc[as.vector(mycl)]

heatmap.2(as.matrix(logcpm.top200), col=heatmapColors, scale="row", trace="none", Rowv=as.dendrogram(hcl.genes), RowSideColors=mycolhc )

Revision History

2021-3-11

  • minor updates. 今回のコースの環境に合わせてアップデート。