BioMartとは
BioMart とは、統一されたインターフェースで様々な生命科学のデータベースからデータを検索できる仕組みでだそうです。Ruby から BioMart にアクセスできるGemがあるか探してみたら、ありました。
biomart の Gem を使ってみる
dazoakley/biomart
https://github.com/dazoakley/biomart
残念ながら2012年が最終更新となり、開発は終了しています。
README に掲載されているサンプルコードは、リンク切れのためか私の環境では動きません。
しかし、url を指定を新しいものに変更すれば動作します。
インストールする
gem install biomart
接続する
require 'biomart'
biomart = Biomart::Server.new("http://asia.ensembl.org/biomart/martservice")
ちゃんと接続できているか確認しましょう。
biomart.alive?
# => true
接続できていれば true が返されるようです。
利用可能なマートを選ぶ
マートのリストを表示させてみます。
puts biomart.list_databases
次のようなリストが表示されます。
ENSEMBL_MART_ENSEMBL
ENSEMBL_MART_MOUSE
ENSEMBL_MART_SEQUENCE
ENSEMBL_MART_ONTOLOGY
ENSEMBL_MART_GENOMIC
ENSEMBL_MART_SNP
ENSEMBL_MART_FUNCGEN
ここでは一番上の ENSEMBL_MART_ENSEMBL を選びます。
mart = biomart.databases["ENSEMBL_MART_ENSEMBL"]
リストからデータセットを選ぶ
データセットのリストを表示します。
mart.list_datasets
大量に表示されてしまうので、目的のリストを検索します。ここではホモ・サピエンス、すなわち人間を検索してみます。こういうとき grep は便利です。
mart.list_datasets.grep(/sapiens/)
# => ["hsapiens_gene_ensembl"]
人間を選択します。
hsaset = mart.datasets["hsapiens_gene_ensembl"]
念のため接続が生きていることを確認しておきましょう。
hsaset.alive?
# => true
接続できることが確認されました。
アトリビュートや、フィルターのリストを列挙する
実際にデータベースに検索をするまえに、アトリビュートやリストを列挙して観察します。
コマンドラインから閲覧するのは、検索するのには便利です。
しかし一覧性が悪いと感じる場合は、本家のWebサイトから確認する方が効率がよいかもしれません。
http://asia.ensembl.org/biomart/martview
# アトリビュートの一覧を列挙する
hsaset.list_attributes
# フィルターの一覧を列挙する
hsaset.list_filters
実際に使う
R で BioMart を使用する下記のサイトを参考にして、実際に検索してみます。
https://bi.biopapyrus.jp/rnaseq/annotation/r-biomart.html
いくつかの Ensembl ID から、染色体名、遺伝子の開始位置と終了位置を検索してみる。
ensid = ["ENSG00000000003", "ENSG00000000457", "ENSG00000000938",
"ENSG00000006327", "ENSG00000011405", "ENSG00000001497"]
検索する際には、filtersと、attributesを指定します。
res = hsaset.search(
filters: { "ensembl_gene_id" => ensid },
attributes: ["ensembl_gene_id", "chromosome_name", "start_position", "end_position"]
)
pp res
こんな感じで検索結果が表示されれば成功です。
{: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 を検索する
res = hsaset.search(
filters: { "ensembl_gene_id" => ensid },
attributes: ["ensembl_gene_id", "go_id"]
)
pp res
[["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