Haruo Suzuki (haruo[at]g-language[dot]org)
Last Update: 2015-11-09
"Bioinformatics Data Skills by Vince Buffalo (O’Reilly). Copyright 2015 Vince Buffalo, 978-1-449-36737-4."
- O'Reilly Media | Free Sampler(Chapter 1の全文公開)
- Safari Books Online(Preface、Chapter 1、Chapter 4 の全文公開)
- Amazon.co.jp | Amazon.com
- Bioinformatics Data Skills - Twitter Search
- 2015-09-13 Twitter competition: win a signed copy of Bioinformatics Data Skills by Vince Buffalo — ACGT | #ACGT hashtag on Twitter
- 2015-08-04 101 questions with a bioinformatician #30: Vince Buffalo — ACGT
- 2015-06-25 bds:index [SoWiki]
- 3 months ago Asking for opinions about Bioinformatics Data Skills book
- 2015-02-13 O'Reilly's early release of "Bioinformatics Data Skills" is 50% off until Feb 18th, use code WKERES : bioinformatics
- 2015-04-08 (Rob Denton) Don’t trust your data: reviewing Bioinformatics Data Skills | The Molecular Ecologist
- 2014-04-03 Reading the early release of "Bioinformatics Data Skills"Musings from a PhD candidate
バイオインフォマティクス・データスキル:オープンソースのツールによる再現可能で頑強な研究
I. Ideology: Data Skills for Robust and Reproducible Bioinformatics
II. Prerequisites: Essential Skills for Getting Started with a Bioinformatics Project
- 2. Setting Up and Managing a Bioinformatics Project
- 3. Remedial Unix Shell
- 4. Working with Remote Machines
- 5. Git for Scientists
- 6. Bioinformatics Data
III. Practice: Bioinformatics Data Skills
- 7. Unix Data Tools
- 8. A Rapid Introduction to the R Language
- 9. Working with Range Data
- 10. Working with Sequence Data
- 11. Working with Alignment Data
- 12. Bioinformatics Shell Scripting, Writing Pipelines, and Parallelizing Tasks
- 13. Out-of-Memory Approaches: Tabix and SQLite
- 14. Conclusion
データスキルは、試練を経たオープンソースのツールを利用するので、同じスキルで次世代のデータにも適応できる。
本書は、ソフトウェアの実行方法は扱わない。
本書は、複雑で大規模なデータセットから意味を抽出し探索する技術を扱う。
本書を通して、頑強(robust)で再現可能(reproducible)な方法を強調する。
本書は、主に配列データを扱う。配列データは豊富にあり、配列データ解析に必要なテキスト処理技術は、他のデータにも適用できる。
生物学者と計算機科学者の両方を対象
ハード
前提知識は以下の通り。
- スクリプト言語(例 R言語、Python、)
- テキストエディタ(例 Emacs、Vim、)
- 基本的なUnixコマンドライン技術。ディレクトリ・ファイル操作(
cd, ls, pwd, mv, rm, rmdir, mkdir
)。ファイルの所有権とアクセス権の変更(chown, chmod
) - 生物学の基礎(DNA、RNA、タンパク質、遺伝子、セントラルドグマ)
- 正規表現
- ヘルプやマニュアルの参照。Unixの
man
やRのhelp()
- システム管理
GitHubリポジトリの補足資料を取得する。
例題は、Unix系のOS(Mac OS XやLinux)で動作する。
パッケージ管理システム(Ubuntu/Debianのapt-get
やMac OS XのHomebrew)を使用する。
本書は3部構成:第I部はイデオロギーに関する1章、第II部は基礎編、第III部は実践編。
第I部. イデオロギー:頑強で再現可能なバイオインフォマティクスのためのデータスキル
第1章. バイオインフォマティクスの学び方
Figure 1-1. DNA配列決定コストの減少 DNA Sequencing Costs
Figure 1-2. Sequence Read Archiveの指数的成長
- 2015-05-18 次世代シークエンサーにより得られたデータの解析 : ライフサイエンス 領域融合レビュー
再現可能な研究
データ、コード、ソフトウェアのバージョンとダウンロードした日時を記録する。
"garbage in, garbage out"「ゴミを入れればゴミが出てくる」
バイオインフォマティクスの黄金律:
ツールやデータを絶対に信用しない。
頑強な研究のススメ
Style guides for Google-originated open-source projects
前提条件のチェックに表明(assertion)を使用する。Pythonのassert()
やRのstopifnot()
単体テスト(unit testing)
例えば、add()
関数をテストするtest_add()
関数をPythonで書く:
なるべく既存のライブラリを使う
歴史が長く、閲覧者が多いので、バグが少ない。
データを読み取り専用として扱う
Excelでセルの値を変更して保存するのはダメ。プログラムが、データを読み取り、新しい別の結果ファイルを作成するのが良い。元のファイルを変更してしまうと、再試行・再現できなくなる。
探索的データ解析 (Exploratory Data Analysis; EDA)を通してデータの質を証明する。Chapter 8でR言語を用いてEDAを学ぶ。
再現可能な研究のススメ
データとコードを公開する
全て記録する
プレーンテキスト形式のREADMEファイルに解析の各ステップを記録する。
図表を出力するスクリプトを書く
ドキュメントとしてコードを使用する
第II部. 前提条件:バイオインフォマティクス・プロジェクト入門のための必須スキル
第2章. バイオインフォマティクス・プロジェクトの作成と管理
プロジェクト・ディレクトリの構造
プロジェクトの全ファイルを1つのディレクトリに格納する。
例えば、トウモロコシ(学名Zea mays)のSNP検出プロジェクトのディレクトリ(zmays-snps/
)を作成する:
data/
ディレクトリにデータを格納する。scripts/
ディレクトリにスクリプトを格納する。analysis/
ディレクトリに解析結果を格納する。
ファイル(ディレクトリ)名には、 スペース(空白)を使わない、 英数字かアンダースコアかダッシュ( A-z a-z 0-9 _ - )を使う。 拡張子を付ける。(例 osativa-genes.fasta)
スクリプトがプロジェクト・ディレクトリ内の他のファイルを参照する場合には、絶対パス(例 /home/vinceb/projects/zmays-snps/data/stats/qual.txt
)ではなく、相対パス(例 ../data/stats/qual.txt
)を使う。
プロジェクトの記録
記録する情報の例は以下の通り。
- 方法とワークフロー。全コマンドラインをコピー&ペースト。デフォルト値も
- データの入手元(ウェブサイトのURL等)
- データをダウンロードした日付
- データのバーション(例 TAIR10、WS231)
- データのダウンロード方法(例 MySQL、UCSC Genome Browser)
- ソフトウェアのバーション(なければ、日付やURL)
以上の情報をプレーンテキスト形式のREADMEファイルに記録する。プレーンテキストはコマンドラインから簡単に読込・検索・編集できる。
README
ファイルはプロジェクトの主ディレクトリに格納する。
data/README
ファイルに、data/
ディレクトリのデータファイルの説明(いつ・どこから・どのようにダウンロードしたのか)を記載する。touch
コマンドでサイズが0の空ファイルを作成する:
プロジェクトをサブプロジェクトに分割するディレクトリを作成
ファイル処理を自動化するために、データをサブディレクトリに編成し、明確で一貫性のあるファイル名を付ける。
cd ~
でホームディレクトリに移動。ワイルドカードのアスタリスク(*)は全ての文字列にマッチする。
Brace expansion ブレース展開の例:
zmays-snps/プロジェクト・ディレクトリを作成:
3つのサンプル(zmaysA, zmaysB, zmaysC
)毎にペア(R1, R2
)の空データファイルを作成する:
ワイルドカードのアスタリスク(*)を用いて、サンプル名zmaysB
を持つ全てのファイルを表示する:
偶然の一致を避けるために、ワイルドカードを可能な限り限定する。例えば、zmaysB*
の代わりに、zmaysB*fastq
またはzmaysB_R?.fastq
を用いる(?
は任意の1文字)。
文字列[AB]
や文字の範囲[A-B]
にマッチするワイルドカードを用いて、サンプルCを排除する:
ワイルドカードは存在するファイルを展開するのに対して、brace expansion(例 snps_{10..13}.txt
)はファイルやディレクトリが存在するか否かに関係なく展開する。
Table 2-1. Unixのワイルドカード
ファイル名の先頭に0を付ける(例 file-21.txtではなくfile-0021.txtにする)と、ls
で辞書順にファイルがソートされる。
touch gene-{1..14}.txt
printf "gene-%03d.txt " {1..14} | xargs touch
プレーンテキスト形式で書かれたプロジェクト・ノートは、コマンドラインやネットワーク経由で読込・検索・編集できる。
Markdown(マークダウン)
- Markdown記法入門 (全8回) - プログラミングならドットインストール
- MarkdownでMarkdownの書き方を書いてみた
- README.mdファイル。マークダウン記法まとめ | codechord
- ディレクターが知っておいて欲しい10個のMarkdown-マークダウン記法 - PHPサンプル実験室
John Gruberのホームページ(Daring Fireball: Markdown Syntax Documentation)
Figure 2-1. MarkdownノートのHTML表示
Table 2-2. Markdown記法
見出し(Header)、リスト、コードの書き方
見出しのレベル(1~6)は、#の個数で表す:
リストは、行頭にダッシュ(-)、アスタリスク(*)、プラス(+)か、番号ピリオド(1.):
コードは、行頭に「半角スペースを4つ」か「タブを1つ」を追加:
リストの項目内にコードを配置する場合、「半角スペースを8つ」か「タブを2つ」にする。
MultiMarkdown
GitHub Flavored Markdown - User Documentation
第3章. Unixシェル
本章では、ストリーム、リダイレクト、パイプ、プロセス、コマンド置換(command substitution)を扱う。
bash
を使う。
echo $SHELL
(echo $0
) で現在のシェルを確認
chsh
でログインシェルを変更
標準出力をファイルにリダイレクト
タンパク質のアミノ酸配列データを記述したFASTA形式ファイル tb1-protein.fastaと tga1-protein.fastaを見る。
cat
コマンドで tb1-protein.fasta ファイルを標準出力する:
複数のファイルを標準出力する:
記号>
(上書き)や>>
(追記)で標準出力をファイルにリダイレクトする:
Figure 3-1.
ls -lrt
で更新日時の逆順にソートする(詳細はman ls
を参照)。
標準エラー出力をリダイレクト
ls -l tb1.fasta leafy1.fasta
を実行すると、存在するファイル(tb1.fasta)は標準出力に、存在しないファイル(leafy1.fasta)は標準エラー出力に送られる。
記号>
と2>
を用いて、標準出力(standard output)と標準エラー出力(standard error)を別のファイルにリダイレクトする:
記号2>
は上書き、2>>
は追記。
ファイル記述子
2>
擬似デバイス(pseudodevice)の /dev/null は、あらゆる入力を受け付けて捨てる。
tail -f
でリダイレクトされた標準エラー出力を監視する。Control-Cで動作中のプロセスを停止。
標準入力リダイレクト演算子<
よりも、Unixパイプ(例 cat inputfile | program > outputfile
)を使う方が一般的。
Figure 3-2.
パイプとgrep
を用いて、FASTAファイルに含まれるATGC以外の文字を探す:
ハイライトされたYはpYrimidine塩基[CT]を示す(Nucleic acid notation)。
正規表現はクオーテーションで囲む(例 ">"
)。grep -v > tb1.fasta
とした場合、シェルは>
をリダイレクト演算子と解釈し、ファイルを上書きしてしまう!
2>&1
演算子は標準エラー出力を標準出力にリダイレクトする:
プロセス操作の基本:バックグラウンドでプロセスを実行・管理、プロセスを強制終了、プロセスの終了ステータスを確認
コマンドの末尾にアンパサンド(&
)を追加して、プログラムをバックグラウンドで実行する:
[1]はジョブ番号、26577はプロセスID(PID)。
jobs
でバックグランド・ジョブを表示する:
fg
でバックグラウンド・プロセスをフォアグラウンド(foreground)へ戻す。fg %ジョブ番号
で指定。バックグラウンド・プロセスが1つしかない場合には、fg
とfg %1
は同じ:
バックグラウンドのプロセスがハングアップ・シグナル(SIGHUP) を受け付けないようにするには、nohup
を使うか、Tmux内で走らせる。Chapter 4で詳細に述べる。
Control-z キーで中断させたジョブを
bg
コマンドを用いてバックグラウンド(background)で再開:
複数の実行中のプロセスがある場合、バックグラウンドで再開させるジョブをbg %ジョブ番号
で指定する。
top
、
ps
、
kill
コマンド。
GitHub上の本章のREADMEを参照されたい。
終了ステータス(exit status) 慣習的に正常終了時はゼロ、異常終了時はゼロ以外を返すのが一般的である
終了ステータスの値は、シェルの特殊変数$?
に設定される。
終了ステータスを判定してコマンドを実行する。
&&
は、コマンドが成功した場合のみ次のコマンドを実行する:
||
は、コマンドが失敗した場合のみ次のコマンドを実行する:
&&
と||
をテストするのに、正常終了true
または異常終了false
を返すUnixコマンドを用いる:
コマンド置換 - `command`ではなく$(command)を使う。なぜか?ネストできるから。
date +%F
コマンドを用いて日付ディレクトリを作成する:
このディレクトリ名は年代順にソートされる:
add alias
を用いて ~/.bashrc(Mac OS Xでは ~/.profile)ファイルに追加する。例えば、常に同じディレクトリ構造のプロジェクト・ディレクトリを作成する:
第4章. リモートマシンの操作
secure shell (SSH)
IPアドレスを用いてマシンに繋げるには ssh 192.169.237.42
ポートとユーザー名を指定する:
ホストに接続できない場合、ssh -v
でデバッグする。verboseの-v
は-vv
や-vvv
でより冗長に。詳細は、man ssh
。
- [管理者必見! ネットワーク・コマンド集 - sshコマンド:ITpro](管理者必見! ネットワーク・コマンド集 - sshコマンド:ITpro)|-v デバッグ・モードを有効にする。このオプションは最大三つまで重ねて指定できる。重ねていけば,より詳細な情報が出力される。
- 入門OpenSSH / 第7章 うまくいかない時は|ssh をデバッグモードで実行する
~/.ssh/configファイルを作る:
Host bio_serv
HostName 192.168.237.42
User cdarwin
Port 50453
リモートホストのデフォルトと同じならPort
とUser
を指定する必要は無い。ssh -p 50453 cdarwin@192.169.237.42
とタイプする代わりに、エイリアスssh bio_serv
を用いて192.168.236.42にSSH接続できる。
hostname
コマンドは、ホスト名を表示する。
whoami
コマンドは、ユーザー名を表示する。
- Linuxコマンド【 ssh-keygen 】認証用の鍵を生成 - Linux入門 - Webkaru
- Linuxコマンド集 - 【 ssh-keygen 】 SSH用の公開かぎ、秘密かぎのペアを作成する:ITpro
- Linux - ssh公開鍵認証設定まとめ - Qiita
ssh-keygen
コマンドを用いて、秘密鍵(~/.ssh/id_rsa)と公開鍵(~/.ssh/id_rsa.pub)を生成する。
リモートホストにログインして、~/.ssh/authorized_keysに公開鍵ファイル(id_rsa.pub)の内容を追加する。ssh-copy-id
コマンドを用いて自動登録も可能。
ハングアップシグナル(SIGHUP
)
nohup
とTmux
- nohup ハングアップに反応しないようにしてコマンドを実行する
- Linuxコマンド集 - 【 nohup 】 ログアウトした後もコマンドを実行し続ける:ITpro
- プロセス管理 — nohup, disown, kill — Watallica metallicus
- tmux — 仮想端末でリモート仕事を安全に — Watallica metallicus
- tmuxに慣れてみる: tmuxとGNU screenの違いなど
- tmux入門 (全10回) - プログラミングならドットインストール
nohup
は、プロセスID(PID)を返す。
terminal multiplexer:TmuxとGNU Screen
TmuxをMac OS XにHomebrewでインストールする:
設定ファイル(.tmux.conf)をホームディレクトリに置く。シェルが設定を ~/.profile や ~/.bashrc から読み込むように、Tmuxは設定を ~/.tmux.conf から読み込む。
Tmuxの新しいセッションを開始する:
Tmuxのプレフィックスキー(キーバインド)は、デフォルトではControl-bを用いるが、設定ファイル(.tmux.conf)でControl-aに変更した。
セッションのデタッチは Control-a d
セッションの確認: tmux list-sessions
セッションのアタッチ: tmux a
Tmuxのマニュアルページを見る: man tmux
Table 4-1. Tmuxの基本的キー操作
Table 4-2. Tmuxの基本的コマンド
Emacsで、文字通り Control-a を入力するには、Control-a a とする。
第5章. 科学者のためのGit
Gitのインストールは、Mac OS XでHomebrew (brew install git
)を、Linuxでapt-get
(apt-get install git
)を使う。Git website
Figure 5-1.
テキストエディタを変更
git commit -a -m "your commit message"
例えば、README.mdファイルに一行追加して、git diff
を実行:
ファイルをステージすると、git diff
は何も出力しない。
直近のコミット 比較
クローンしたseqtkリポジトリでgit log
無視させたいファイルを記載した .gitignore ファイルを作成:
.gitignore ファイルをステージし、コミット:
バイオインフォマティクス・プロジェクトで無視させたいファイルの例:
- 巨大なファイル
- 中間ファイル(SAMやBAMファイル)
- テキストエディタ(EmacsやVim)の一時ファイル(例 textfile.txt~ や #textfile.txt#)。.gitignore ではワイルドカード(
*~
や\#*\#
)が使える。 - 一時コードファイル(Pythonのoverlap.pyc)
Mac OS Xで作成される隠しファイル .DS_Store
グローバルな*.gitignoreファイルを~/.gitignore_global*に作成し、これを使用するようにGitを設定する:
Figure 5-3. git push (a); git clone (b)
Figure 5-4. git push (a); git pull (b)
the Create a New Repository page
zmays-snps
git remote rm <repository-name>
両リポジトリは同じコミットを持つ git log
で確認
オリジナルのzmays-snps/ローカル・リポジトリのファイルを修正し、コミットし、pushする:
Barbaraのリポジトリ (zmays-snps-barbara) で、セントラル・リポジトリからpullする。
Barbaraのリポジトリが最新のコミットを含むことをgit log
で確認
Figure 5-5
pull request
隣のアスタリスクは、現在いるブランチを示す。
README.mdを編集:
この変更をreadme-changesブランチにコミットする。masterブランチに戻り、このコミットが存在しないことを確認する:
masterブランチに戻り、adapters.faファイルを追加し、この変更をコミットする:
今、両方のブランチに新しいコミットがある。Figure 5-6.
テキスト・エディタが開く。
git checkout
変更したファイルを戻す
git stash
修正をいったん退避する
git branch
ブランチ操作
Scott ChaconとBen StraubのPro Git book
第6章. バイオインフォマティクス・データ
大規模で複雑なゲノム・データの課題:
- Retrieving data データの取得
- Ensuring data integrity データ完全性の確保
- Compression 圧縮
wget
とcurl
は、データをウェブからダウンロードするコマンドラインのプログラム。パッケージ管理システム(Homebrewやapt-get
)でインストールできる。
wget
を用いて、GRCh37(hg19)ヒト22番染色体をダウンロードする:
HTTP or FTP の認証は wget
の--user=
と--ask-password
オプションを用いる。
man wget
でオプション一覧を見る。
Table 6-1. wgetのオプション
curl
は、デフォルトでは標準出力するので、wget
と同じようにするには、リダイレクトする(または-O <filename>
を使う):
curl
はwget
よりも多くのプロトコル [SFTP (secure FTP) や SCP (secure copy) を含む] を用いてファイルを転送できる。
-L/--location
オプション。
RCurlとpycurlはCurlの機能を提供する(ラッパー)。
- Rsync
- Command Technica:はじめてrsyncを使う方が知っておきたい6つのルール (1/2)
- Linuxコマンド【 rsync 】高速なファイル同期(バックアップ) - Linux入門 - Webkaru
- rsync でディレクトリの同期(バックアップ) - maruko2 Note.
-avz
オプションで、-a
はwrsync
のアーカイブモード(-rlptgoD
と同じ)、-z
はデータを圧縮、-v
は経過を表示。SSHでリモートホストに繋ぐので、-e ssh
を用いる。ディレクトリをコピーするコマンドは以下の通り:
末尾のスラッシュを追加するか否か (例えば、data/ と data) で挙動が変わる。
例えば、GTFファイルを192.168.237.42:/home/deborah/zea_mays/data/に転送する:
チェックサムで転送データの整合性を検証。
SHA-1チェックサム。shasum
(一部のシステムではsha1sum
)プログラムに任意の文字列を渡す:
md5sum
(Mac OS Xではmd5
)プログラムはMD5ハッシュ値を計算する。
データの違いを見る
diff
コマンドで
gene-1.bedと
gene-2.bed
ファイルの差分を出力する:
データの圧縮
gzip
を用いて、trimmer
(架空のプログラム)の出力を、ディスクに書き込む前に、圧縮する:
gzip
コマンドで圧縮:
gunzip
コマンドで解凍:
-c
オプションを用いて圧縮・解凍の結果を標準出力に書き出す:
解凍しないで圧縮ファイルに結合する:
圧縮ファイルを直接操作できるコマンドは、zgrep
、zcat
(Mac OS Xではgzcat
)、zdiff
、zless
Ensemblのウェブサイトの Mouse の "Download DNA sequence (FASTA)" ftp://ftp.ensembl.org/pub/release-82/fasta/mus_musculus/dna/ を開く。
Genome Reference Consortium
GRCm38マウス参照ゲノムをwget
でダウンロードする:
zgrep
コマンドを用いて正規表現"^>"で圧縮ファイルのFASTAヘッダを確認:
EnsemblのCHECKSUMSファイルと比較:
SHA-1サムを計算:
GTFとCHECKSUMSをEnsemblからダウンロード:
CHECKSUMSファイルと比較し、SHA-1サムを計算:
Markdownノート(README.md)の例:
第III部. 実践:バイオインフォマティクス・データスキル
第7章. Unixのデータ・ツール
Unixコマンドをパイプで繋ぐことにより、データをパースし操作し集計する1行プログラム(ワンライナー)を構築する。
タブ区切り
head
でファイルの先頭部分を表示する:
tail
でファイルの末尾部分を表示する:
tail
でファイルのヘッダを削除する:
ファイルの始まりと終わりの両方を見る:
設定ファイル(~/.bashrcや*~/.profile*)にショートカットを作る:
ショートカットのi
(inspect)コマンドを実行:
パイプでgrep
の標準出力をhead
に渡す:
- シグナル (ソフトウェア)
シグナル
SIGPIPE
は、読み手のいないパイプへの書き込み
シグナルSIGINT
は、割り込み端末から割り込みキー(通常 CTRL + C)を押下したときに発生
- UNIXの部屋 コマンド検索:less (*BSD/Linux)
- Linuxコマンド集 - 【 less 】 テキスト・ファイルの内容を閲覧する:ITpro
- less - 1ページずつ表示 - 会津大学UNIXウィキ
lessでcontaminated.fastqファイルを見る:
less
を終了するには、qを押す。hでヘルプを表示する。
Table 7-1. lessの操作方法
less
は、テキスト検索(マッチした部分をハイライト)、パイプラインのデバッグや構築に利用できる。
less
でcontaminated.fastqを開いて、 / を押して、AGATCGGを入力。結果は
Figure 7-1
wc
(word count)で行数、単語数、文字数を表示:
ls -l
でファイルのサイズを確認:
空白(スペース、タブ、改行)を除くには、
grep
を使う:
awk
でファイルの列(フィールド)数を表示:
Mus_musculus.GRCm38.75_chr1.gtfファイルのヘッダを除いてから、列(フィールド)数をawk
で表示:
grep
を用いて、"#"で始まる行を除く:
cut
でタブ区切りファイルの2列目を抽出:
grep
でメタデータ行を削除し、cut
で1,4,5列(染色体、開始位置、終了位置)を抽出:
cut -d
で区切り文字を指定する。CSVファイル:
タブ区切りファイルの出力は(要素が何列目に属するのか)みにくい:
column -t
で整形:
column -s
で区切り文字を指定:
Figure 7-2
トウモロコシ・ゲノムで文字列"AGATGCATG"を検索した実行時間を、4手法(grep
、sed
、awk
、Python
スクリプト)間で比較した結果、grep
が最速。
ヒト1番染色体の全タンパク質のEnsembl遺伝子識別子と遺伝子名が含まれている
Mus_musculus.GRCm38.75_chr1_genes.txtファイル内の遺伝子"Olfr418-ps1"をgrep
で見つける:
grep --color=auto
オプションでマッチング部分を色付けする。
GNU coreutilsをMac OS Xにインストール:
grep -v
でマッチしない行を返す。"Olfr1413"以外の"Olfr"を含む遺伝子群を出力:
grep -w
で(空白で囲まれた)単語全体にマッチする:
パターンにマッチした行の前(-B
)、後(-A
)、前後(-C
)を出力するオプション:
grep
は、正規表現 POSIX Basic Regular Expressions (BRE)をサポート。
Ensembl遺伝子識別子"Olfr1413"と"Olfr1411"を見つける:
grep -E
オプションで、POSIX Extended Regular Expressions (ERE) を用いる。
"Olfr218"または"Olfr1416"にマッチ:
grep -c
オプションで、パターンにマッチした行数を表示:
grep -o
オプションで、マッチした部分だけを抽出:
Example 7-1. ユニークな(重複のない)ソートされた遺伝子名のリストを出力
ASCII。man ascii
何かが正常に動作しない場合、ファイルの文字コードを疑い、file, hexdump, grep
コマンドで確認する。
Sortで行を並べ替える。
sort -t
(例えば、CSVファイルは-t","
)で列の区切り文字を指定する。
sort
のオプション。-k
で列の範囲(start,end)を指定してソート、-n
で数値としてソート。
1列目(染色体 chromosome)でソートし(-k1,1
)、1列目が同じもの(例、"chr1"や"chr3")は2列目で数値としてソートする(-k2,2n
):
sort -s
-c
オプションで、既にソートされているかチェックする:
-r
オプションで逆順(降順)にソートする:
一部のオプションは、GNU sort
でのみ利用可能(Mac OS XのBSD版ではない)。例えば、
-V
オプションは英数字を(文字列の中の数字を理解して)ソートする:
merge sortでメモリを超えるファイルをソートできる:
-S
オプションで、K(キロバイト)、M(メガバイト)、G(ギガバイト)、%(総メモリの割合)を指定する。
--parallel
オプションで、4つのコアを指定してソートする:
uniq
は、連続する重複行を削除して出力する:
-i
オプションで、大文字と小文字の区別をつけない。
-c
オプションで、重複行の数も表示:
Unixコマンド(grep, cut, sort, uniq
)を組み合わせて、表形式データの列を要約:
-d
オプションで、重複行のみを表示:
example.bedとexample_lengths.txtファイルを使う:
両方のファイルがソートされていない限り、join
は期待通り動作しない:
基本的な構文は、join -1 <file_1_field> -2 <file_2_field> <file_1> <file_2>
:
example_lengths.txtにchr3
が無い場合:
-a
オプションで、ペアにならない行も生成:
Mac OS XはBSD Awk。GNU Awk(Gawk)のマニュアルはman gawk
Awkは、入力データをレコード(行)に分割し、各レコードをフィールドに分割する。レコード全体は変数$0
に格納され、フィールドは$1, $2, $3, ...
と分割される。
Awkは算術演算子(+, -, *, /, %, ^
)をサポートしている。featureの長さ(終了位置 - 開始位置)が18を超える行だけを出力:
Table 7-2. Awkの比較・論理演算子
論理演算子 &&
(AND), ||
(OR), !
(NOT) でパターンを繋ぐ。1番染色体上で長さ>10の行を出力:
2番染色体と3番染色体について、長さ(終了位置 - 開始位置)の列を追加する:
BEGIN
とEND
NR
(Number of Record)は現在の行番号
awk -F","
でCSVファイルの区切り文字を指定する。
NR
を用いて、行の範囲を抽出:
GTFファイル(Mus_musculus.GRCm38.75_chr1.gtf)をBEDファイル(3列)に変換:
Awkの連想配列(associative array)は、Pythonの辞書、Perlのハッシュのように振る舞う。
Table 7-3. Awkの組み込み関数
- [The GNU Awk User's Guide - 組み込み関数](The GNU Awk User's Guide - 組み込み関数)
Unixコマンド(grep, cut, sort, uniq -c
)を用いて、特定の遺伝子の特徴をカウントする:
Bioawkのソースからダウンロード、コンパイル、インストール、またはMac OS Xのパッケージ管理システムHomebrewでインストール:
bioawk -c
で入力形式を指定する。サポートされている入力形式(bed, sam, vcf, gff, fastx
)と設定変数を見る:
全タンパク質コード遺伝子の長さ(終了位置 - 開始位置)の列を追加:
FASTQをFASTAファイルに変換:
FASTQ/FASTAエントリ数をカウント:
配列の相補鎖を求める:
オプション-c hdr
chroms.txtファイルの染色体名を変換("chrom1" → "chr1"):
sed
の文字列置換の構文: s/pattern/replacement/
g
フラグで全ての文字列を置換する: s/pattern/replacement/g
i
フラグで大文字と小文字の区別をつけない: s/pattern/ replacement/i
"chr1:28427874-28425431" (染色体名:開始位置-終了位置) を3列で出力:
(head -n 10
と同様)ファイルの先頭10行を出力:
20〜50行まで出力:
サブシェルでコマンドをグループ化する例:
メタデータのヘッダがあるGTFファイルをソートする:
ストリームを(gzip
で圧縮してから)ファイルにリダイレクトする:
名前付きパイプをmkfifo
コマンドで作成:
プロセス置換
Figure 7-3. プロセス置換
第8章. R言語入門
探索的データ解析 Exploratory Data Analysis (EDA)
参考:
ggplot2
パッケージをインストールする:
R言語とRStudio統合開発環境(IDE)をインストールする。
簡単な計算
関数
Table 8-1. 数学関数
round()
関数
変数の代入
global environment
ベクトル
vectorization
recycle
Rの演算子(+, -, *, /
)や数学関数(例 sqrt(), round(), log()
)はベクトルに対応:
indexing
要素ラベル
subsetting
z[負整数ベクトル]は、対応する要素番号の要素を取り除く:
要素の並べ替え
比較演算子(Table 8-2 例 ==, !=, <, <=, >, >=
)を用いて、論理ベクトル(TRUE; FALSE
)を作成する:
v[論理ベクトル]は、TRUEの要素に対応した要素を取り出す(Example 8-1):
論理演算子 &
(AND), |
(OR), !
(NOT)
Table 8-2. Rの比較演算子と論理演算子
Numeric (double), Integer, Character (strings), Logical
Table 8-3. Rのベクトル型
(NA, NULL, Inf/-Inf, and NaN)
ベクトルの要素は全て同じ型
Rの型の強制変換規則
因子とクラス
関数factor()
で、カテゴリーを要素としたベクトルを作成する:
関数levels()
で、グループを確認:
Rには3種類のオブジェクト指向システム(S3, S4, R5のクラス)がある。
Spencer et al. (2006) "The influence of recombination on human genetic diversity."のデータDataset_S1.txtは、集団遺伝学の統計値を含む。例えば、塩基多様度(列Pi
とTheta
)、組換え(列Recombination
)、ヒトとチンパンジーのゲノム配列一致率(列Divergence
)。他の列は、ウィンドウの開始位置と終了位置(列start
とend
)、シークエンシング深度(列depth
)、GC含量(列%GC
)など。
Rに読み込む前に、コマンドラインからファイルを見る:
colClasses
vector to"NULL"
nrow
inread.delim()
data.table
パッケージのfread()
関数を使う。
RパッケージRSQLite
Rの関数は直接gzip圧縮されたファイルを読み込むこともできる。
read.csv()
関数でCSVファイルを読み込む:
read.delim()
関数でタブ区切りファイルを読み込む:
デフォルトでは、Rの関数read.delim()
とread.csv()
は、文字列を文字列(character)ではなく因子(factor)に強制変換する。これを無効にするには、引数stringsAsFactors=FALSE
(またはas.is
)を使う。
Table 8-4. read.csv() と read.delim() の引数
Table 8-5. 組織毎の遺伝子発現の計数表(wide形式)
Table 8-6. 組織毎の遺伝子発現の計数表(long形式)
reshape2
パッケージはデータを変換する関数を提供する。melt()
はwideデータをlongデータに変換し、cast()
はlongデータをwideデータに変換する。
read.csv()
関数はファイルをデータフレームとして読み込む。
データフレームの各列はベクトル。
ドル・マーク($)で列を指定できる。
d[row, col]
で行と列を指定できる。
データフレームから単一の列を取り出す際、結果のベクトル化を防ぐには、引数にdrop=FALSE
を指定する:
20番染色体のセントロメアの位置は、25,800,000 から 29,700,000 である。セントロメア領域か否か(TRUE/FALSE
)を示す列cent
を、データフレームd
に追加する:
塩基多様度の列Pi
の大きさを変更した新しい列diversity
を作成する:
- Rのグラフィック作成パッケージ“ggplot2”について|Colorless Green Ideas
- ggplot2 | R のグラフをより美しく
- ggplotの使い方 | Memo on the Web
- パッケージggplot - 浅井拓也 研究室用ページ
- ggplot2 の自分用メモ集を作ろう - Triad sou.
- R でグラフ作成 ggplot2 入門
- Tutorial of ggplot2 by Hadley Wickham at ISM | Siguniang's Blog
ggplot2
パッケージ、base graphics、lattice
パッケージ
library()
関数でggplot2
パッケージをロードする:
染色体の位置毎の塩基多様度の散布図(Figure 8-1)を作成する。まず、データフレームd
に列position
(各ウィンドウの中間点)を追加する。次に、データフレームd
の列position
と列diversity
の散布図をggplot2
で作成する:
Figure 8-1. ggplot2の散布図:ヒト20番染色体の位置毎の塩基多様度
例えば、geom_point(), geom_line(), geom_bar(), geom_density(), geom_boxplot()
など。aes()
関数
xlab(), ylab(), ggtitle()
関数
scale_x_continuous(limits=c(start, end))
、関数scale_x_log10()
とscale_y_log10()
Example 8-2は、aes()
をggplot()
に含み、Figure 8-1と全く同じ散布図を作成する:
Example 8-3は、セントロメア領域か否か(列cent
のTRUE/FALSE)で色分けして、Figure 8-2を作図:
(同じ位置にプロットが重なっている)overplottingを回避するために、透明度(alpha)を調整して、Figure 8-3を作図:
geom_density()
を用いて、多様度の密度を見る(Figure 8-4):
多様度の密度を、セントロメア領域か否か(列cent
のTRUE/FALSE)で分けて、透明度(alpha)を半分にして、Figure 8-5を作図:
散布図と平滑化曲線を用いて、シークエンシング深度(列depth
)とウィンドウのSNP合計数(列total.SNPs
)の関係を見る(Figure 8-6):
デフォルトでは、ggplot2
は一般化加法モデル(generalized additive models; GAM)を用いて、平滑化曲線に合わせる。
help(stat_smooth)
、geom_smooth(se=FALSE)
散布図と平滑曲線を用いて、シークエンシング深度に及ぼすGC含量の影響を見る(Figure 8-7):
Binning(離散化)
- 秩序と情報とブロッコリー: R言語のcut関数の使い方
- R.4.42. 連続数のカテゴリ作成 | R Financial & Marketing Library
- R言語で数量データをカテゴリーデータに変換 - jnobuyukiのブログ
- Rでbinning - にちにちメモ
cut()
関数でデータをbinに分割する(Example 8-4は、GC含量):
ggplot2
のgeom_bar()
Figure 8-8.
geom_bar()
のx
が、
因子(例えば、d$binned.GC
)の場合には、ggplot2
は計数値の棒グラフ(Figure 8-8の左)を作成する。
連続の数値(例えば、d$percent.GC
)の場合には、自動的にデータを離散化してヒストグラム(Figure 8-8の右)を作図する。
Figure 8-9. GC含量でグループ分けされたシークエンシング深度(depth)の密度プロット
binwidthの値を 0.05, 0.5, 1, 5, 10 に変化させる。
Rの%in%
演算子
RepeatMaskerで発見されたヒトX染色体上のリピート領域のデータ(chrX_rmsk.txt)を読み込む:
列repClass
は因子(factor)であることを確認:
複数のリピートのクラス(DNA、LTR、LINE、SINE、Simple_repeat)の行を選択するために、common_repclass
ベクトルを作成し、%in%
を用いる:
上位5つの最も多いリピートのクラスを計算する:
[%in%
]演算子は別の関数match()
の簡易版
第1のデータセット(motif_recombrates.txt)は、各モチーフの40kb内の全ウィンドウについて、組換え確率(recombination rate)推定値を含む。第2のデータセット(motif_repeats.txt)は、各モチーフが出現するリピートを含む。2つのデータセットをマージして、特定のリピートに及ぼす各モチーフの組換えの局所的な効果を見る。
データ生成コードはmotif-example/
rpts
データフレームの列name
をmtfs
の列にマージすることが目的。
paste()
関数を用いて、2つの列(chr
とmotif_start
)を1つの文字列に結合する:
列pos
は、2つのデータセット間の共通の鍵として機能する。
マージする前に、mtfs
のモチーフとrpts
の対応するエントリの個数を確認する:
マージする前に、match()
を用いて、mtfs$pos
とrpts$pos
のインデックス・ベクトル(i
)を作成する:
match()
の結果を(i
への割り当てをスキップして)直接用いる:
merge()
でデータを結合(マージ)する:
Figure 8-10. 配列モチーフとの距離と組換え確率
ggplot2
のfacet_wrap()
を用いて、これらのモチーフを分割する(Figure 8-11):
Figure 8-11.
ggplot2
のfacet_wrap()
とfacet_grid()
Figure 8-12
facet_grid()
とfacet_wrap()
の何れも引数scales
を指定できる。例えば(Figure 8-13):
データフレームはリスト; is.list(mtfs)
[ ]
はリストを取り出す。
[[ ]]
はリスト内の要素(ベクトル)を取り出す。
引数を渡す:
- 31. 関数の定義 | R-Tips
- 関数の作り方 | functionによりRの関数を定義する方法
- Rの関数定義の基本 - RjpWiki
- [連載]フリーソフトによるデータ解析・マイニング 第4回 Rでの関数オブジェクト
無名関数(anonymous function)
meanRemoveNAVerbose()
関数の定義:
デバッグ
関数browser()
n
で次の行を確認、c
でコードの実行を継続、Q
で終了
options(error=recover)
も有用
配列と行列 apply()
とsweep()
データをグループ化し、グループ毎に関数を適用し、結果を組み合わせる("The Split-Apply-Combine Strategy for Data Analysis")。最初にRの標準関数を用いて、次にdplyr
パッケージを用いる。
split-apply-combineの簡単な例:GC含量でグループ化した3群の平均深度(Example 8-4, Figure 8-9)
関数tapply()
とaggregate()
でグループ毎に要約する:
dplyr
は非常に高速。
dplyr
でデータフレームを操作する関数は、select(), filter(), arrange(), mutate(), summarize()
- dplyrでデータ処理
- dplyrを使いこなす!基礎編
- 大規模データの高速処理 ーdata.table、dplyrー
- plyr — データ分割-関数適用-再結合を効率的に — Watallica metallicus
tbl_df()
関数を用いて、d
データフレームをtbl_df
オブジェクトに変換する:
select
は、d[, c("start", "end", "Pi", "Recombination", "depth")]
に対応:
filter()
は、d[d$Pi > 16 & d$percent.GC > 80, ]
に対応:
arrange()
は、d[order(d$percent.GC), ]
に対応:
mutate()
関数を用いて、データフレームに新しい列を追加できる。
パイプ(help('%>%')
)を用いて、複数の処理を連結する:
mtfs
データフレームを用いる
summarize()
関数を用いて要約を作成する:
新たに作成した要約の列max_recom
でソートする:
Rの文字列処理機能
nchar()
で文字ベクトルの各要素の文字数を取得する:
grep()
かregexpr()
で文字ベクトル中のパターンを検索する。関数grep(pattern, x)
は、pattern
にマッチするベクトルx
の全要素の番号を返す:
match()
と同様、grep()
で一貫性のない染色体名のベクトルから6番染色体のエントリを抽出する:
Rの正規表現については help(regex)
grep()
と異なり、regexpr(pattern, text)
は、ベクトルtext
の各要素でpattern
にマッチした位置を返し、マッチしない場合には-1を返す:
返り値 5 は該当文字列の第5文字目以降にマッチしたことを示す。属性(attributes)"match.length"の値 2 は2文字分マッチしたことを示す。
substr(x, start, stop)
は文字列x
のstart
とstop
の間の文字を返す。
sub(pattern, replacement, x)
は文字ベクトルx
の各要素で最初に出現したpattern
をreplacement
で置換する:
いくつかの簡単な例:
paste()
関数は、文字列を結合する:
sub()
とstrsplit()
を組み合わせる:
strsplit(x, split)
は、文字列x
をsplit
で分割する:
1:length(x) の代わりに seq_along(x) を使うと良いってごみ箱が言ってた - My Life as a Mock Quant
ifelse
関数:
Rスクリプトを用いた作業
スクリプトでは、作業ディレクトリを設定するsetwd()
を使用しない。(同じディレクトリ構造を持っていない)他のシステムへの移植性が無くなるので。同じ理由で、データを読み込む時には、絶対パス(例 /Users/jlebowski/data/achievers.txt
)ではなく、相対パス(例 data/achievers.txt
)を使う。また、ユーザー向けに(コメントやREADMEファイルで)作業ディレクトリを指定するのが良い。
関数source()
を用いて、Rスクリプトを実行する:
コマンドラインからバッチモードでRスクリプトを実行する:
コマンドライン引数を出力するRスクリプト:
を実行する:
Rmarkdown
:
Rのバージョンとパッケージを確認:
sessionInfo()
複数のファイルを読み込み、統合する。
hotspots/ディレクトリ:
Rの関数list.files()
を用いて、ファイル名を取得する:
lapply()
関数で各ファイルを読み込む:
ファイル名(フルパスなし)を用いて、各リストの要素に名前を付ける:
do.call()
とrbind
を用いて、このデータをマージする:
我々のloadFile
関数を変更して、データに適用する:
basename()
関数でファイルパスからファイル名を取得:
染色体ファイル毎にホットスポットの数と平均長を求める関数を作成して、実行する:
このデータを1つのデータフレームにマージする:
lapply()
をmclapply()
で置き換えることにより、データ処理を並列化できる。
データフレームmtfs
を hot‐spot_motifs.txt という名前のタブ区切りファイルに書く:
gzip圧縮をかけて出力する:
serialization
Rオブジェクトを保存・復元する関数はsave()
とload()
save
, save.image()
, savehistory()
第9章. 範囲データの操作
第10章. 配列データの操作
FASTA
FASTA形式ファイルは、">"で始まるコメント行と、配列データが記述される。
一般的な命名規則は、コメント行をスペースで2つの部分(IDと説明)に分割する:
Fastq
NGS Surfer's Wiki | FASTQ
FASTQファイルは、以下のようなものである:
FASTQファイル内では、1本の配列は4行で記述される。
1行目:文字「@」で始まり、配列のID(オプションとして説明)を記述する。
2行目:塩基配列
3行目:文字「+」
4行目:クオリティ値 quality score(2行目の配列と同じ文字数でなければならない。ASCIIコードで表現される)
FASTA/FASTQエントリの計数
@は、クオリティ値として行頭にくることもある。
配列数を計数する頑強な方法は
bioawk
を用いる:
核酸コード
A、T、C、Gは、ヌクレオチドのアデニン、チミン、シトシン、グアニンを表す。
Table 10-1. Nucleotide base codes (IUPAC)
塩基のクオリティ値 quality scoreは、ASCIIコードで表現される。man ascii
ASCIIコードを変換する関数(整数から1文字へ、1文字から整数へ)。Pythonの関数ord()
とchr()
。例えば、chr(97)
は文字列 'a' を返し、ord('a')
は整数 97 を返す。2. 組み込み関数 — Python 2.7ja1 documentation
Rにqrqc
をインストール:
sickle
とseqtk
をHomebrewを用いてMac OS Xにインストール:
FASTQファイル untreated1_chr4.fq をトリムする:
これらの結果をRで比較する。qrqc
を用いて位置毎のクオリティの分布を収集し、ggplot2
を用いて可視化する。lapply
で自動化する。
このRスクリプトは2つのプロット(Figures 10-1と10-2)を作成する。
FASTA/FASTQのパースには既存のライブラリを使うのがベスト。
readfqのPythonスクリプト(readfq.py)をダウンロードする。
from readfq import readfq
Samtoolsのfaidx
サブコマンドを用いて、FASTAファイルのインデックスを作成する:
インデックス・ファイル(Mus_musculus.GRCm38.75.dna.chromosome.8.fa.fai)が作成される。
特定の領域の部分配列にアクセスするには、samtools faidx <in.fa> <region>
を実行する。ここで、<in.fa>
は(インデックスを作成した)FASTAファイル、<region>
はchromosome:start-end
の形式。例えば:
第11章. アライメントデータの操作
メタデータ
samtools
samtools view -H
でSAM/BAMヘッダ全体を見る :
引数なしのsamtools view
は、ヘッダなしでアラインメント全体を返す:
SAMファイルのアラインメント部分は11フィールド以上から成る。
第12章. バイオインフォマティクスのシェルスクリプト、パイプライン、タスクの並列化
頑強で再現可能なパイプラインを構築する
template.sh 頑強なBashスクリプトのヘッダ:
- 1行目:shebangは、スクリプトを実行するインタプリタを指定する。
- 2行目:
set -e
は、異常終了時(非ゼロ終了ステータス)スクリプトを終了させる。 - 3行目:
set -u
は、変数の値が設定されていない場合にスクリプトを終了させる。echo "rm $NOTSET/blah"
- 4行目:
set -o pipefail
は、パイプで繋いだコマンドの何れかが非ゼロ終了ステータスを返したら、スクリプトを終了させる。
短縮してset -euo pipefail
と書ける。
Bashスクリプトを実行する方法:
bash
プログラムを用いる:bash script.sh
- プログラムとしてスクリプトを呼び出す:
./script.sh
chmod
コマンドでファイルの所有者(u
)に実行権限を追加する(+x
):chmod u+x script.sh
変数に値を割り当てる(=
の前後にスペースを入れない):
変数の値にアクセスするためには、変数名の前にドル記号を付ける(例 $results_dir
):
中括弧{}
で変数名を囲む:
ダブルクォーテーション""
で変数を囲む:
コマンドライン引数は、$1, $2, $3, ...
に割り当てられる。変数$0
はスクリプト名を格納する。
このファイルを実行すると、割り当てられた引数($0, $1, $2, $3
)を出力する:
変数$#
にはコマンドライン引数の個数を割り当てる(スクリプト名$0
は引数としてカウントしない):
3未満の引数を指定して、このスクリプトを実行するとエラーになる(非ゼロ終了ステータス):
Pythonのargparse
モジュールは、Unixツールgetopt
よりも簡単に使える。
export
コマンドで環境変数
なお、some_var=3
で変数を作成するスクリプトを実行しても、現在のシェルにsome_var
は作成されない。
bashの条件文:if文
Bashでは、コマンドの終了ステータスが 真/成功 true/success (0) と 偽/失敗 false/failure (1) を与える。
if
文の基本構文:
例えば、特定の文字列がファイルに含まれる(grep
で"pattern"に一致する)場合にのみコマンドを実行する:
if
文で&&
(論理積AND)や||
(論理和OR)演算子を用いる:
!
で終了ステータスを否定する:
test
コマンドの実行例(echo "$?"
で終了ステータスを出力):
Table 12-1. 文字列と整数の比較演算子
Table 12-2. ファイルとディレクトリのテスト式
if test -f some_file.txt
をif [ -f some_file.txt ]
で代用できる。角括弧[ ]
の前後に半角スペースが必要。
この構文では、-a
(論理積AND)、-o
(論理和OR)、!
(否定)を使える。&&
と||
演算子はtest
では使えない。
例として、スクリプトが十分な引数を持ち、入力ファイルが読み込み可能であることを確認する:
短絡評価(short-circuit evaluation)
for文とglobでファイル処理
bash 配列、要素、添字
コマンド置換 (command substitution)
sample_files=($(cut -f 3 samples.txt))
Internal Field Separator (IFS)の値を調べる: printf %q "$IFS"
Unixプログラムbasename
は、ファイル名からパスや拡張子を削除する:
処理スクリプト:
最後に、ループで簡単に:
ls
とは異なり、find
は再帰的に検索する。
find
でプロジェクト・ディレクトリの構造を見る:
find
の基本構文は、find path expression
Example 12-1. ファイル名の一致で検索
(名前が一致するディレクトリではなく)FASTQファイルのみを返すようにしたいので、-type
オプションで結果を制限する(f
はファイル、d
ディレクトリ、l
はリンク):
AND(-and
):
OR(-or
):
Table 12-3. findの判別式と演算子
NOT(-not
または!
):
seqs/zmaysB_R1-temp.fastq
ファイルを作成:
find
でマッチしたファイルを-exec command ;
で処理する。rm -i
でファイルの削除時に問い合わせを行う。
-delete
オプション
ファイル名には、英数字かアンダースコアかダッシュを使い、スペースや他の特殊文字を使わない。
xargs -n
で、コマンドライン1つにつき使用する引数の個数を指定:
rm
を実行する前に、find
が返すファイルを確認する:
xargs
を用いてコマンドを書いたスクリプトを作成し、確認してから実行する:
あるプログラムはオプションで引数を取る(例 program --in file.txt --out-file out.txt
)、別のプログラムは位置指定引数を取る(例 program arg1 arg2
)。xargs
の-I{}
オプション
Mac OS Xでは、Homebrewを用いて、GNU Coreutilsをインストール
xargs
のオプション-P <num>
で、プロセスまで同時に実行する
このスクリプトを実行する:
find . -name "*.fastq" | xargs -n 1 -P 4 bash script.sh
ここで、-n 1
はコマンドライン1つにつき最大1個の引数を使用することを意味し、-P
オプションで同時に実行するプロセスの個数を指定できる(0ならできるだけ多くのプロセスを同時に実行しようとする)。
宣言型プログラミング(英: Declarative programming)
各ルールは3つのパート(ターゲット、必要条件、レシピ)を持つ。
Makefile
をmake all
で実行する
第13章. TabixとSQLite
BGZF (Blocked GNU Zip Format)
bgzip
とtabix
プログラムは、Samtools (例 samtools-1.2/htslib-1.2.1) に含まれている。
ファイルの先頭にメタデータのヘッダがある。
サブシェルを使う。gzip
の代わりにbgzip
で:
tabix
の-p
引数を用いて、bgzip
で圧縮されたGTFファイルにインデックスを張る:
インデックスファイルの拡張子は*.tbi*:
例えば、Mus_musculus.GRCm38.75.gtf.bgz の16番染色体上の23,146,536(開始位置)から23,158,028(終了位置)までのフィーチャーにアクセスする:
このコマンドの標準出力をパイプでawkに渡し、列featureが「exon」の行を抽出する:
flat file フラットファイル形式。Unixツールのjoin
やR言語のmatch()
やmerge()
関数を用いてテーブルを結合できる。relational databases 関係データベース。
SQL (Structured Query Language)。
relational database management system (RDBMS) 関係データベース管理システムのSQLite。
Homebrew(brew install sqlite
)でMac OS Xにインストール、またはapt-get install sqlite3
でUbuntuマシンにインストール。
SQLiteのコマンドラインツールsqlite3
を用いて、データベースgwascat.dbファイルに接続すると、対話的(インタラクティブ)なSQLiteプロンプトが出る:
ドット・コマンドは.で始まる(空白で始めることはできない)。
Table 13-1. SQLite3のドットコマンド
SQLiteでは、列は型を持たないが、データ値は型を持つ。データ値は5タイプの何れか: text、integer、real、NULL、BLOB(binary large object)
SELECT文を用いて、テーブルの全ての列から全ての行を取得する:
Control-u で、入力をクリアする。
sqlite3のコマンドラインツールは、(対話的なSQLiteのシェル代わりに)直接コマンドラインから問い合わせ可能。例えば、gwascat
テーブル内の全てのデータを取得する:
列の分離形式(オプション-separatorに、CSVは","を、タブは"\t"を指定)や、列ヘッダの表示(-header)・省略(-noheader)を変更:
カンマ区切りで一部の列(trait, chrom, position, strongest_risk_snp, pvalue)を指定:
SQLiteの設定を変更:
SELECTが返す行はソートされていない。例えば、著者の姓(author)でソートして、研究に関連する列(author、trait、journal)を表示する:
ORDER BY句にDESCを追加すると、降順で結果を返す:
SQLiteの列は厳格な型を持たない。データ値の型が混在する列に、ORDER BYを使うと、次の順に従う。NULL値 > 整数と実数の値(数値でソート) > テキスト値 > BLOB値。ソートすると、NULL値が常に最初にくる。p値で昇順ソートして確認:
第8章で議論したように、データを並べ替えて異常値を探すことは、データの問題を探す有効な方法である。例えば、p値(0〜1の範囲を示す確率)を降順にソートして確認:
2つの誤ったp値はデータ入力ミス。p値を入力するときにマイナス記号を忘れる(例えば、9e-7 を 9e7 と記載)。
WHERE句で特定の行を除外。例えば、strongest risk SNP = "rs429358"の行を表示:
大文字と小文字は区別される。比較の前にlower()関数で値を小文字に変換:
Table 13-2. WHERE句で使用される演算子
論理演算子AND
とOR
を用いて条件式を組み合わせる。例えば、例えば、第22染色体上でp-valueが10e-15未満の全ての行を取得:
WHERE pvalue IS NOT NULL
でNULL値を排除してから並べ替える:
OR
で何れかの条件を満たす行を選択する:
OR
と=
の代わりに、IN
(またはNOT IN
)を用いる:
The Human Genome Browser at UCSC
既存の列から新しい列を作成する。
||
は文字列を連結する演算子。
全てのNULL値をNAに置き換えるには、ifnull()関数を用いる:
Table 13-3. SQLiteの関数
- count関数 - SQLite入門
引数にはカラム名または「*」を指定。カラム名を指定した場合にはカラムに含まれる値の中でNULLのカラムを除いた行数を返す。「*」を指定した場合には行数を返す。
Table 13-4. SQLiteの集計関数
YYYY-MM-DD
。xkcd: ISO 8601
オンライン教材
- ドットインストール - 3分動画でマスターする初心者向けプログラミング学習サイト
- UNIXコマンド辞典
- UNIXの部屋
- UNIX - 会津大学UNIXウィキ
- Linuxコマンド集:ITpro
- Linuxコマンド集 - Linux入門 - Webkaru