こんにちは、tsuyuhです。
最近は雨が降ったり止んだり、梅雨なのか梅雨じゃないのかよくわからない天気が続いています。
個人的に雨は嫌いじゃないんですが、はっきりしない天気は嫌いです。
ところで、この間、とあるデータベースから遺伝子発現マトリックスを落としてきたら、それが "遺伝子名" と "発現量" の列で構成された表だったということがありました。
一見何も問題はないんですが、個人的には "遺伝子ID" は欲しいところかなと思います。
解析ツールによっては遺伝子IDを参照できないと不便なことがあります。
また、古い論文のデータだと、現在のデータベース上では遺伝子名が変更されていて、Synonymous扱いになっていることもよくあります。(""gene_A" not found" のように怒られます。)
そういうはっきりしない (?) 表は嫌いです。
という訳で、自分で好きな遺伝子IDを付与してみます。
あと、ついでに遺伝子の機能も追記してみようと思います。
RパッケージbiomaRtを使って遺伝子名に対応するIDや遺伝子機能を付与する
使用ツール
biomaRt v2.42.1
(Durinck et al., Bioinformatics 2005; Durinck et al., Nat. Protoc. 2009)

まず、こんな表を用意してみました。
とあるヒト遺伝子の発現量データです。
(※ 無作為に選んだ遺伝子と適当な数値です。)
gene_list.txt
| gene_name | TPM |
|---|---|
| MIR421 | 5 |
| SPATA21 | 10 |
| CLEC4M | 20 |
| FUZ | 100 |
(実際、これくらいの遺伝子数なら、Google先生に聞いた方が早いんですけどね。遺伝子が100個とか1000個とかの表でも同じことができますので...。)
ここでは、この表に "ensembl gene ID" と "entrez gene ID"、"遺伝子の機能詳細" を付与してみたいと思います。
まずは普通にRを起動して、
# ツールのインストール
> if (!requireNamespace("BiocManager", quietly = TRUE))
install.packages("BiocManager")
> BiocManager::install("biomaRt")
# ツールの読み込み
> library(biomaRt)
# データの読み込み
> data <- read.table("gene_list.txt", header = T)
次に、useMart() で参照するデータベースを選択します。今回はensemblでいい。
※ というか、デフォルトでwww.ensembl.org を参照している模様。 (以前のバージョンだとensembl以外も参照できたんですが...。ensembl fungiとか。)
> db <- useMart("ensembl")
そして、listDatasets("データベース名") で、そのデータベースに登録されているデータを確認します。
> listDatasets(db)
dataset description version
1 abrachyrhynchus_gene_ensembl Pink-footed goose genes (ASM259213v1) ASM259213v1
2 acalliptera_gene_ensembl Eastern happy genes (fAstCal1.2) fAstCal1.2
3 acarolinensis_gene_ensembl Green anole genes (AnoCar2.0v2) AnoCar2.0v2
4 acchrysaetos_gene_ensembl Golden eagle genes (bAquChr1.2) bAquChr1.2
(以下略)
ensemblでは、すべてのデータが "[生物種]_gene_ensembl" という名前になっていることがわかります。
ヒトなら "hsapiens_gene_ensembl" ですね。
ここまでわかったので、目的のデータを useDataset("データ名", mart = "データベース名") で読み込みます。
> hd <- useDataset("hsapiens_gene_ensembl", mart = db)
次に変換元と変換先の属性名を調べます。
今回は、変換元が "遺伝子名"、変換先が"ensembl gene ID" と "entrez gene ID"、"遺伝子の機能詳細" ですが、hsapiens_gene_ensemblではどんな名称で登録されているのかわかりません。
変換元の属性名を調べるのはlistFilters("データ名")
> listFilters(hd)
name
1 chromosome_name
2 start
3 end
4 band_start
5 band_end
6 marker_start
7 marker_end
(以下略)
ですが、種類がありすぎる上、名称に統一感がないので探すのは困難です。
そこで、grep() であたりをつけて検索します。
おそらく、遺伝子名は"gene_symbol" みたいな名称でしょう。
> filters <- listFilters(hd)
> filters[grep("symbol", filters[,1]),]
name description
83 hgnc_symbol HGNC symbol(s) [e.g. A1BG]
114 uniprot_gn_symbol UniProtKB Gene Name symbol(s) [e.g. 5HT1A]
検索した結果、"hgnc_symbol" という名前で登録されていることがわかりました。
次に、変換先の属性名はlistAttributes("データ名") でそれぞれ調べます。
検索ワードは適当に。
> attributes <- listAttributes(hd)
> attributes[grep("ensembl", attributes[,1]),]
name description page
1 ensembl_gene_id Gene stable ID feature_page
2 ensembl_gene_id_version Gene stable ID version feature_page
3 ensembl_transcript_id Transcript stable ID feature_page
4 ensembl_transcript_id_version Transcript stable ID version feature_page
5 ensembl_peptide_id Protein stable ID feature_page
6 ensembl_peptide_id_version Protein stable ID version feature_page
(以下略)
> attributes[grep("entrez", attributes[,1]),]
name description page
60 entrezgene_trans_name EntrezGene transcript name ID feature_page
80 entrezgene_description NCBI gene (formerly Entrezgene) description feature_page
81 entrezgene_accession NCBI gene (formerly Entrezgene) accession feature_page
82 entrezgene_id NCBI gene (formerly Entrezgene) ID feature_page
> attributes[grep("description", attributes[,1]),]
name description page
8 description Gene description feature_page
38 phenotype_description Phenotype description feature_page
50 goslim_goa_description GOSlim GOA Description feature_page
73 mim_gene_description MIM gene description feature_page
75 mim_morbid_description MIM morbid description feature_page
80 entrezgene_description NCBI gene (formerly Entrezgene) description feature_page
(以下略)
それぞれ、 "ensembl_gene_id"、"entrezgene_id" 、"description" という名前を使えばよさそうです。
ここまでわかったので、実際に遺伝子名をそれぞれに変換します。
変換するコマンドは getBM(attributes = "変換先の属性名", filters = "変換元の属性名", values = "変換元", mart = "参照データ") です。
ここでは、"遺伝子名" と "ensembl gene ID"、"entrez gene ID"、"遺伝子の機能詳細" を横並びにしたいので、attributes = c(hgnc_symbol", "ensembl_gene_id", "entrezgene_id", "description") としています。
また、変換元のデータは用意した表に記載されている遺伝子名なので、data変数内のgene_name列を使います。
※ なお、キャッシュの読み込みと書き込みを無効 (useCache = FALSE) にしないとエラーが出ます。
> res <- getBM(attributes = c("hgnc_symbol", "ensembl_gene_id",
"entrezgene_id", "description"),
filters = "hgnc_symbol", values = data$gene_name,
mart = hd, useCache = FALSE)
# 結果の確認
> res
hgnc_symbol ensembl_gene_id entrezgene_id
1 CLEC4M ENSG00000104938 10332
2 FUZ ENSG00000010361 80199
3 MIR421 ENSG00000202566 693122
4 SPATA21 ENSG00000187144 374955
description
1 C-type lectin domain family 4 member M [Source:HGNC Symbol;Acc:HGNC:13523]
2 fuzzy planar cell polarity protein [Source:HGNC Symbol;Acc:HGNC:26219]
3 microRNA 421 [Source:HGNC Symbol;Acc:HGNC:32793]
4 spermatogenesis associated 21 [Source:HGNC Symbol;Acc:HGNC:28026]
できました!
あとは、この結果と発現マトリックスを合体させるだけ。
# 遺伝子名でソート
> data <- data[order(data$gene_name),]
> res <- res[order(res$hgnc_symbol),]
# dataとresで遺伝子名が一致しているか確認
> table_1 <- data[match(data$gene_name, res$hgnc_symbol),]
> table_2 <- res[match(data$gene_name, res$hgnc_symbol),]
> table_1
gene_name TPM
3 CLEC4M 20
4 FUZ 100
1 MIR421 5
2 SPATA21 10
> table_2
hgnc_symbol ensembl_gene_id entrezgene_id
1 CLEC4M ENSG00000104938 10332
2 FUZ ENSG00000010361 80199
3 MIR421 ENSG00000202566 693122
4 SPATA21 ENSG00000187144 374955
description
1 C-type lectin domain family 4 member M [Source:HGNC Symbol;Acc:HGNC:13523]
2 fuzzy planar cell polarity protein [Source:HGNC Symbol;Acc:HGNC:26219]
3 microRNA 421 [Source:HGNC Symbol;Acc:HGNC:32793]
4 spermatogenesis associated 21 [Source:HGNC Symbol;Acc:HGNC:28026]
# 遺伝子名が一致していたので、合体
> cbind(table_2, table_1$TPM)
hgnc_symbol ensembl_gene_id entrezgene_id
1 CLEC4M ENSG00000104938 10332
2 FUZ ENSG00000010361 80199
3 MIR421 ENSG00000202566 693122
4 SPATA21 ENSG00000187144 374955
description
1 C-type lectin domain family 4 member M [Source:HGNC Symbol;Acc:HGNC:13523]
2 fuzzy planar cell polarity protein [Source:HGNC Symbol;Acc:HGNC:26219]
3 microRNA 421 [Source:HGNC Symbol;Acc:HGNC:32793]
4 spermatogenesis associated 21 [Source:HGNC Symbol;Acc:HGNC:28026]
table_1$TPM
1 20
2 100
3 5
4 10
完成!
ちなみに、dataとresの遺伝子名が一致しないという場合もよくあります。
特に、non-coding RNA遺伝子などアノテーションがはっきり付与されていない遺伝子はbiomaRtでデータベースを検索しても見つかりません。
そんなときは、以下のようにします。
# 例えば、FUZ遺伝子がデータベースになかった場合、 > table_3 <- data[match(data$gene_name, res$hgnc_symbol),] gene_name TPM 3 CLEC4M 20 NA <NA> NA 1 MIR421 5 2 SPATA21 10 # このように、その行がNAと表示されるので、na.omit()関数でその行を削除します。 > table_3 <- na.omit(table_3) > table_3 gene_name TPM 3 CLEC4M 20 1 MIR421 5 2 SPATA21 10
これで、もう片方の表でも同様のことをして合体すればOK。
ただ、あまりにも検索で抜け落ちる場合には、属性名が間違っている可能性があるので、別の属性名で試してみるのがいいかもですね。
ちなみに、同様の方法でGene Ontologyも付与することができます。
当ブログの過去記事↓
staffblog.amelieff.jp
まとめ
biomaRtを使えば、発現発現マトリックスに様々な遺伝子の情報を追記できる!
アメリエフでは、バイオデータ解析やそのシステム・インフラ環境の開発に興味のあるエンジニア・リーダー候補を募集しています。

