The Cat Way

Better be the head of a cat than the tail of a lion.

Convert EnsEMBL Gene ID to NCBI Entrez Gene ID in R

| Comments

R で EnsEMBL Gene ID を NCBI Entrez Gene ID へ変換する。

org.Mm.eg.db というアノテーションパッケージを利用する。Bioconductor のアノテーションパッケージは、AnnDbBimap オブジェクトになっている。これはID変換のテーブルを 1:1 で扱うオブジェクトで、これを操作してIDを変換する。

いや別に Mm じゃなくてもいいし、EnsEMBL じゃなくても共通する話です、はい。

まず、この AnnDbBimap をベクターにしてから変換してみる。

1
2
3
4
5
6
7
8
library("org.Mm.eg.db")                                                        
my.ensmusg <- c("ENSMUSG00000000275", "ENSMUSG00000002844", "ENSMUSG00000003868", "ENSMUSG00000091821")
ensmusg <- unlist(as.list(org.Mm.egENSEMBL2EG))
# convert EnsMUSG -> Entrez Gene ID                                                                      
my.eg <- ensmusg[my.ensmusg] 
my.eg
ENSMUSG00000000275 ENSMUSG00000002844 ENSMUSG00000003868               <NA> 
          "217069"            "11544"            "20174"                 NA 

最後のIDが複数の Entrez ID に対応しているので、変換がうまくいっていない。これは、単に操作ミスによって対応のつくIDが少なくなり、その後の解析結果に影響を及ぼす可能性が高いのでよろしくない。

次は、mget を利用して、AnnDbBimap オブジェクトを直接検索してみる。

1
2
3
4
5
6
7
8
9
10
11
12
13
my.eg2 <- mget(my.ensmusg, org.Mm.egENSEMBL2EG)
R> my.eg2
$ENSMUSG00000000275
[1] "217069"
$ENSMUSG00000002844
[1] "11544"

$ENSMUSG00000003868
[1] "20174"

$ENSMUSG00000091821
 [1] "100151772" "100502688" "100502744" "100502884" "100502947" "100502996"
 [7] "100503346" "100503401" "100503451" "100504531" "100504596" "100504635"

この方法だと、list でデータが返ってくるので 1:n の対応でも正しくデータを得ることができる。AnnDbBimap はいわゆる環境のようなものなので、exists, ls, eapply なども使える。Rの環境についてはこちらの資料を。

ただし、これを vector に変換するとえらいことになる。

1
2
3
4
5
6
7
8
9
10
11
R> unlist(my.eg2)
  ENSMUSG00000000275   ENSMUSG00000002844   ENSMUSG00000003868 
            "217069"              "11544"              "20174" 
 ENSMUSG000000918211  ENSMUSG000000918212  ENSMUSG000000918213 
         "100151772"          "100502688"          "100502744" 
 ENSMUSG000000918214  ENSMUSG000000918215  ENSMUSG000000918216 
         "100502884"          "100502947"          "100502996" 
 ENSMUSG000000918217  ENSMUSG000000918218  ENSMUSG000000918219 
         "100503346"          "100503401"          "100503451" 
ENSMUSG0000009182110 ENSMUSG0000009182111 ENSMUSG0000009182112 
         "100504531"          "100504596"          "100504635" 

4つ目の EnsEMBL Gene ID は ENSMUSG00000091821 で複数の Entrez Gene ID に対応しているが、リストの要素名が勝手にインクリメントされている。ENSMUSG000000918211, ENSMUSG000000918212, …

これは list の要素名がユニークでなければならないからであるが、これに気付かずに解析を進めてしまうと、EnsEMBLに実在しないIDを含んだまま解析するにことにあるので注意が必要である。

これを data frame や matrix にするとどうなるか?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
R> as.matrix(my.eg2)
                   [,1]        
ENSMUSG00000000275 "217069"    
ENSMUSG00000002844 "11544"     
ENSMUSG00000003868 "20174"     
ENSMUSG00000091821 Character,12
R> as.data.frame(my.eg2)
   ENSMUSG00000000275 ENSMUSG00000002844 ENSMUSG00000003868 ENSMUSG00000091821
1              217069              11544              20174          100151772
2              217069              11544              20174          100502688
3              217069              11544              20174          100502744
4              217069              11544              20174          100502884
5              217069              11544              20174          100502947
6              217069              11544              20174          100502996
7              217069              11544              20174          100503346
8              217069              11544              20174          100503401
9              217069              11544              20174          100503451
10             217069              11544              20174          100504531
11             217069              11544              20174          100504596
12             217069              11544              20174          100504635

結論としては list のまま扱うのがよい、ということになるだろう。

ID変換は、解析中のミスが入りやすいところなので、なるべくID空間を変更しなくてよいように、最初によく考えて選択するのが大切だと思う。RNA-seq の場合などはリファレンスのトランスクリプトームの選択と同義である。

さて、mget の話に戻る。

mget は一致しないIDがあった場合、エラーを出して止まってしまう。大人しく、NA にしてほしいものだ。これを解決するには、exists で先に存在を確認しておくのがよさそう。

1
2
3
4
5
6
7
8
9
10
11
R> my.ensmusg <- c("ENSMUSG00000000275", "ENSMUSG00000002844", "ENSMUSG00000003868", "ENSMUSG00000091821", "HOGE")
R> a <- sapply(my.ensmusg, function(x) exists(x, org.Mm.egENSEMBL2EG))
a
ENSMUSG00000000275 ENSMUSG00000002844 ENSMUSG00000003868 ENSMUSG00000091821 
              TRUE               TRUE               TRUE               TRUE 
              HOGE 
             FALSE 
R> my.ensmusg.existed <- my.ensmusg[a]
my.ensmusg.existed
[1] "ENSMUSG00000000275" "ENSMUSG00000002844" "ENSMUSG00000003868"
[4] "ENSMUSG00000091821"

Setup Homebrew and Ruby on Mountain Lion

| Comments

Mac OS X Mountain Lion の Ruby, JRuby 環境を作るために、Homebrew と RVM を使うことにした。MacPorts も試したがうまくいかず。

まずは、Xcode を起動しメニューから commandline tool をインストールしておく。

MacPorts をアンインストール

1
2
sudo port -fp uninstall installed
rm -rf /opt/local

Homebrew のインストール

1
2
ruby <(curl -fsSkL raw.github.com/mxcl/homebrew/go)
brew doctor

いくつか修正すべき設定が表示される。例えば、PATH で指定していたディレクトリの最後に / が存在するものがあったのでこれを修正したり、$DYLD_LIBRARY_PATH に使っていない存在しない path あったのでこれを削除したり。

次に GCC をインストール

1
2
brew tap homebrew/dupes
brew install apple-gcc42

.zshrc に

1
export CC=/usr/local/bin/gcc-4.2

を追記して、alias をつくる。

1
sudo ln -s /usr/local/bin/gcc-4.2 /usr/bin/gcc-4.2

rvm をインストールする。

1
curl -L https://get.rvm.io | bash -s stable --ruby

これで 1.9.3 と 1.8系がインストールされるはず。MacPorts の場合はここでコケた。

JRuby もなんなくインストールできた。以前に、java -version として表示されるダイアログに答えて Java を使えるようにしておくこと。

1
rvm install jruby-head

Setup CoffeeScript

| Comments

CoffeeScript をインストールしてセットアップするまで。

まずJavaScript (JS) のサーバサイドの実行環境である Node.js を入れる。Mac は dmg があるのでインストーラに従うだけ。

1
2
curl -O http://nodejs.org/dist/v0.8.9/node-v0.8.9.pkg
open node-v0.8.9.pkg

/usr/local/bin にインストールされる。path が通っていることが全体で、CoffeeScript を入れる。npm というパッケージマネジャを使う。

1
2
sudo npm install -g coffee-script
rehash

起動する。

1
coffee

試しに Read–eval–print loop (REPL) を使ってコードを書いてみる。

1
2
3
4
coffee> console.log "Dear my brother!"
console.log "Dear my brother!"
Dear my Brother!
undefined

ファイルにスクリプトを書いて実行。ファイル名は、mysister.coffee とする。

1
console.log "Dear my brother!"
1
coffee mysister.coffee

コードをJSにコンパイル。

1
coffee -c mysister.coffee

mysister.js ができる。中身は、

1
2
3
4
5
6
// Generated by CoffeeScript 1.3.3
(function() {

  console.log("Dear my brother!");

}).call(this);

これを Node.js で実行してみる。

1
node mysister.js

Rails でウェブアプリを作っていると、Ruby より JS を書いている時間のほうが長い気がしてきた。

参考:

Bioconductor AnnotationData Package

| Comments

バイオインフォマティクスの解析ではデータベースが必要になる場面が多々ある。そのため、Bioconductor のパッケージは、新しい機能を提供する software package とデータベースを提供する AnnotationData package に分けられている。

この作りかたについてここ数日調べてきたのでメモを残しておく。メモっていうか、もうぼやきっぽいだが。

AnnotationData package は AnnotationDbi package で作られており、データベースの操作についてもこのパッケージを利用するが、2.11 では、操作の部分とパッケージ作成の部分が切り分けられる予定で、後者は、AnnotationForge というパッケージになる。これは正しい判断だと思う。

しかし、これに付属しているドキュメントの通りにやっても作れない。メーリングリストでも7月頃に同じ質問があるが、まだ直っていない模様。R-devel (2.16) + BioC-devel (2.11) の組み合わせはもちろん、R 2.15.1 + BioC 2.10 + AnntationDbi の組み合わせでも無理。Marc さんに問い合わせ中。

パッケージ作成の基本的なアイディアは、

  1. パッケージの構造のディレクトリを、テンプレートにして持っているので、それをコピーする
  2. 組み込み型の RDBMS である SQLite3 にデータを持つので、スキーマを自作し、データをロードしておく
  3. これを配置して、R で使いやすくするために、AnnDbBimap オブジェクトとして読みこめるようなクラスを定義。これは ID の対応を 1:1 にして R からアクセスしやすくしたもの。
  4. パッケージング。普通に R CMD check/build/install する。

となっている。

モデル生物やマイクロアレイであることが前提であれば、データベーススキーマや AnnDbBimap class がすでに定義されていて、パッケージ作成のための一連の関数も用意されており (これをSQLforge (pdf) と呼んでいる)、これを使うことが強く推奨さている。これに関してはドキュメント通りにやれば、作ることはできた。

しかし、スキーマとDBを自作しようとすると、chip の要領でやろうとすれば、ID を Entrez Gene ID にできないし、モデル生物のスキーマだと、オリジナルのテーブルを付加することができない。どうしろと。

今回は、RSQLite を使って、データベース操作関連のクラスを定義してパッケージングしてみた。こちらのほうがずいぶん楽であるが、同じような生物種でいくつもパッケージを作成したときは、DBI の部分は外に括り出したい。これをやりはじめると、結局、AnnotationDbi みたいなものを再発明することになる。これは避けたいよね。バックエンドを SQLite じゃなくて、ff や bigmemory あるいは、NoSQL DB にするなど、なにか新しいことがあれば、面白いかもしれないが。

なんだか、いろいろ面倒なので、ウェブ上に、データをクエリするとJSON 返すウェブサービスを作ったほうがよいのではないかと持ったぐらいには、ハマったわ。

Install Tmux on Linux/Mac

| Comments

GNU screen がしばしばハングアップするので、tmux を試してみる。環境は CentOS のなんか古いやつ。もちろん、yum とかつかえないのでソースからいれる。

インストール

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
wget --no-check-certificate https://github.com/downloads/libevent/libevent/libevent-2.0.20-stable.tar.gz
tar zxvf libevent-2.0.20-stable.tar.gz
cd libevent-2.0.20-stable/
./configure --prefix=/opt/local
make
sudo make install
sudo /sbin/ldconfig
cd ..

wget ftp://invisible-island.net/ncurses/ncurses.tar.gz
tar zxvf ncurses.tar.gz
cd ncurses-5.9/
./configure --prefix=/opt/local
make
sudo make install
cd ..

wget "http://downloads.sourceforge.net/project/tmux/tmux/tmux-1.6/tmux-1.6.tar.gz"
tar zxvf tmux-1.6.tar.gz
cd tmux-1.6/
./configure --prefix=/opt/local CFLAGS="-I/opt/local/include" LDFLAGS="-L/opt/local/lib"
make
sudo make install

Mac OS X (Lion) + MacPorts なら

1
2
sudo port install tmux
sudo port install tmux-pasteboard  # Mac のクリップボードと連携

するだけ。

設定

~/.tmux.conf を作る。最後の行は Mac だけ必要。C-b を C-t にしておく。こうしないと tmux の中で emacs を起動したときにキーバインドがバッティングするから。

1
2
3
4
5
set-option default-shell /bin/zsh
unbind-key C-b
set-option -g prefix C-t
bind-key C-t send-prefix
set-option -g default-command "reattach-to-user-namespace -l zsh" # Mac だけこの行を入れておく

使い方

screen と違うところだけ覚える。

起動する

1
tmux

とする。

attach する

1
tmux attach

セッションリストを表示する

1
tmux list-session

attach しているクライアントを見る

1
tmux list-client

window のリストをみる。ウィンドウはセッションのなかで開かれているウィンドウのこと。

1
tmux list-window

以下は、C-b は C-t に変更しているので、適宜読み替えること。まず、ウィンドウはペインをつかって分割できる。

1
2
tmux split-window    # 上下 C-b "
tmux split-window -h # 左右 C-b %

C-b q するとペインインジケータが表示されるのが便利。C-b o でペイン移動。C-b M Up/down でペインサイズを変更できる。ペインの破棄は、C-b x.

コピペは、C-b [ でコピーモードにはいって、C-b ] でペースト。領域の選択などは、emacs と同じ。Linux にログインしてMac側のクリップボードにいれる方法がわからない。ペインがあるとうまくいかない。誰か教えて。

ウィンドウ名変更は “,”, ウィンドウリストは、”w”. 変なところだと、”t” で時計表示できて、q で終了する。

最初からそこそこ使えるレベルの設定になっているのがよいな。結構、快適なのでしばらく tmux に乗り換えてみる。

参考

Octopress on Amazon EC2

| Comments

Amazon EC2 で Octopress

Github Pages だと、deploy した後にページが更新されるまでタイムラグがある。これは、講義資料のように何度も書き直すようなサイトの運営には非常につらい。heroku やら、S3 での公開も考えたか、結局使いなれた、EC2 micro instance で公開するのが一番楽だった。

手順としては、Ubuntu の micro instance を起動して、Elastic IP で固定IPを振り、その IP を DNS に設定する。key pair の秘密鍵を hoge.pem すると、

1
2
chmod 400 ~/hoge.pem
ssh -i ~/hoge.pem ubuntu@X.X.X.X

ログインしたら

1
2
3
4
5
6
sudo apt-get update
sudo apt-get upgrade

sudo apt-get apache2
sudo /etc/init.d/apache2 start
sudo chown -R ubuntu /var/www

とする。

octopress の Rakefile に以下を加える。

1
2
3
4
5
6
7
8
9
### Deploy EC2
ec2 = 'ubuntu@X.X.X.X:/var/www'
ec2_secret_key = '/Users/hoge/hoge.pem'

desc "Deploy Amazon EC2 server"
task :ec2 do
  cmd = "rsync --delete -avz -e 'ssh -i #{ec2_secret_key}' public/ #{ec2}"
  sh cmd
end

あとは、いつも通りに記事を書いたら、rake deploy のかわりに

1
2
rake generate
rake ec2

とするだけ。

How to Change Key Bindings in the RStudio Console

| Comments

RStudio のキーバインドを変える。ただし、Mac で。

統計解析環境R、最強のGUI環境 RStudio を愛用しつつある。ほぼ emacs like な key binding にはなっているが、console でのコマンド履歴がカーソルの上下に設定されている。これだとホームポジションから手が離れるし、HHK Pro2 とかだとしんどい。これを Control + P, Control + N にそれぞれ割り当てたい。

そこで、KeyRemap4Mac でキーバインドを設定してみた。やりかたは、KeyRemap4Mac をインストールして、メニューバーから設定画面に入る。”Misc & Uninstall” を選び、”Custom Setting” の “Open private.xml” を開く。これを適当なエディタで開いて、以下のようにする。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?xml version="1.0"?>
<root>
  <appdef>
      <appname>RSTUDIO</appname>
      <equal>org.rstudio.RStudio</equal>
  </appdef>
  <item>
      <name>RSTUDIO</name>
      <list>
          <item>
              <name>Change Ctrl+P to Up-Arrow</name>
              <appendix>(only in RStudio)</appendix>
                <identifier>private.RStdio_control_p_up_arrow</identifier>
                <only>RSTUDIO</only>
                <autogen>--KeyToKey-- KeyCode::P, ModifierFlag::CONTROL_L, KeyCode::CURSOR_UP</autogen>
            </item>
          <item>
              <name>Change Ctrl+N to Down-Arrow</name>
              <appendix>(only in RStudio)</appendix>
                <identifier>private.RStdio_control_p_down_arrow</identifier>
                <only>RSTUDIO</only>
                <autogen>--KeyToKey-- KeyCode::N, ModifierFlag::CONTROL_L, KeyCode::CURSOR_DOWN</autogen>
            </item>
        </list>
    </item>
</root>

そして、KeyRemap4MacBook の設定画面に戻って、”Change Key” を選択、画面右上の “ReloadXML” をクリックすると、以下のようになる。

R studio のキーバインドを変更する

ふたつともチェックして、RStudio の console で適当なコマンド入力して、Control + P, N してみると、ちゃんと履歴が表示される。めちゃくちゃ快適。@ma_ko さんくす

参考:

How to Install Octopress on Your Github Pages

| Comments

Octopress を GitHub Pages にインストールして設定するまでのメモ

準備

GitHub, git, Ruby 1.9.3, rvm を用意する。GitHub の username は dritoshi. 必要に応じて、Google アナリティクスのトラッキングID, disqus.com のアカウント、独自ドメインの設定に必要な情報を用意しておく。

GitHub の準備

1
2
3
4
5
6
7
8
mkdir dritoshi.github.com
cd dritoshi.github.com
touch README.md
git init
git add *
git commit -m 'first commit'
git remote add origin git@github.com:dritoshi/dritoshi.github.com.git
$ git push -u origin master

Octopress のインストール

ひと階層上の octopress ディレクトリにインストールする。

1
2
3
4
5
6
cd ..
git clone git://github.com/imathis/octopress.git octopress
cd octopress
sudo gem install bundler
bundle install
rake install

GitHub へインストールする

1
rake setup_github_pages

Octopress の設定

各種機能

1
subl _config.yml

Google アナリティクスのコード、G+ のアカウントID (URLに含まれる数字の列) などを用意しておき、_config.yml に反映させておく。コメントを有効にするためには、(disqus)[disqus.com] にアカウントを作成し、プログを登録しておく (独自ドメインを利用する場合はそちらを先に設定しておく)。自分で設定したプログの short name が必要になる。アカウントIDではない。

サイドバーに About me を表示するには、source/custom/asides/about.html を編集して、_config.yml の default_asides にファイル名を指定する。

テーマ

テーマを変えるには、github で配布されているテーマを探してきて、

1
2
3
git clone http://github.com/iwinux/compbits .themes/compbits 
rake install\['compbits'\] # zsh はエスケープ
rake generate

とする。

参考: List Of Octopress Themes

独自ドメイン

独自ドメインを設置するには、ドメインの設定をCNAME を設定して、

1
2
echo 'cat.hackingisbelieving.org' > source/CNAME
rake gen_deploy

Google Apps で取得したドメイン名は、コントロールパネルの Domain settings, Adovanced DNA settings で発行される ドメイン管理会社のアカウントIDとパスワードを使って設定する。 https://www.google.com/a/cpanel/hackingisbelieving.org/DomainSettingsAdvancedDns

参考: Octopressのインストールから運用管理まで

How to Write a New Entry

| Comments

Blog entry の場合

Markdown ファイルの生成

1
2
cd /Users/itoshi/Projects/writing/octopress
rake new_post\['How to write a new entry'\] # zsh はエスケープが必要

執筆

Sublime text 2 でエントリを執筆する。もちろん事前に sublime text 2 のコマンドを path に通しておく。

1
ln -s /Applications/Sublime\ Text\ 2.app/Contents/SharedSupport/bin/subl ~/opt/bin/subl
1
subl source/_posts/2012-08-14-how-to-write-a-new-entry.markdown

Markdown の書きかたは、Links にある。

HTMLの生成とプレビュー

まず始めに以下のようにする

1
2
rake generate
rake preview

http://localhost:4000/ にブラウザでアクセスしてプレビューを確認する。

その後は、書くたびにブラウザをリドードすればよい。

デプロイ

github page 上の Octopress にデプロイする。

1
rake gen_deploy

generate と deploy の両方を同時におこなうコマンド。generate し忘れがないように、これを使っている。

ページの場合

基本的には上の流れてほぼ同じ。最初のページ生成コマンドが違う。

1
2
cd /Users/itoshi/Projects/writing/octopress
rake new_page\['How to write a new entry'\] # zsh はエスケープが必要

生成されるファイルは、source/how-to-write-a-new-entry/index.markdown のようになる。

ナビゲーションバーに表示させるには、source/_includes/custom/navigation.html を編集する。

HTML生成やプレビュー、デプロイの流れは blog entry とまったく同じ。

R Markdown With Octopress on Your GitHub

| Comments

R Markdown を GitHub Pages 上の Octopres にアップロートする方法についてメモしておく。

準備

Knitr の設定済みの状態からスタートする。RStudio 入れればそれでおしまい。次に Octopress の準備。これ読むひとはもう終わっているだろうから飛す。

Rmdを変換する関数は以下の通り。関数名が無駄に長い。

1
2
3
4
5
6
7
8
9
10
11
12
13
Rmd2md.for.octopress <- function(input, base.url = "/") {
    require(knitr)

    opts_knit$set(base.url = base.url)
    fig.path <- paste0("images/", sub(".Rmd$", "", basename(input)), "/")
    output   <- sub(".Rmd", ".markdown", input)

    opts_chunk$set(fig.path = fig.path)
    opts_chunk$set(fig.cap = "center")

    render_jekyll()
    knit(input, output = output, envir = parent.frame())
}

knit() ではなく、この関数を使うのは画像のパスをよきにはからうため。これを、~/.Rprofile あたりに書いておく。これで準備終了。

ここを参考にした。 http://jfisher-usgs.github.com/r/2012/07/03/knitr-jekyll/ ほかにも、Octpress のディレクトリを指定できると以下のステップが省けてよいかも。

R Markdown を書く

ファイル名を yyyy-mm-dd-file-name.Rmd として RStudio やらなにやらで R Markdown のファイルを作成する。次に、生成されたファイルの先頭に、Octopress 用のヘッダを挿入する。

1
2
3
4
5
6
7
---
layout: post
title: "R Markdown with Octopress"
date: 2012-08-13 19:12
comments: true
categories: 
---

みたいな感じ。ブログエントリではなくて、page を作りたい場合は、

1
2
3
4
5
6
7
8
---
layout: page
title: "R Markdown with Octopress"
date: 2012-08-13 18:00
comments: true
sharing: true
footer: true
---

とする。

あとはひたすら書く。

Octopress 用の Markdown へ変換する

R を起動して、Markdown へ変換する。

1
Rmd2md.for.octopress("yyyy-mm-dd.Rmd")

公開する

変換したファイルを Octopress のディレクトリにコピーする。画像もコピーする。

1
2
cp yyyy-mm-dd-file-name.Rmd $OCTPRESS_HOME/source/_posts/
cp -a yyyy-mm-dd-file-name $OCTPRESS_HOME/source/images/

静的HTMLを生成して、preview したり、github へデプロイしたり。

1
2
3
4
cd $OCTPRESS_HOME
rake generate
rake preview
rake gen_deploy