mcpField
T
tooluniverse-dataset-discovery

tooluniverse-dataset-discovery

github.com/mims-harvardデータ・データベース1.8k247 回インストール2 日前に更新
リポジトリ

tooluniverse-dataset-discovery について

研究課題に合うデータセットを探して評価する、ToolUniverse向けのスキルです。研究デザインや変数の要件を定めたうえで、リポジトリ検索、適合性やアクセス条件の確認、実データの分析を案内します。

主な機能

  1. 01研究デザインと変数要件の整理
  2. 02横断検索と分野別検索
  3. 03研究デザイン・標本・変数の適合性評価
  4. 04アクセス条件とデータ品質の確認
  5. 05データ取得・分析と実測結果の報告

活用シーン

  1. 01特定の研究課題に合うデータセットの検索
  2. 02横断データと縦断データの区別
  3. 03候補となるコホートや調査の比較
  4. 04変数とアクセス制限の確認

MCP 対応

ToolUniverseのfind_toolsでデータセット検索ツールを見つけ、関連ツールでリポジトリやデータセットを検索する手順を示します。

インストール

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

$npx skills add https://github.com/mims-harvard/tooluniverse --skill tooluniverse-dataset-discovery

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

詳細

データセットの探索

使用するタイミング

  • 「Xに関するデータを探して」や「Yに関するデータはどこで入手できますか」とユーザーが尋ねた場合
  • ユーザーが変数間の関係を分析したい場合
  • ユーザーが特定の研究デザイン(縦断的、横断的、実験的)を必要としている場合
  • ユーザーが特定の調査やコホートについて尋ねた場合

ステップ 1:研究課題に必要なものを把握する

検索する前に、データに必要な最低条件を特定します。

必要な研究デザイン:

  • 「Xは時間の経過に伴うYの変化を予測しますか?」→縦断的(同じ人を繰り返し測定)。横断データでは回答できません。横断データで妥協しないでください。
  • 「XはYと関連していますか?」→横断的で十分です(1回の測定)
  • 「介入Xは結果Yを引き起こしますか?」→実験的(対照群を設けた臨床試験)
  • 「Xにはどのような遺伝子/タンパク質が関わっていますか?」→オミクス(シーケンシング、発現解析、プロテオミクス)

必要な変数:

  • 具体的な曝露変数、結果変数、交絡変数を列挙します
  • 各変数について、測定の種類(連続、カテゴリ、バイオマーカーか自己申告か)を記します
  • 最低限必要な交絡因子を特定します(年齢、性別はほぼ常に必要です。分野固有の交絡因子は研究課題によって異なります)

必要な対象集団:

  • 年齢範囲、地域、臨床的状態、サンプルサイズの要件
  • 検出力分析:小さな効果(r=0.1)を検出するには、80%の検出力で約800人の被験者が必要です

ステップ 2:検索戦略

広範囲から始め、徐々に具体的に検索します。利用可能なデータセット検索ツールを見つけるには、find_tools を使ってください。記憶しているツール名に頼らないでください。

レイヤー 1 — リポジトリ横断検索(広く網を張る): 数千のリポジトリにわたるデータセットをインデックス化した検索ツールを使います。存在を知らなかったデータセットも見つかります。

  • 検索対象:研究テーマのキーワード、変数名、対象集団を表す語句
  • 確認対象:DOI 登録済みのデータセット、リポジトリ一覧、政府のデータポータル
  • re3data_search_repositories/re3data_get_repository — 個々のデータセットではなく、3,000 以上の研究データリポジトリ自体を登録したレジストリで、あらゆる分野を網羅しています。「この種のデータは、そもそもどのリポジトリで探せばよいのか」という場合に、データセット検索の一段上のレベルで利用してください(ライブでの検証済み:検索すると、「EPIC study」コホートや「Pacific Islands Families Study」など、実在する健康研究リポジトリが返されます)。re3data で適切なリポジトリを特定したら、以下のレイヤー 2 の分野別ツールを使って、そのリポジトリ内を検索してください。

レイヤー 2 — 分野別リポジトリ: データの種類に特化したリポジトリを検索します。

  • 健康調査:CDC、NHANES(米国。テーマのキーワードではなく、変数名で検索します);国際版/低・中所得国(LMIC)版には DHS Program(DHSProgram_search_indicators/_get_data)を使用します。各国の調査から、出生率、母子死亡率、栄養、予防接種、HIV の指標を検索でき、国と年で絞り込めます
  • ゲノミクス(オープン):SRA、ENA、ArrayExpress、GEO、DDBJ(DDBJ_search_entries/_get_entry/_get_cross_references)。SRA/ENA と並ぶ 3 つ目の INSDC アーカイブであり、GEA/MetaboBank のエントリも含みます。また、中国の国立ゲノミクスアーカイブには GSA(GSA_get_accession)を使用します
  • ゲノミクス(アクセス制限あり、ヒト研究):dbGaP(DbGaP_search_studies/_get_study)と EGA(EGA_get_study/_get_dataset/_get_study_datasets)。どちらも別途データアクセス申請手続きが必要です。これらのツールが返すのは研究/データセットのメタデータであり、基礎となる遺伝子型データそのものではありません
  • プロテオミクス:PRIDE、MassIVE
  • メタボロミクス:MetaboLights、Metabolomics Workbench
  • 臨床:ClinicalTrials.gov(結果を含む臨床試験データ向け)
  • コンソーシアム研究ポータル(AD Knowledge Portal、NF-OSI、PsychENCODE、HTAN、DREAM challenges など):Synapse_search_entities は、キーワードで公開 Synapse プロジェクト/フォルダー/ファイル/テーブル/データセットを検索します(node_type で絞り込みます)。Synapse_get_entity はキュレーション済みの注釈(アッセイ、種、組織、疾患)を返し、Synapse_list_children はプロジェクトを閲覧します。匿名で読み取り専用です。アクセス制限のあるエンティティは「not public」という明確なエラーを返し、ファイルの内容はダウンロードされません。データへのアクセスは引き続き synapse.org を通じて行います。

レイヤー 3 — 文献に基づく探索: 多くのデータセットはどのリポジトリにも登録されておらず、論文の方法セクションで説明されています。

  • PubMed/EuropePMC で、関心のある関係性を分析した論文を検索します
  • 方法を読みます。「We used data from [DATASET NAME]」とあれば、何が存在するかを正確に確認できます
  • 補足資料を確認し、登録データ(GEO/SRA のアクセッション番号)を探します
  • ニッチなデータセットを見つけるには、これが最も効果的な方法であることがよくあります

ステップ 3:データセットの適合性を評価する

候補となる各データセットについて、次の項目を評価します。

変数:

  • 必要としている具体的な曝露変数とアウトカム変数が含まれていますか?
  • 必要な方法で測定されていますか?(バイオマーカーか自己申告か、連続変数かカテゴリ変数か)
  • 主要な交絡因子は利用できますか?(交絡因子が欠けていると、分析に偏りが生じます)

研究デザインとの適合性:

  • 縦断研究が必要な場合:同じ対象者を追跡していますか?調査時点はいくつありますか?追跡間隔はどのくらいですか?
  • 注意:「反復横断調査」(各調査時点で異なる人を対象とするもの)は、縦断研究ではありません。
  • 実験研究が必要な場合:適切な対照群はありますか?ランダム化されていますか?

サンプル:

  • サンプル数は分析に十分ですか?(ロジスティック回帰では、予測変数あたり約10件のイベントが必要です)
  • 対象集団は一致していますか?(年齢範囲、地域、臨床的特徴)
  • 必要なサブグループはありますか?(性別、人種、疾患の有無による層別化)

アクセス:

  • 公開ダウンロード可能(最適)か、登録が必要(数日)か、共同研究契約が必要(数か月)か、利用制限あり(利用できない可能性もあります)か
  • データ形式:CSV/TSV(簡単)、XPT/SAS(変換が必要)、独自形式のデータベース(特別なソフトウェアが必要な場合があります)

品質:

  • 方法が公表されている、よく知られた研究のデータですか?(NHANES、HRS、UK Biobank は高品質です)
  • 査読付き論文で使用されていますか?(データが利用可能であることを示します)
  • 回答率や欠損のパターンはどうなっていますか?

ステップ 4:ダウンロードして分析する

データセットを見つけるだけで終わらせず、ダウンロードして分析してください。Bash 経由で Python コードを記述し、実行してください。「こうするつもりです」と説明するだけではなく、実際に実行してください。

データ読み込みの手引き

データソースに合ったローダーを選んでください。形式が不明な場合は、まず小さなサンプルをダウンロードして確認してください。

import requests, io, pandas as pd

# --- Tabular files (most common) ---
df = pd.read_csv("data.csv")                                # CSV / TSV (use sep="\t" for TSV)
df = pd.read_excel("data.xlsx")                              # Excel
df = pd.read_stata("data.dta")                               # Stata
df = pd.read_sas("data.xpt", format="xport")                # SAS transport (XPT)
df = pd.read_sas("data.sas7bdat", format="sas7bdat")        # SAS native
df = pd.read_parquet("data.parquet")                         # Parquet
df = pd.read_json("data.json")                               # JSON (records or columnar)
df = pd.read_fwf("data.dat")                                 # Fixed-width (some legacy surveys)

# --- Download from URL first, then parse ---
resp = requests.get(url, timeout=120)
content = resp.content
# Detect format from URL or content header
if url.endswith(".XPT") or url.endswith(".xpt"):
    df = pd.read_sas(io.BytesIO(content), format="xport")
elif url.endswith(".csv") or url.endswith(".csv.gz"):
    df = pd.read_csv(io.BytesIO(content))
elif url.endswith(".tsv") or url.endswith(".tsv.gz"):
    df = pd.read_csv(io.BytesIO(content), sep="\t")
elif url.endswith(".json"):
    df = pd.read_json(io.BytesIO(content))
else:
    # Try CSV first, then inspect
    df = pd.read_csv(io.BytesIO(content))

# --- REST API pagination (common for GDC, ClinicalTrials.gov, etc.) ---
import json
all_records = []
offset = 0
while True:
    resp = requests.get(f"{api_url}?offset={offset}&limit=100", timeout=30)
    batch = resp.json().get("data", [])
    if not batch:
        break
    all_records.extend(batch)
    offset += len(batch)
df = pd.DataFrame(all_records)
結合、クリーニング、分析
# Merge multiple files on participant/sample ID
merged = df1.merge(df2, on="id_col", how="inner")

# Filter population
subset = merged[(merged["age"] >= 60) & (merged["age"] <= 80)].copy()

# Handle missing values
missing_pct = subset.isnull().mean() * 100
print("Missing % per variable:\n", missing_pct[missing_pct > 0].sort_values(ascending=False))
subset = subset.dropna(subset=["exposure_var", "outcome_var"])

# Quick regression
import statsmodels.formula.api as smf
model = smf.ols("outcome ~ exposure + age + sex", data=subset).fit()
print(model.summary())

# Visualization
import matplotlib.pyplot as plt
plt.scatter(subset["exposure"], subset["outcome"], alpha=0.3)
plt.xlabel("Exposure"); plt.ylabel("Outcome")
plt.savefig("/tmp/scatter.png", dpi=150, bbox_inches="tight")

必ずコードを実行し、実際の数値(β、p 値、CI、N)を報告してください。

ステップ 5:誠実に報告する

レポートは次の構成にしてください。

  1. 利用可能な最適なデータセット — 名前、含まれるデータ、アクセス方法、主な制約
  2. 分析結果 — コードを実行して得られた実際の統計量(β、p 値、CI、N)
  3. 代替データセット — 適合性の高い順に、利点と欠点を示す
  4. 回答できないこと — 必要な研究デザインに合うデータセットがない場合は、その旨を明確に伝える
  5. 推奨される次のステップ — 縦断データへのアクセスを申請する、ほかのコホートで再現する

誠実さに関する重要なルール:

  • 横断データで時間的な問いに答えられると決して主張しないでください。
  • 「データは存在するが登録が必要」と「データが存在しない」を区別してください。
  • 仮定上の分析ではなく、実際に計算した統計量を報告してください。
  • 依頼された内容より弱い分析になったとしても、利用可能なデータで可能な最も強力な分析を明示してください。

推測せず、調べる

データセットが存在すると決めつけず、検索してください。アクセスが公開されていると決めつけず、確認してください。変数が必要な方法で測定されていると決めつけず、コードブックで確認してください。

コメント