RNAseqの基本的な解析例

RNAseqの基本的な解析についてまとめてみました。
データはNBPSeqというパッケージに付属のarabを用いました。
これはシロイヌナズナ(Arabidopsis)のmutantとコントロールの二群から各々3つずつサンプリングされ、Illumina Genome Analyzer(http://www.illumina.com)によりシーケンスされたものです。

###データの読み込みと簡単な評価##

#NBPSeqをインストール&ロード
source("http://bioconductor.org/biocLite.R")
biocLite("NBPSeq")
library(NBPSeq)

#arabオブジェクトを生成
data(arab)

#arabの中身を頭出し
> head(arab)
mock1 mock2 mock3 hrcc1 hrcc2 hrcc3
AT1G01010 35 77 40 46 64 60
AT1G01020 43 45 32 43 39 49
AT1G01030 16 24 26 27 35 20
AT1G01040 72 43 64 66 25 90
AT1G01050 49 78 90 67 45 60
AT1G01060 0 15 2 0 21 8
#NGSのデータ特有の整数値が格納されていることが確認できる。

#arabオブジェクトの構造(各カラムのモード等)を表示
> str(arab)
int [1:26222, 1:6] 35 43 16 72 49 0 16 170 291 113 ...
- attr(*, "dimnames")=List of 2
..$ : chr [1:26222] "AT1G01010" "AT1G01020" "AT1G01030" "AT1G01040" ...
..$ : chr [1:6] "mock1" "mock2" "mock3" "hrcc1" ...



####データの可視化により定性的な評価を行う###

#サンプル間のすべての組み合わせに対してscatter plotを行い、technical duplicateとbiological duplicateのばらつきを評価する。
pairs(arab, log="xy", pch=16, cex=.3)


#hとmの各々について行の平均値を計算する
mean_m <- apply(arab, 1, function(x){mean(x[1:3])}) mean_h <- apply(arab, 1, function(x){mean(x[4:6])}) #MAプロットを行うために、M (log fold-change)とA (log intensity)を求める。 M <- log2(mean_h) - log2(mean_m) A <- 1/2 * (log2(mean_h) + log2(mean_m)) #MAプロットを行う plot(A, M, pch=16, cex=0.3, col="gray50",main="MA-plot:moc vs hrc) #M=0の高さに水平線を引く。 abline(h=0, col=4, lty=2)




###5倍以上の発現変動があった遺伝子をピックアップする。###

#これまでの計算結果をひとつのテーブルにまとめる
arab_summary <- data.frame(arab, mean_m, mean_h, M, A) #各行で発現変動があったかどうかを調べて二値で表す。(RPKMなどの手法で正規化を行っていない生データに対して解析を行うのは乱暴であるが。。) > head(M >= log2(5))
AT1G01010 AT1G01020 AT1G01030 AT1G01040 AT1G01050 AT1G01060
FALSE FALSE FALSE FALSE FALSE FALSE
#5倍以上の発現変動があった遺伝子を抽出し、新たなテーブルを作成
five_fold <- subset(arab_summary, arab_summary$M >= log2(5))

#MA-plotを描写して、5倍異常の発現変動があった遺伝子を赤くマーキングする
plot(arab_summary$A, arab_summary$M, pch=16, cex=0.3, col="gray50")
points(five_fold$A, five_fold$M, col="red", pch=16, cex=0.4)


#倍数変化の手法だと、発現値の低い遺伝子(ばらつきの大きな傾向にあります)にたくさんの偽陽性が含まれて、
#発現値の高い遺伝子(ばらつきが小さい傾向にあります)に偽陰性がたくさんふくまれてしまいます。
#しっかりデータ全体にたいして正規化を行った後、t-testなどでp値を用いた検定を行い、その両者の共通項を探しにいくのが無難かと思われます。

ファイルサイズを調べる

lsに-hlというオプションを付けると、各ファイルサイズに単位をつけて表示してくれます。

Rのedit関数

RのオブジェクトをWindowsのECELをいじる感覚で、直接編集してしまいたい場合は、edit関数を使います。


すると、vimがたちあがり、直接数値をいじることができます。

もちろん、「:wq」で保存して終了します。

マニュアルページのソースを理解する

使用方法の正確には理解できていないコマンドはmanコマンドにより、マニュアルを参照することになります。

今回は、そのマニュアルコマンドが参照する元ネタのファイルについて勉強しました。

lsコマンドのマニュアルファイルを例にとってみます。

まず、マニュアルは以下の9章に分けられて記述されています。

$ man man

1 実行プログラムまたはシェルのコマンド
2 システムコール (カーネルが提供する関数)
3 ライブラリコール (システムライブラリに含まれる関数)
4 スペシャルファイル (通常 /dev に置かれている)
5 ファイルのフォーマットとその約束事。例えば /etc/passwd など
6 ゲーム
7 マクロのパッケージとその約束事。例えば man(7), groff(7) など
8 システム管理用のコマンド (通常は root 専用)
9 カーネルルーチン [非標準]

lsは実行プログラムであり、シェルのコマンドであるので、第一章すなわちman1のディレクトリに置いてあることが予想されます。


manのパスは/etc/manpath.configというファイルに記述されています。
$ less /etc/manpath.config

# *PATH* -> *MANPATH*
#
MANPATH_MAP /bin /usr/share/man
MANPATH_MAP /usr/bin /usr/share/man
MANPATH_MAP /sbin /usr/share/man
MANPATH_MAP /usr/sbin /usr/share/man
MANPATH_MAP /usr/local/bin /usr/local/man
MANPATH_MAP /usr/local/bin /usr/local/share/man
MANPATH_MAP /usr/local/sbin /usr/local/man
MANPATH_MAP /usr/local/sbin /usr/local/share/man
MANPATH_MAP /usr/X11R6/bin /usr/X11R6/man
MANPATH_MAP /usr/bin/X11 /usr/X11R6/man
MANPATH_MAP /usr/games /usr/share/man
MANPATH_MAP /opt/bin /opt/man


lsのパスは
$ which ls
/bin/ls
なので、/usr/share/manのディレクトリ下にあると考えられる。

$ cd /usr/share/man
$ cd man1
$ pwd
/usr/share/man/man1

lsとついているファイルを表示
$ ls | grep ls
alsactl.1.gz
alsamixer.1.gz
dpkg-gensymbols.1.gz
false.1.gz
fslsfonts.1.gz
hp-levels.1.gz
ls.1.gz
lsattr.1.gz
lsb_release.1.gz
lscpu.1.gz
lsdiff.1.gz
lshw.1.gz
lspgpot.1.gz
lss16toppm.1.gz
lsusb.1.gz
md5sum.textutils.1.gz
mtools.1.gz
mtoolstest.1.gz
mysqlshow.1.gz
mysqlslap.1.gz
ppmtolss16.1.gz
pulseaudio.1.gz
smbcacls.1.gz
system-tools-backends.1.gz
tclsh-default.1.gz
tclsh.1.gz
tclsh8.4.1.gz
tclsh8.5.1.gz
xlsatoms.1.gz
xlsclients.1.gz
xlsfonts.1.gz



ls.1.gzがおそらく、lsのマニュアルであろうと考えられるので、ホームディレクトリにコピーして展開
$ cp ls.1.gz ~
$ cd ~
$ gunzip ls.1.gz
$ ls | grep "ls"
ls.1
$ less ls.1
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.35.
.TH LS "1" "June 2010" "GNU coreutils 8.5" "User Commands"
.SH NAME
以下続く


マニュアルは、manコマンド固有の文法でかかれているようである。
makefileとこの点は類似しています。
ちょっと調べたところ、groffコマンドをフィルタにすれば可読な文に翻訳できることがわかった。

$ groff -Tascii -man ls.1 | less

]LS(1) User Commands LS(1)



NAME
ls - list directory contents

SYNOPSIS
ls [OPTION]... [FILE]...

DESCRIPTION
List information about the FILEs (the current directory by default).

続く・・・



結構シンプルな仕組みですね。

でしたら、以前自分で作ったhello(/bin/hello)プログラムに関してのオンラインマニュアルを作成して、/usr/share/man/man1/に置いてやれば、manコマンドの引数とすることができるはずです。

$ vim hello.1
$ ls hello.1
.TH HELLO 1
.SH NAME
HELLO \- A simple greeting application that only geets.

.SH AUTHOR
KAPPA

$ gzip hello.1
$ ls
hello.1.gz
#/usr/share/man/man1/へコピー
$ sudo hello.1.gz /usr/share/man/man1

#テストしてみます。
$ man hello

HELLO(1) HELLO(1)

NAME
HELLO - A simple greeting application that only geets.

AUTHOR
KAPPA

HELLO(1)

うまくいきました。


ソフトウェアをマニュアルも一緒に配布しようと考える場合は、今回の操作をMakefileに書き込んでおけばいいのかな?
Configureスクリプトでマニュアルのパスを調べるようにしておくのかな?

現段階の理解では、まだよく分かりません。

Manコマンドを日本語化

ubuntuに限られると思いますが、以下の一行をターミナルで入力してもらえば、日本語化が完了します。

sudo aptitude install manpages-ja