alterlab-monarch について
alterlab-monarchは、Monarch Initiativeの種をまたぐ遺伝子・疾患・表現型ナレッジベースを検索するスキルです。API v3で関連情報やHPOを調べ、表現型の類似度を比較できます。
主な機能
- 01表現型と遺伝子の関連検索
- 02疾患関連遺伝子の検索
- 03種をまたぐオルソログの取得
- 04HPO用語と階層の検索
- 05表現型セットの類似度比較
活用シーン
- 01患者のHPO用語から候補遺伝子を絞り込む
- 02表現型の類似度による疾患比較
- 03ヒト疾患の動物モデルを探す
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ alterlab-ieu/ alterlab-academic-skills --skill alterlab-monarchインストール後、Claude Code で/alterlab-monarchを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
evals/evals.jsonreferences/phenotype_ontology.mdscripts/query_monarch.py詳細
Monarch Initiative データベース
概要
Monarch Initiative(https://monarchinitiative.org/)は、ヒトとモデル生物にわたって遺伝子、疾患、表現型を関連付ける、複数種を統合したナレッジベースです。OMIM、ORPHANET、HPO(Human Phenotype Ontology)、ClinVar、MGI(Mouse Genome Informatics)、ZFIN(Zebrafish)、RGD(Rat)、FlyBase、WormBaseなど、40を超えるデータソースの情報を統合しています。
Monarch では、次のことが可能です。
- 種をまたいで表現型を対応付け、疾患原因候補遺伝子を特定する
- 疾患または表現型に関連するすべての遺伝子を見つける
- ヒト疾患のモデル生物を発見する
- 表現型オントロジーのクエリで HPO 階層をたどる
主なリソース:
- Monarch ポータル:https://monarchinitiative.org/
- API v3 ベース URL:
https://api-v3.monarchinitiative.org/v3/api(すべてのエンドポイントは/v3/api/...配下にあります) - インタラクティブ API ドキュメント(Swagger UI):https://api-v3.monarchinitiative.org/v3/docs
- HPO ブラウザー:https://hpo.jax.org/
スクリプト
scripts/query_monarch.py — Monarch Initiative API v3 にクエリを送信します(標準ライブラリのみ使用し、JSON を標準出力に出力):
python scripts/query_monarch.py entity HP:0001250 # look up an entity (gene/disease/HPO)
python scripts/query_monarch.py search epilepsy # text search the knowledge graph
python scripts/query_monarch.py associations HGNC:1100 # associations for an entity
このスキルを使用する場合
次の場合に Monarch を使用します。
- 希少疾患の原因遺伝子の発見:患者の表現型(HPO 用語)に関連する遺伝子は何ですか?
- 表現型の類似性:表現型プロファイルに基づいて、2 つの疾患は類似していますか?
- 種をまたいだモデル化:対象の疾患に対するマウス/ゼブラフィッシュのモデルはありますか?
- HPO 用語の検索:HPO 用語の名称、定義、オントロジー階層を取得する
- 疾患と表現型の対応付け:特定の疾患に関連するすべての HPO 用語を一覧表示する
- 遺伝子と表現型の関連:ある遺伝子の変異によってどのような表現型が生じますか?
- オルソログと表現型の対応付け:動物モデルの表現型を使って、ヒト遺伝子の機能を推定する
対象外
| シナリオ | 代わりに使用 |
|---|---|
| 特定の変異の臨床的意義(ACMG、レビューの星評価) | alterlab-clinvar |
| 集団におけるアレル頻度と遺伝子制約(pLI/LOEUF) | alterlab-gnomad |
| 創薬における標的と疾患のエビデンススコアおよび開発可能性 | alterlab-opentargets |
| 一般的な変異の GWAS 形質関連 | alterlab-gwas |
| 薬理ゲノム学に基づく遺伝子と薬剤のガイダンス | alterlab-clinpgx |
主な機能
1. Monarch API v3
実際のエンドポイントは /v3/api 配下にあります(/v3/docs の URL は Swagger UI であり、リクエストのベースではありません)。関連項目は フラットな形式で返されます。item["subject"]、item["subject_label"]、item["predicate"]、item["object"]、item["object_label"]、item["object_category"] などを読み取ってください。item["object"]["id"] のようなネストされた形式はありません。
import requests
BASE_URL = "https://api-v3.monarchinitiative.org/v3/api"
def monarch_get(endpoint, params=None):
"""GET a Monarch API v3 endpoint and return parsed JSON."""
url = f"{BASE_URL}/{endpoint}"
response = requests.get(url, params=params, headers={"Accept": "application/json"})
response.raise_for_status()
return response.json()
2. 表現型から遺伝子への関連(Pheno2Gene)
GeneToPhenotypicFeatureAssociation では、遺伝子が subject で、表現型が
object です。表現型からその遺伝子を検索するには、
object=<HPO> および subject_category=biolink:Gene で絞り込みます。
def phenotype_to_gene(hpo_ids, limit=100):
"""
Return genes whose phenotypes match the given HPO terms (flat per-term links).
Core use case: rare disease differential diagnosis.
Args:
hpo_ids: List of HPO term IDs (e.g., ["HP:0001250", "HP:0004322"])
"""
all_genes = []
for hpo_id in hpo_ids:
data = monarch_get("association", {
"object": hpo_id,
"subject_category": "biolink:Gene",
"category": "biolink:GeneToPhenotypicFeatureAssociation",
"limit": limit,
})
for assoc in data.get("items", []):
all_genes.append({
"phenotype_id": hpo_id,
"gene_id": assoc.get("subject"),
"gene_name": assoc.get("subject_label"),
"predicate": assoc.get("predicate"),
})
return all_genes
# Example: Find genes associated with seizures and short stature
hpo_terms = ["HP:0001250", "HP:0004322"] # Seizure, Short stature
genes = phenotype_to_gene(hpo_terms)
3. 疾患から遺伝子への関連
疾患と原因遺伝子の関連は CausalGeneToDiseaseAssociation です(遺伝子 = subject、
疾患 = object、predicate は biolink:causes)。ある疾患の遺伝子を一覧表示するには、
object=<disease> とそのカテゴリーで絞り込みます。
def get_disease_genes(disease_id, limit=100):
"""
Get genes causally linked to a disease.
Disease IDs: MONDO:0007739, OMIM:146300, ORPHANET:558, etc.
"""
data = monarch_get("association", {
"object": disease_id,
"category": "biolink:CausalGeneToDiseaseAssociation",
"limit": limit,
})
return data.get("items", [])
# Example: genes causally linked to Huntington disease
for assoc in get_disease_genes("MONDO:0007739"):
print(f" {assoc.get('subject_label')} ({assoc.get('subject')})")
# MONDO disease IDs (preferred over OMIM for cross-ontology queries)
# MONDO:0007739 - Huntington disease
# MONDO:0009061 - Cystic fibrosis
# OMIM:104300 - Alzheimer disease, susceptibility to, type 1
4. 遺伝子から表現型および疾患
def get_phenotypes_for_gene(gene_id, limit=100):
"""
Get all phenotypes associated with a gene.
Gene IDs: HGNC:7884, NCBIGene:4137, etc.
"""
data = monarch_get("association", {
"subject": gene_id,
"category": "biolink:GeneToPhenotypicFeatureAssociation",
"limit": limit,
})
return data.get("items", [])
def get_diseases_for_gene(gene_id, limit=100):
"""Get diseases caused by variants in a gene."""
data = monarch_get("association", {
"subject": gene_id,
"category": "biolink:CausalGeneToDiseaseAssociation",
"limit": limit,
})
return data.get("items", [])
# Example: What diseases does BRCA1 cause? (flat fields: object / object_label)
brca1_diseases = get_diseases_for_gene("HGNC:1100")
for assoc in brca1_diseases:
print(f" {assoc.get('object_label')} ({assoc.get('object')})")
5. HPO 用語の検索
def get_hpo_term(hpo_id):
"""Fetch information about an HPO term."""
return monarch_get(f"entity/{hpo_id}")
def search_hpo_terms(query, limit=20):
"""Search for HPO terms by name."""
params = {
"q": query,
"category": "biolink:PhenotypicFeature",
"limit": limit
}
return monarch_get("search", params)
# Example: look up the HPO term for seizures
seizure_term = get_hpo_term("HP:0001250")
print(f"Name: {seizure_term.get('name')}")
print(f"Definition: {seizure_term.get('description')}")
# Search for related terms
epilepsy_terms = search_hpo_terms("epilepsy")
for term in epilepsy_terms.get("items", [])[:5]:
print(f" {term['id']}: {term['name']}")
6. 意味的類似度(疾患の比較)
semsim/compare は、2 つの HPO 用語セット(subjects、objects)と任意の metric を JSON ボディで受け取る POST エンドポイントです。有効なメトリクスは次のとおりです。
ancestor_information_content(デフォルト)、jaccard_similarity、phenodigm_score。
レスポンスには average_score と best_score が含まれます。
def compare_phenotype_sets(subject_hpo_ids, object_hpo_ids,
metric="ancestor_information_content"):
"""
Compare two sets of HPO terms by semantic similarity over the HPO hierarchy.
Pass each disease's HPO profile as a term set (not the disease CURIE itself).
"""
body = {
"subjects": subject_hpo_ids,
"objects": object_hpo_ids,
"metric": metric,
}
resp = requests.post(f"{BASE_URL}/semsim/compare", json=body)
resp.raise_for_status()
return resp.json()
# Example: compare two phenotype profiles
similarity = compare_phenotype_sets(
["HP:0001250", "HP:0001263"], # Seizure, Global developmental delay
["HP:0001250", "HP:0004322"], # Seizure, Short stature
)
print(similarity["average_score"], similarity["best_score"])
表現型プロファイル検索では、1 回の呼び出しで、グループ内のすべての遺伝子または疾患を HPO 用語セット全体と照合してランキングします。これは、§8 の用語ごとのカウントに代わる、類似度ベースの方法です。GET /semsim/search/{termset}/{group} は、カンマ区切りの用語セットとグループ(Human Genes、Human Diseases、Mouse Genes、Rat Genes、Zebrafish Genes、C. Elegans Genes)を受け取ります。limit は 50 以下です。
{subject: {id, name, ...}, score, similarity} のリストを返します。
from urllib.parse import quote
def semsim_search(hpo_ids, group="Human Diseases", metric="ancestor_information_content", limit=20):
termset = ",".join(hpo_ids)
url = f"{BASE_URL}/semsim/search/{termset}/{quote(group)}"
resp = requests.get(url, params={"metric": metric, "limit": limit}, timeout=60)
resp.raise_for_status()
return [(r["subject"]["id"], r["subject"].get("name"), r["score"]) for r in resp.json()]
semsim_search(["HP:0001250", "HP:0004322", "HP:0001252", "HP:0000252", "HP:0001263"], "Human Genes")
7. 種をまたいだオルソログ
def get_orthologs(gene_id, taxon=None, limit=50):
"""
Get orthologs of a human gene in model organisms.
Useful for finding animal models of human diseases.
Each item exposes object / object_label / object_taxon_label (e.g. Mus musculus).
"""
params = {
"subject": gene_id,
"predicate": "biolink:orthologous_to",
"limit": limit,
}
if taxon:
params["object_taxon"] = taxon # e.g. "NCBITaxon:10090" for mouse
return monarch_get("association", params).get("items", [])
# NCBI Taxonomy IDs for common model organisms:
# Mouse: 10090 (Mus musculus)
# Zebrafish: 7955 (Danio rerio)
# Fruit fly: 7227 (Drosophila melanogaster)
# C. elegans: 6239
# Rat: 10116 (Rattus norvegicus)
8. ワークフロー全体:希少疾患の原因遺伝子の優先順位付け
import requests
import pandas as pd
def rare_disease_gene_finder(patient_hpo_terms, candidate_gene_ids=None, top_n=20):
"""
Find genes that match a patient's HPO phenotype profile.
Args:
patient_hpo_terms: List of HPO IDs from clinical assessment
candidate_gene_ids: Optional list to restrict search
top_n: Number of top candidates to return
"""
BASE_URL = "https://api-v3.monarchinitiative.org/v3/api"
# 1. Find genes associated with each phenotype
gene_phenotype_counts = {}
for hpo_id in patient_hpo_terms:
data = requests.get(
f"{BASE_URL}/association",
params={
"object": hpo_id,
"subject_category": "biolink:Gene",
"category": "biolink:GeneToPhenotypicFeatureAssociation",
"limit": 100,
}
).json()
for item in data.get("items", []):
gene_id = item.get("subject") # flat field, not item["subject"]["id"]
gene_name = item.get("subject_label")
if gene_id:
if gene_id not in gene_phenotype_counts:
gene_phenotype_counts[gene_id] = {"name": gene_name, "count": 0, "phenotypes": []}
gene_phenotype_counts[gene_id]["count"] += 1
gene_phenotype_counts[gene_id]["phenotypes"].append(hpo_id)
# 2. Rank by number of matching phenotypes
ranked = sorted(gene_phenotype_counts.items(),
key=lambda x: -x[1]["count"])[:top_n]
results = []
for gene_id, info in ranked:
results.append({
"gene_id": gene_id,
"gene_name": info["name"],
"matching_phenotypes": info["count"],
"total_patient_phenotypes": len(patient_hpo_terms),
"phenotype_overlap": info["count"] / len(patient_hpo_terms),
"matching_hpo_terms": info["phenotypes"]
})
return pd.DataFrame(results)
# Example usage
patient_phenotypes = [
"HP:0001250", # Seizures
"HP:0004322", # Short stature
"HP:0001252", # Hypotonia
"HP:0000252", # Microcephaly
"HP:0001263", # Global developmental delay
]
candidates = rare_disease_gene_finder(patient_phenotypes)
print(candidates[["gene_name", "matching_phenotypes", "phenotype_overlap"]].to_string())
クエリワークフロー
ワークフロー 1:HPO に基づく鑑別診断
- 診療記録または遺伝学的カウンセリングから HPO 用語を抽出します
- Monarch に対して、表現型から遺伝子を検索するクエリを実行します
- 一致する表現型の数で候補遺伝子をランキングします
- gnomAD(制約スコア)および ClinVar(バリアントのエビデンス)と照合します
- pLI が高く、既知の病原性バリアントがある遺伝子を優先します
ワークフロー 2:疾患モデルの発見
- 対象とする遺伝子または疾患を特定します
- Monarch に対して、種をまたいだオルソログを検索します
- モデル生物のデータベースで表現型との関連を検索します
- ヒトの疾患の特徴を再現する実験モデルを特定します
ワークフロー 3:新規遺伝子の表現型アノテーション
- 機能が不明な遺伝子について、既知の表現型との関連をすべて検索します
- HPO 階層にマッピングして、影響を受ける身体システムを把握します
- OMIM および ORPHANET と照合し、疾患との関連を確認します
一般的な識別子のプレフィックス
| プレフィックス | 名前空間 | 例 |
|---|---|---|
HP: | Human Phenotype Ontology | HP:0001250(けいれん発作) |
MONDO: | Monarch Disease Ontology | MONDO:0007739 |
OMIM: | OMIM 疾患 | OMIM:104300 |
ORPHANET: | Orphanet 希少疾患 | ORPHANET:558 |
HGNC: | HGNC 遺伝子シンボル | HGNC:7884 |
NCBIGene: | NCBI 遺伝子 ID | NCBIGene:4137 |
ENSEMBL: | Ensembl 遺伝子 | ENSEMBL:ENSG... |
MGI: | マウス遺伝子 | MGI:1338833 |
ZFIN: | ゼブラフィッシュ遺伝子 | ZFIN:ZDB-GENE... |
ベストプラクティス
- 疾患には MONDO ID を使用します。OMIM/ORPHANET/MESH の識別子が統合されています
- 表現型には HPO ID を使用します。臨床表現型の記述における標準です
- ページネーションを処理します:大規模なクエリでは、
offsetパラメーターを使って繰り返し取得する必要があります - 意味的類似度は完全一致よりも優れています:祖先にあたる HPO 用語によって、関連する表現型も検出できます
- ClinVar および OMIM と相互検証します:Monarch は多くの情報源を集約しているため、品質にはばらつきがあります
- 遺伝子には HGNC ID を使用します。データベースのバージョンをまたいで、遺伝子シンボルよりも安定しています
その他のリソース
- Monarch ポータル:https://monarchinitiative.org/
- API v3 ベース URL:https://api-v3.monarchinitiative.org/v3/api — Swagger UI:https://api-v3.monarchinitiative.org/v3/docs
- HPO ブラウザー:https://hpo.jax.org/
- MONDO オントロジー:https://mondo.monarchinitiative.org/
- 引用:Putman TE et al.(2024)The Monarch Initiative in 2024: an analytic platform integrating phenotypes, genes and diseases across species. Nucleic Acids Research 52(D1):D938–D949. PMID: 38000386. DOI: 10.1093/nar/gkad1082
- KG リリースおよびソースのバージョン:
GET /v3/api/version、/v3/api/releases、/v3/api/sources/versions— 再現性を確保するため、クエリに使用した KG のバージョンを記録します