mcpField
A
alterlab-monarch

alterlab-monarch

github.com/alterlab-ieuデータ・データベース7866 回インストール5 週間前に更新
リポジトリ

alterlab-monarch について

alterlab-monarchは、Monarch Initiativeの種をまたぐ遺伝子・疾患・表現型ナレッジベースを検索するスキルです。API v3で関連情報やHPOを調べ、表現型の類似度を比較できます。

主な機能

  1. 01表現型と遺伝子の関連検索
  2. 02疾患関連遺伝子の検索
  3. 03種をまたぐオルソログの取得
  4. 04HPO用語と階層の検索
  5. 05表現型セットの類似度比較

活用シーン

  1. 01患者のHPO用語から候補遺伝子を絞り込む
  2. 02表現型の類似度による疾患比較
  3. 03ヒト疾患の動物モデルを探す

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/alterlab-ieu/alterlab-academic-skills --skill alterlab-monarch

インストール後、Claude Code で/alterlab-monarchを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

evals/
evals.json
references/
phenotype_ontology.md
scripts/
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 階層をたどる

主なリソース:

スクリプト

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 に基づく鑑別診断
  1. 診療記録または遺伝学的カウンセリングから HPO 用語を抽出します
  2. Monarch に対して、表現型から遺伝子を検索するクエリを実行します
  3. 一致する表現型の数で候補遺伝子をランキングします
  4. gnomAD(制約スコア)および ClinVar(バリアントのエビデンス)と照合します
  5. pLI が高く、既知の病原性バリアントがある遺伝子を優先します
ワークフロー 2:疾患モデルの発見
  1. 対象とする遺伝子または疾患を特定します
  2. Monarch に対して、種をまたいだオルソログを検索します
  3. モデル生物のデータベースで表現型との関連を検索します
  4. ヒトの疾患の特徴を再現する実験モデルを特定します
ワークフロー 3:新規遺伝子の表現型アノテーション
  1. 機能が不明な遺伝子について、既知の表現型との関連をすべて検索します
  2. HPO 階層にマッピングして、影響を受ける身体システムを把握します
  3. OMIM および ORPHANET と照合し、疾患との関連を確認します

一般的な識別子のプレフィックス

プレフィックス名前空間例
HP:Human Phenotype OntologyHP:0001250(けいれん発作)
MONDO:Monarch Disease OntologyMONDO:0007739
OMIM:OMIM 疾患OMIM:104300
ORPHANET:Orphanet 希少疾患ORPHANET:558
HGNC:HGNC 遺伝子シンボルHGNC:7884
NCBIGene:NCBI 遺伝子 IDNCBIGene: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 を使用します。データベースのバージョンをまたいで、遺伝子シンボルよりも安定しています

その他のリソース

コメント