Ruby から BioMart を使ってみる

# BioMartとは
BioMart とは、統一されたインターフェースで様々な生命科学のデータベースからデータを検索できる仕組みでだそうです。Ruby から BioMart にアクセスできるGemがあるか探してみたら、ありました。

# biomart の Gem を使ってみる

dazoakley/biomart
https://github.com/dazoakley/biomart

残念ながら2012年が最終更新となり、開発は終了しています。
README に掲載されているサンプルコードは、リンク切れのためか私の環境では動きません。
しかし、url を指定を新しいものに変更すれば動作します。

### インストールする
```terminal
gem install biomart
```

### 接続する

```ruby
require 'biomart'

biomart = Biomart::Server.new("http://asia.ensembl.org/biomart/martservice")
```

ちゃんと接続できているか確認しましょう。

```ruby
biomart.alive?
# => true
```

接続できていれば true が返されるようです。

### 利用可能なマートを選ぶ

マートのリストを表示させてみます。

```ruby
puts biomart.list_databases
```

次のようなリストが表示されます。

```terminal
ENSEMBL_MART_ENSEMBL
ENSEMBL_MART_MOUSE
ENSEMBL_MART_SEQUENCE
ENSEMBL_MART_ONTOLOGY
ENSEMBL_MART_GENOMIC
ENSEMBL_MART_SNP
ENSEMBL_MART_FUNCGEN
```
ここでは一番上の ENSEMBL_MART_ENSEMBL を選びます。

```ruby
mart = biomart.databases["ENSEMBL_MART_ENSEMBL"]
```

### リストからデータセットを選ぶ

データセットのリストを表示します。

```ruby
mart.list_datasets
```

大量に表示されてしまうので、目的のリストを検索します。ここではホモ・サピエンス、すなわち人間を検索してみます。こういうとき grep は便利です。

```ruby
mart.list_datasets.grep(/sapiens/)
# => ["hsapiens_gene_ensembl"]
```
人間を選択します。

```ruby
hsaset = mart.datasets["hsapiens_gene_ensembl"]
```

念のため接続が生きていることを確認しておきましょう。

```ruby
hsaset.alive?
# => true
```

接続できることが確認されました。

### アトリビュートや、フィルターのリストを列挙する

実際にデータベースに検索をするまえに、アトリビュートやリストを列挙して観察します。
コマンドラインから閲覧するのは、検索するのには便利です。
しかし一覧性が悪いと感じる場合は、本家のWebサイトから確認する方が効率がよいかもしれません。
http://asia.ensembl.org/biomart/martview

```ruby
# アトリビュートの一覧を列挙する
hsaset.list_attributes
# フィルターの一覧を列挙する
hsaset.list_filters
```
### 実際に使う
R で BioMart を使用する下記のサイトを参考にして、実際に検索してみます。
https://bi.biopapyrus.jp/rnaseq/annotation/r-biomart.html

いくつかの Ensembl ID から、染色体名、遺伝子の開始位置と終了位置を検索してみる。

```ruby
ensid = ["ENSG00000000003", "ENSG00000000457", "ENSG00000000938",
         "ENSG00000006327", "ENSG00000011405", "ENSG00000001497"]
```

検索する際には、filtersと、attributesを指定します。

```ruby
res = hsaset.search(
  filters: { "ensembl_gene_id" => ensid },
  attributes: ["ensembl_gene_id", "chromosome_name", "start_position", "end_position"]
)

pp res
```

こんな感じで検索結果が表示されれば成功です。

```terminal
{:headers=>
  ["ensembl_gene_id", "chromosome_name", "start_position", "end_position"],
 :data=>
  [["ENSG00000000003", "X", "100627109", "100639991"],
   ["ENSG00000000457", "1", "169849631", "169894267"],
   ["ENSG00000000938", "1", "27612064", "27635277"],
   ["ENSG00000001497", "X", "65512582", "65534775"],
   ["ENSG00000006327", "16", "3018445", "3022383"],
   ["ENSG00000011405", "11", "17077730", "17207983"]]}
```

### Ensembl ID から GO term を検索する
```ruby
res = hsaset.search(
  filters: { "ensembl_gene_id" => ensid },
  attributes: ["ensembl_gene_id", "go_id"]
)

pp res
```



```terminal
[["ENSG00000000003", "GO:0016020"],
 ["ENSG00000000003", "GO:0016021"],
 ["ENSG00000000003", "GO:0007166"],
 ["ENSG00000000003", "GO:0005887"],
 ["ENSG00000000003", "GO:0005515"],
 ["ENSG00000000003", "GO:0070062"],
 ["ENSG00000000003", "GO:0043123"],
 ["ENSG00000000003", "GO:0039532"],
 ["ENSG00000000003", "GO:1901223"],
 ["ENSG00000000003", nil],
 ["ENSG00000000457", "GO:0005737"],
 ["ENSG00000000457", "GO:0005524"],
 ["ENSG00000000457", "GO:0006468"],
 ["ENSG00000000457", "GO:0005794"],
 ["ENSG00000000457", "GO:0042995"],
 ["ENSG00000000457", "GO:0005515"],
 ["ENSG00000000457", "GO:0030027"],
 ["ENSG00000000457", "GO:0016477"],
 ["ENSG00000000457", "GO:0004672"],
 ["ENSG00000000457", nil],
 ["ENSG00000000938", "GO:0005737"],
 ["ENSG00000000938", "GO:0016020"]]
以下省略
```
nilが入ったりして、ちょっとあやしいところもありますが、R版のbiomaRtでやっても同じような感じになりますので、これでよいのでしょう。

### まとめ
Ruby を用いて BioMart を検索する方法を示しました。各種IDの変換などにご活用ください。


# 参考資料
R から BioMart を利用する方法
https://bi.biopapyrus.jp/rnaseq/annotation/r-biomart.html

biomaRt — プログラム的にデータ取得
https://heavywatal.github.io/rstats/biomart.html