关于 tooluniverse-dataset-discovery
ToolUniverse 的数据集发现技能,面向需要为研究问题寻找并评估数据的用户。它从明确研究设计和变量要求开始,指导跨仓库及领域检索、数据适配性评估,并强调核实访问条件和实际分析结果。
主要功能
- 01先确定研究设计与变量需求
- 02跨仓库及领域专门搜索
- 03评估设计、样本与变量匹配
- 04核实数据访问和质量
- 05下载、分析并报告实际结果
适用场景
- 01寻找适合特定问题的数据集
- 02区分横断面与纵向数据
- 03比较候选队列和调查数据
- 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 是否相关?” → 横断面研究足够(测量一次)
- “干预 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(美国;按变量名称搜索,而不是按主题关键词);DHS Program(
DHSProgram_search_indicators/_get_data),是国际/中低收入国家(LMIC)的对应资源——涵盖各国调查中的生育、孕产妇/儿童死亡率、营养、免疫接种、HIV 指标,可按国家和年份筛选 - 基因组学(开放数据):SRA、ENA、ArrayExpress、GEO 和 DDBJ(
DDBJ_search_entries/_get_entry/_get_cross_references)——与 SRA/ENA 并列的第三个 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 挑战赛等):
Synapse_search_entities可按关键词查找 Synapse 上的公开项目/文件夹/文件/表格/数据集(node_type可缩小搜索范围),Synapse_get_entity可返回整理后的注释(检测、物种、组织、疾病),Synapse_list_children可浏览项目。无需登录且仅支持只读:受限实体会返回明确的“非公开”错误,且不会下载文件内容——数据访问仍需通过 synapse.org 进行。
第 3 层——基于文献的发现: 许多数据集并未收录在任何仓库中,而是在论文的方法部分中进行了描述。
- 在 PubMed/EuropePMC 中搜索分析了你关注关系的论文
- 阅读论文的方法部分:“我们使用了来自 [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 步:如实报告
报告结构如下:
- 最佳可用数据集 — 名称、包含的内容、获取方式、主要局限
- 分析结果 — 运行代码后得到的实际统计数据(β、p 值、CI、N)
- 其他数据集 — 按适用程度排序,并说明各自的权衡
- 无法回答的问题 — 如果没有数据集符合所需的研究设计,请明确说明
- 建议的后续步骤 — 申请获取纵向数据,在其他队列中重复研究
诚实原则:
- 如果数据集是横截面的,绝不能声称它能回答时间相关问题
- 区分“数据存在但需要注册”与“数据不存在”
- 报告实际计算出的统计数据,不要报告假设性分析
- 说明使用现有数据所能进行的最有力分析,即使它弱于用户的要求
查证,不要猜测
绝不要想当然地认为某个数据集存在——要搜索确认。绝不要想当然地认为数据可公开获取——要核实。绝不要想当然地认为变量的测量方式符合需求——要查阅代码手册确认。
评论
支持 Markdown