Skip to main content
Glama

AMR-Climate Atlas — 气候对抗菌药物耐药性的因果归因

三个项目组成的气候-健康组合中的项目2(参见 ../harvard-dataverse-climate-health-projects.md)。范围界定:../amr-climate-causal-attribution-scoping.md · 构建计划:../amr-climate-causal-attribution-phases.md · 完整报告:docs/paper.md。

状态:所有四个阶段均已完成。 EU/EEA 面板(29个国家,2000–2023年,4种病原体-抗生素组合),一个经过充分测试的因果模型,一个基因组交叉验证,一个实时 Streamlit 应用,一个暴露实时数据源的 MCP 服务器,以及一个自动化评估门控验证流水线。

应用截图:K. pneumoniae/碳青霉烯组合,希腊2023年在耐药性分布顶部高亮,因果检验警告显示在图表上方

发现

一个双向(国家+年份)固定效应面板回归,每个结果在允许被称为显著之前,都必须通过强制性的200+次置换安慰剂检验:

组合

n

系数

参数p值

置换p值

E. coli / Fluoroquinolones

642

+0.11

0.77

0.62

E. coli / 3rd-gen cephalosporins

642

+0.21

0.54

0.31

K. pneumoniae / Carbapenems (2010-2022, consumption-adjusted)

355

−1.73

0.008

0.000

S. aureus / MRSA

667

−0.13

0.89

0.69

4种组合中有3种在任何地方都没有显示出天气效应。 唯一的例外——K. pneumoniae 碳青霉烯耐药性,在 ESAC-Net 消费调整后的2010–2022年子样本中——是真实的(留一国家检验稳定,非COVID驱动),并且方向性得到独立基因组测序数据的确认(NCBI Pathogen Detection/MicroBIGG-E,相同负号,与表型率 r=+0.38 相关),但在完整的2000–2023年面板中并未出现,而且抗生素消费本身在应该控制它的模型中并不显著。解读为:一个真实的、狭窄的、样本窗口特定的模式,而非已确认的气候→AMR因果联系。

这一结果经受住了真正的QA流程——一次独立的测试通过发现了消费调整模型上缺失的置换检验,而随后的稳健性检查发现了一个混杂因素列选择错误,这意味着抗生素消费实际上从未像最初报告的那样进入模型。两者都在 docs/paper.md 中坦率披露,而非掩盖。

Related MCP server: DMAP-AI MCP Server

本仓库内容

app.py                         Streamlit atlas — combo explorer, causal-test caveat, rankings
mcp_server/                    live-data MCP server (NASA POWER + BigQuery, not the frozen CSV)
data/
  eu_eea_pilot_panel.csv       joined country-year-combo panel (join_panel.py's output)
  validation_baseline.json     accepted "known good" snapshot for the eval-gate pipeline
  raw/                         gitignored raw pulls (ECDC, NASA POWER, ESAC-Net, EPI)
validation_runs/               timestamped JSON logs from validate_pipeline.py runs
docs/
  phase1_access_check.md       access-verification memo
  phase3_scoping.md            causal-design scoping, grounded in the real pilot data
  phase4_scoping.md            scale-up fork (WHO GLASS vs. BigQuery vs. deepen EU/EEA) + genomic cross-check
  paper.md                     full write-up: methods, bugs found and fixed, results
src/amr_climate_atlas/
  config.py                    country lists, centroids, DOIs, ECDC/NASA POWER/BigQuery constants
  fetch_ears_net.py            EARS-Net resistance rates via ECDC Atlas (fully scriptable, see below)
  fetch_esac_net.py            antibiotic-consumption confounder (static XLSX annexes, 2010-2022)
  fetch_weather_anomaly.py     daily weather per EU/EEA country centroid (NASA POWER)
  fetch_confounders.py         EPI 2024 tabular confounder from Harvard Dataverse
  join_panel.py                joins resistance + weather + EPI into the country-year panel
  stage3_identification.py     two-way FE model + mandatory permutation test + lag check, per combo
  compare_genomic_phenotypic.py genomic (BigQuery) vs. phenotypic (EARS-Net) cross-check
  validate_pipeline.py         automated eval-gate: rerun + placebo-sanity-check + baseline drift check
.github/workflows/validate.yml ready-to-run CI (fires once this repo is pushed to GitHub)

两个值得提前指出的发现

  1. ECDC的Surveillance Atlas导出完全可脚本化,不仅限于手动UI。 导出触发一个简单的参数化GET请求,其 downloadTokenId 参数实际上并未在服务器端验证——一旦会话cookie被引导,任何值都有效。fetch_ears_net.py 通过两个HTTP请求获取给定病原体-抗生素组合的完整国家×年份网格。

  2. Dataverse的API对默认的 python-requests User-Agent 返回403——在任何地方都没有文档说明,需要类似浏览器的UA(参见 config.DATAVERSE_REQUEST_HEADERS)。

快速开始

python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt

PYTHONPATH=src python -m amr_climate_atlas.fetch_ears_net        # ECDC EARS-Net resistance rates
PYTHONPATH=src python -m amr_climate_atlas.fetch_esac_net        # antibiotic consumption confounder
PYTHONPATH=src python -m amr_climate_atlas.fetch_weather_anomaly # NASA POWER, EU/EEA centroids
PYTHONPATH=src python -m amr_climate_atlas.fetch_confounders     # EPI 2024 from Dataverse
PYTHONPATH=src python -m amr_climate_atlas.join_panel            # join panel
PYTHONPATH=src python -m amr_climate_atlas.stage3_identification # causal model + permutation test

streamlit run app.py                                            # the live atlas

MCP服务器——实时数据,不仅仅是冻结的CSV

mcp_server/ 通过模型上下文协议暴露了该项目的两个数据源,因此任何兼容MCP的客户端(Claude Desktop、自定义代理)都可以按需查询实时天气或实时基因组AMR数据,而不仅仅是读取 eu_eea_pilot_panel.csv。基于Anthropic官方的 mcp Python SDK构建(不是早期范围草稿中使用的虚构的“MCP 2.0”/“Agent Plugins”术语——参见 mcp_server/README.md 了解完整的术语更正和一个真实的API漂移发现:大多数教程使用的 FastMCP 类已从当前SDK中移除)。使用真正的外部进程客户端(mcp_server/test_external_client.py)进行了测试,而不仅仅是进程内调用——巴黎的真实天气数据,法国大肠杆菌分离株的真实碳青霉烯基因流行率(16.83%)。参见 mcp_server/README.md 了解设置和一个已记录的命名怪癖(NCBI在其自身模式中将大肠杆菌归为 "E.coli and Shigella",而非 "Escherichia coli")。

自动化评估门控验证

validate_pipeline.py 将 stage3_identification.py 的拟合+置换检验自动化到一个可重新运行的关卡:如果置换检验的零分布看起来退化(对洗牌逻辑静默破坏的真实检查),或者结果与存储的基线有显著偏差,则失败。这旨在自动捕获上述混杂因素错误,而不仅仅是在人类碰巧仔细查看时。一个GitHub Actions工作流(.github/workflows/validate.yml)已准备好,一旦仓库在GitHub上,每次推送都会运行此操作。

延迟/默认不获取

GRDI v1.10(栅格GeoTIFF,932MB)和EnvClim(2.6GB地理包)——网格化/次国家级产品与国家-年份面板不成比例。fetch_confounders.py 打印其文件列表,以便未来的次国家级构建可以决定GIS工具投资是否值得。

Related MCP Connectors

Related MCP Servers