salmonの出力ファイルをtximportで加工する
TL;DR
salmonやkalstoなどは、速く、正確な発現量の定量ソフトウェアです。しかし、単純なカウントデータと違って、その加工と用途は様々です。そこで、salmonの出力ファイルであるquant.sfとその加工ができるtximportについてまとめておきたいと思います。
quant.sf
quant.sfはタブ区切りのファイルです。
上の5つの値を持っています。公式Docs Ver1.40を読むと、これらの値は以下のように定義されています。
| 名称 | 定義 |
|---|---|
| Name | 転写産物の名前。fastaのヘッダ行 |
| Length | 転写産物の塩基長 |
| EffectiveLength | fragment distributionやsequence-specific、gc-fragment biasなどを考慮したeffective length。TPMの計算とかに使われる。 |
| TPM | 正しい意味でのTPM。この値をこの後の解析に使うことが推奨されている |
| NumReads | salmonによって転写産物にマップされたリード数 |
tximportでファイルを読み込む
quant.sfファイルを読み込めます。
のような末尾にexpがついたディレクトリにsalmonの出力が入っているとします。
tximportされたものの中身をcsv形式で書き出す
workspaceは続いている感じです。 読み込みはできたんですが、目的のものを取り出す操作が必要です。
tximportに何が入っているかはnames(tximportObject)で確認できます。
中身は
- abundance: TPM
- counts: NumReads
- length: EffectiveLength
- countsFromAbundance:
"no","scaledTPM","lengthScaledTPM"or"dtuScaledTPM"
です。countsFromAbundanceのdefaultは"no"です。
面倒な話なのですが、scaledTPM、lengthScaledTPM、dtuScaledTPMはTPMとは別物で、
などのようにして得られるカウント値のようなものです。NumReadsからカウントするのではなく、abundance(この場合はTPM)からカウントして、それをライブラリサイズによってスケーリングしたものです。この場合のxxxxTPMはTPM由来ということで、TPMのように扱うのは好ましくないです。
ちなみにですが、それぞれのscale方法は以下です。また、tximportObject$countsで得られるものは、サンプルごとにsumをとるとすべてNumReadsの総数と等しくなります。
| 名称 | 方法 |
|---|---|
no | simplesum |
scaledTPM | ライブラリサイズに補正 |
lengthScaledTPM | 転写産物の平均長を補正したライブラリサイズに補正 |
dtuScaledTPM | 転写産物の中央値長で補正したライブラリサイズに補正 |
またdtuScaledTPMはDifferential Transcripts Usage (DTU) 解析のときに最も優れた補正方法らしいです。これらのscaleした値、もしくはそのままのカウントをDifferential Expression Gene (DEG) 解析などには用います。
csvなどで書き出したければ以下のようにすれば良いと思います。
DEG解析の際にどうすればいいのか
3' tagged RNAseqのようなものの場合は、length長を入れるとむしろ補正がかかってよくないので、countFromAbundanceを使わずに、そのままのcount値を入れたほうがいいです。
しかし、普通のfull-transcripts-lengthなRNA-seqでは転写産物の長さを補正したほうがいい結果が得られるらしいです。
ここからは公式docのコードを少しだけ改変したものをメモ用に貼っておきます。
edgeR
DESeq2
DESeq2のDESeqDataSetFromTximportを読むと
なので、countAbundance = "scaledTPM"とかならcsvとかにした後そのまま読み込ませても良さそう。
感想
scaledTPM系列ががややこしい。
limma-voomって使ったことないんですけどどういうメリットがあるんですかね。