KEGG_2021_Mouse というライブラリ名は Enrichr に存在しません。マウスの KEGG 解析で指定すべき名前は KEGG_2019_Mouse です(本記事執筆時点・2026年7月)。ヒト用が KEGG_2021_Human であるため、生物種の部分だけを置き換えて kegg_2021_mouse という名前を作ってしまう例が多いのですが、Enrichr のライブラリは生物種ごとに別々に更新されており、年号の部分がそろっていません。
以下は、DESeq2 などで得た発現変動遺伝子のリストを入力として Enrichr・GSEApy にかける場面を想定しています。マウスの RNA-seq 解析で詰まる次の5点を順に扱います。
- ライブラリ名が見つからずエラーになる
organism引数が何を切り替えているのかがわからない- 遺伝子名が Ensembl ID のままになっている
- 遺伝子名はシンボルなのに結果が空になる(大文字・小文字の問題)
backgroundを渡しても反映されていないように見える
1. KEGG_2021_Mouse が存在しない理由
Enrichr(遺伝子セットのエンリッチメント解析を提供する Web サービス)のライブラリ名は、ライブラリ名_年号_生物種 という形をしています。この年号は「そのライブラリが最後に構築された年」であり、生物種ごとに独立しています。KEGG の場合、ヒト版は2021年に更新されましたが、マウス版は2019年構築のものが最新のまま提供されています。
| 生物種 | KEGG ライブラリ名 | 状態 |
|---|---|---|
| ヒト | KEGG_2021_Human |
存在する |
| マウス | KEGG_2019_Mouse |
存在する |
| マウス | KEGG_2021_Mouse |
存在しない |
なお、Enrichr の派生である modEnrichr が担当するのはゼブラフィッシュ・ショウジョウバエ・線虫・酵母の4種であり、ヒトとマウスは本家 Enrichr が担当しています(Kuleshov et al., Nucleic Acids Research, 2019)。マウスのライブラリを探すために別サービスへ移る必要はありません。
2. 正しいライブラリ名を確認する方法
ライブラリ名は年単位で追加・更新されるため、名前を覚えるのではなく毎回一覧を取得して確認するのが確実です。GSEApy では get_library_name() がその役割を持ちます。
python
# マウス解析で使えるライブラリ名の一覧を取得する
import gseapy as gp
libs = gp.get_library_name(organism='Mouse')
# 名前に KEGG を含むものだけを抜き出す
print([name for name in libs if 'KEGG' in name])
# 目当ての名前が実在するかを直接確かめる
print('KEGG_2019_Mouse' in libs) # True
print('KEGG_2021_Mouse' in libs) # False
存在しない名前を渡した場合、GSEApy は該当ライブラリを読み飛ばした上でエラーを返します。バージョンによって文言が異なります。
text
# GSEApy 1.3 系
WARNING Input library not found: KEGG_2021_Mouse. Skip
EnrichrValidationError: No GeneSets are valid !!! Check your gene_sets input.
# GSEApy 1.1 系
LookupError: Not validated Enrichr library ! Please provide correct organism and library name!
上のいずれかのエラーが出ているなら、原因はライブラリ名です。名前を
KEGG_2019_Mouse に直せば解決します。エラーが出ていないのに結果が空という場合は、原因が別なので第4節以降に進んでください。
3. organism 引数は何を切り替えているのか
organism は「どのサーバに問い合わせるか」を決める引数です。GSEApy の内部では、生物種名ごとに接続先の URL が決められています。実際にどこへ接続されるかを表示させると次のようになります。
python
from gseapy.enrichr import EnrichrAPI
for org in ['human', 'mouse', 'yeast', 'fly', 'worm', 'fish']:
print(org, EnrichrAPI(organism=org).base_url)
text
human https://maayanlab.cloud/Enrichr
mouse https://maayanlab.cloud/Enrichr
yeast https://maayanlab.cloud/YeastEnrichr
fly https://maayanlab.cloud/FlyEnrichr
worm https://maayanlab.cloud/WormEnrichr
fish https://maayanlab.cloud/FishEnrichr
ヒトとマウスは同じサーバを参照します。つまりマウス解析では、organism を指定してもしなくても参照されるライブラリ一覧は変わりません。KEGG_2021_Mouse が通らない原因は organism の指定漏れではなく、ライブラリ名そのものにあります。organism の指定が結果を左右するのは、別のサーバに分かれている酵母・ハエ・線虫・ゼブラフィッシュの場合です。
これらの関数は Enrichr のサーバを直接呼び出さないため、
organism を受け取りません。マウス用ライブラリを使いたい場合は、get_library() で辞書として取得してから gene_sets に渡します。また organism はカスタム遺伝子セット(gmt ファイルや辞書)にも影響しません。
ここまでを踏まえた最小の呼び出しは次のとおりです。
python
genes = ['Actb', 'Gapdh', 'Sox2', 'Nes', 'Aqp4']
enr = gp.enrichr(
gene_list=genes,
gene_sets='KEGG_2019_Mouse',
organism='mouse',
outdir=None,
)
print(enr.results[['Term', 'Overlap', 'Adjusted P-value']].head())
4. 遺伝子名が Ensembl ID のままになっていないか
RNA-seq のパイプラインでは、ここが最初の関門になります。カウント編で htseq-count や featureCounts を使った場合、出力の行名は GTF の gene_id、つまり ENSMUSG00000029580 のような Ensembl 遺伝子 ID です。DESeq2 はこの行名をそのまま引き継ぐため、results() の出力も Ensembl ID のままになります。一方 Enrichr のライブラリは遺伝子シンボルで構築されているため、Ensembl ID を渡すと1件も照合されません。この場合もエラーは出ず、結果が空になるだけです。
python
from gseapy import Biomart
# DESeq2 の結果から取り出した Ensembl ID
# 参照 GTF によってはバージョン番号(.15 など)が付く
deg_ids = ['ENSMUSG00000029580.15', 'ENSMUSG00000057666.18']
# バージョン番号を落としてから照合する
deg_ids = [i.split('.')[0] for i in deg_ids]
bm = Biomart()
m = bm.query(
dataset='mmusculus_gene_ensembl',
attributes=['ensembl_gene_id', 'external_gene_name'],
)
id2sym = dict(zip(m['ensembl_gene_id'], m['external_gene_name']))
# 対応が見つからない ID は落ちる。変換後に重複も除く
genes = sorted({id2sym[i] for i in deg_ids if i in id2sym})
GENCODE 由来の GTF を使うと、遺伝子 ID が
ENSMUSG00000029580.15 のようにピリオドとバージョン番号を伴います。BioMart の ensembl_gene_id はバージョン番号を含まないため、そのまま照合すると一致率がゼロになります。変換の前にピリオド以降を必ず落としてください。
5. 遺伝子名はシンボルなのに結果が空になる場合
ライブラリ名も遺伝子 ID の型も正しいのに有意な項目がひとつも出ない、あるいは Overlap 列がすべて 0 になる場合、残る原因は大文字・小文字の表記です。マウスの遺伝子シンボルは Actb、Gapdh のように先頭だけが大文字ですが、Enrichr が配布するライブラリはマウス用であっても中身が ACTB、GAPDH とすべて大文字になっています。GSEApy 公式ドキュメントも、Enrichr ライブラリを使う場合は入力側の遺伝子シンボルを大文字に変換するよう明記しています。
重要なのは、この問題が起きる経路と起きない経路があることです。
| 経路 | 大文字・小文字の扱い | 失敗の現れ方 |
|---|---|---|
gp.enrichr()(オンライン照合) |
Enrichr のサーバ側で自動的に大文字化される | この問題は起きない |
gp.enrich()(オフライン照合) |
大文字と小文字を区別する | 重なりがゼロになる |
gp.prerank() / gp.gsea() / gp.ssgsea() |
区別する。自動変換は行われない | NES が算出されず、リードエッジ遺伝子が空になる |
照合できないだけなので例外は発生せず、「有意な項目がゼロ」「NES が出ない」という形で失敗します。
Overlap 列がすべて 0 または極端に小さい場合、統計的な結論を出す前にまず表記の一致を疑ってください。
対処は3通りあり、目的に応じて選びます。
対処1:入力側を大文字に変換する。最も簡便で、オフライン照合や prerank でそのまま使えます。
python
# Enrichr のライブラリは中身が大文字で配布されている
kegg = gp.get_library(name='KEGG_2019_Mouse', organism='Mouse')
first = list(kegg)[0]
print(first, kegg[first][:5]) # 大文字のシンボルが返る
# DESeq2 の Wald 統計量で並べたランキングを大文字にそろえる
rnk = res[['stat']].dropna()
rnk.index = rnk.index.str.upper()
pre = gp.prerank(rnk=rnk, gene_sets=kegg, min_size=10, outdir=None)
対処2:はじめからマウス表記の遺伝子セットを使う。MSigDB はマウス版のコレクションを配布しており、こちらは遺伝子名がマウス表記のまま入っています。変換も脱落も発生しないため、DESeq2 の統計量を使った GSEA ではこの方法が最も安全です。
python
from gseapy import Msigdb
msig = Msigdb()
# マウス版 hallmark コレクション
gmt = msig.get_gmt(category='mh.all', dbver='2023.1.Mm')
print(gmt['HALLMARK_WNT_BETA_CATENIN_SIGNALING'][:5])
# ['Ctnnb1', 'Jag1', 'Myc', 'Notch1', 'Ptch1']
対処3:オルソログ変換でライブラリ側をマウス表記に直す。KEGG のようにマウス版 MSigDB に対応物が見つからない場合に使います。BioMart(Ensembl が提供する ID 変換サービス)でヒトとマウスの対応表を作り、遺伝子セットの中身を置き換えます。
python
bm = Biomart()
h2m = bm.query(
dataset='hsapiens_gene_ensembl',
attributes=['external_gene_name','mmusculus_homolog_associated_gene_name'],
)
# ヒト名からマウス名への辞書をつくる(対応の無い行は捨てる)
h2m_dict = {}
for _, row in h2m.iterrows():
if row.isna().any():
continue
h2m_dict[row['external_gene_name']] = row['mmusculus_homolog_associated_gene_name']
# 遺伝子セットの中身をマウス表記に置き換える
kegg_mouse = {term: [h2m_dict[g] for g in gs if g in h2m_dict]
for term, gs in kegg.items()}
ヒトとマウスの遺伝子は1対1に対応しないため、オルソログ変換では対応先が見つからない遺伝子が必ず脱落します。GSEApy の報告例では、経路によって最大で約1,100遺伝子の減少が確認されています。異常ではありませんが、遺伝子セットのサイズが変わることは結果の解釈時に意識してください。
6. background が反映されていないように見えるとき
background(統計検定の母集団となる背景遺伝子集合)については、GSEApy のバージョンによって挙動が変わってきた経緯があり、古い解説がそのまま残っている点に注意が必要です。現行版では、Enrichr のライブラリ名を指定していても background は有効です。背景付きの計算は Speedrichr という別の API 経由で実行されます。
カウント行列の全行を背景にするのは適切ではありません。低発現フィルタで除外した遺伝子や、DESeq2 の independent filtering によって
padj が NA になった遺伝子は実質的に検定の対象外です。背景は「解析対象として残り、検定にかけられた遺伝子」にそろえます。また、遺伝子リストをシンボルに変換した場合は背景も同じ表記に変換しておく必要があります。
python
# 検定にかけられた遺伝子を背景にそろえる
bg = res.dropna(subset=['padj']).index.tolist()
enr_bg = gp.enrichr(
gene_list=genes,
gene_sets='KEGG_2019_Mouse',
background=bg,
outdir=None,
)
print(enr_bg.results.columns.tolist())
ここで見落とされやすいのが、背景を指定すると出力から Overlap 列が消えるという仕様です。列が無くなったことを「反映されていない」と受け取ってしまう例があります。反映の有無は列構成で判断してください。
それでも効かない場合は、次の3点を順に確認します。
- 背景に整数を渡していないか:遺伝子数を整数で渡した場合、オンライン経路では無視されます。整数の背景を効かせたいときはオフラインの
gp.enrich()を使います。 - GSEApy のバージョンが古くないか:古い版では
TypeError: enrichr() got an unexpected keyword argument 'background'になります。gp.__version__で確認します。 - ヒト・マウス以外を扱っていないか:背景を指定すると
organismの指定が無視されるため、酵母やハエでは意図しないライブラリ空間が使われる可能性があります。
7. RNA-seq のエンリッチメント解析:推奨ワークフロー
RNA-seq解析入門⑥:発現変動解析編 で得た DESeq2 の結果を入力とする、通しで動く流れを示します。まず R 側で遺伝子リストと背景を書き出します。
r
library(DESeq2)
# 条件間の比較結果を取り出す
res <- results(dds, contrast = c("condition", "treated", "control"))
# 検定にかけられた遺伝子だけを残す(背景になる)
res <- res[!is.na(res$padj), ]
# 有意かつ発現が上昇している遺伝子
sig <- res[res$padj < 0.05 & res$log2FoldChange > 1, ]
write.csv(as.data.frame(sig), "deg_up.csv")
write.csv(data.frame(gene = rownames(res)), "background.csv", row.names = FALSE)
次に Python 側で読み込み、Enrichr にかけます。遺伝子名が Ensembl ID の場合は、第4節の手順で遺伝子リストと背景の両方をシンボルに変換してから渡します。
python
import pandas as pd
import gseapy as gp
# 1. DESeq2 の出力を読み込む
sig = pd.read_csv('deg_up.csv', index_col=0)
genes = sig.index.tolist()
bg = pd.read_csv('background.csv')['gene'].tolist()
# 2. Ensembl ID なら、ここで両方をシンボルに変換しておく
# 3. マウス用のライブラリ名を指定して実行する
enr = gp.enrichr(
gene_list=genes,
gene_sets='KEGG_2019_Mouse',
organism='mouse',
background=bg,
outdir=None,
)
print(enr.results.head())
オンラインの gp.enrichr() を使う限り、遺伝子名の大文字・小文字はサーバ側でそろえられるため気にする必要はありません。一方、ランキングを使う GSEA(gp.prerank())に進む場合は、第5節の対処2、つまり MSigDB のマウス版コレクションを使うのが手数が少なく、遺伝子の脱落も生じません。
まとめ
| 症状 | 原因 | 対処 |
|---|---|---|
| ライブラリ名でエラーになる | KEGG_2021_Mouse は存在しない |
KEGG_2019_Mouse を指定する |
| どの名前が正しいかわからない | ライブラリは随時更新される | get_library_name(organism='Mouse') で毎回確認する |
organism を直しても変わらない |
ヒトとマウスは同じサーバを参照する | 原因はライブラリ名の側にある |
結果が空で、遺伝子名が ENSMUSG… |
Enrichr はシンボルで構築されている | バージョン番号を落とし、BioMart でシンボルに変換する |
結果が空で、遺伝子名は Actb 形式 |
ライブラリ側の遺伝子名が大文字 | 入力を大文字化するか、MSigDB のマウス版を使う |
background が効いていないように見える |
背景を指定すると Overlap 列が消える |
列構成とバージョン、渡した型を確認する |
- Enrichr のライブラリ名は生物種ごとに独立して更新されるため、年号を他の生物種から類推してはいけない。
organismは問い合わせ先サーバを切り替える引数であり、ヒトとマウスではどちらも同じサーバが選ばれる。- RNA-seq では、カウント段階の Ensembl ID をそのまま渡してしまう例が最も多い。バージョン番号の除去を忘れると変換自体が失敗する。
- オンライン照合では大文字化が自動で行われるが、オフライン照合と prerank では行われない。ここが最も気づきにくい。
- 背景は「検定にかけられた遺伝子」にそろえ、遺伝子リストと同じ表記に変換しておく。
関連記事
- RNA-seq解析入門⑥:発現変動解析編
- RNA-seq解析入門⑤:カウント編
- RNA-seq解析入門①:解析の全体フローとツール選びの考え方
- scRNA-seq解析:機能エンリッチメント・パスウェイ解析
参考文献
- Chen, E. Y., Tan, C. M., Kou, Y., et al. (2013). Enrichr: interactive and collaborative HTML5 gene list enrichment analysis tool. BMC Bioinformatics, 14, 128. doi:10.1186/1471-2105-14-128
- Kuleshov, M. V., Jones, M. R., Rouillard, A. D., et al. (2016). Enrichr: a comprehensive gene set enrichment analysis web server 2016 update. Nucleic Acids Research, 44(W1), W90–W97. doi:10.1093/nar/gkw377
- Kuleshov, M. V., Diaz, J. E. L., Flamholz, Z. N., et al. (2019). modEnrichr: a suite of gene set enrichment analysis tools for model organisms. Nucleic Acids Research, 47(W1), W183–W190. doi:10.1093/nar/gkz347
- Xie, Z., Bailey, A., Kuleshov, M. V., et al. (2021). Gene Set Knowledge Discovery with Enrichr. Current Protocols, 1(3), e90. doi:10.1002/cpz1.90
- Fang, Z., Liu, X., & Peltz, G. (2023). GSEApy: a comprehensive package for performing gene set enrichment analysis in Python. Bioinformatics, 39(1), btac757. doi:10.1093/bioinformatics/btac757
- Love, M. I., Huber, W., & Anders, S. (2014). Moderated estimation of fold change and dispersion for RNA-seq data with DESeq2. Genome Biology, 15(12), 550. doi:10.1186/s13059-014-0550-8
- Anders, S., Pyl, P. T., & Huber, W. (2015). HTSeq—a Python framework to work with high-throughput sequencing data. Bioinformatics, 31(2), 166–169. doi:10.1093/bioinformatics/btu638
- Kanehisa, M., & Goto, S. (2000). KEGG: Kyoto Encyclopedia of Genes and Genomes. Nucleic Acids Research, 28(1), 27–30. doi:10.1093/nar/28.1.27
- GSEApy 公式ドキュメント(ライブラリ名・organism・background の仕様):https://gseapy.readthedocs.io/


コメント