Skip to main content
Glama

AMR-Climate Atlas — Kausale Attribution von Klima auf antimikrobielle Resistenzen

Projekt 2 eines Drei-Projekte-Portfolios zu Klima und Gesundheit (siehe ../harvard-dataverse-climate-health-projects.md). Scoping: ../amr-climate-causal-attribution-scoping.md · Bauplan: ../amr-climate-causal-attribution-phases.md · Ausführlicher Bericht: docs/paper.md.

Status: alle vier Phasen abgeschlossen. EU/EWR-Panel (29 Länder, 2000–2023, 4 Pathogen-Antibiotika-Kombinationen), ein ordentlich getestetes Kausalmodell, ein genomischer Quercheck, eine Live-Streamlit-App, ein MCP-Server, der die Live-Datenquellen bereitstellt, und eine automatisierte, eval-gesteuerte Validierungspipeline.

App-Screenshot: K. pneumoniae/Carbapeneme-Kombination, Griechenland 2023 hervorgehoben an der Spitze der Resistenzverteilung, mit dem Hinweis auf den Kausaltest über dem Diagramm

Die Erkenntnis

Eine Panel-Regression mit Zwei-Wege-Fixeffekten (Land + Jahr), mit einem obligatorischen Permutations-Plazebotest mit 200+ Wiederholungen für jedes Ergebnis, bevor es als signifikant bezeichnet werden darf:

Kombination

n

Coef

Parametrischer p

Permutations-p

E. coli / Fluorchinolone

642

+0.11

0.77

0.62

E. coli / Cephalosporine der 3. Generation

642

+0.21

0.54

0.31

K. pneumoniae / Carbapeneme (2010-2022, verbrauchsbereinigt)

355

−1.73

0.008

0.000

S. aureus / MRSA

667

−0.13

0.89

0.69

3 von 4 Kombinationen zeigen keinerlei Wettereffekt. Die eine Ausnahme — K. pneumoniae-Carbapenem-Resistenz in der ESAC-Net-verbrauchsbereinigten Teilstichprobe 2010–2022 — ist real (stabil bei Leave-one-country-out, nicht COVID-bedingt) und richtungsmäßig durch unabhängige genomische Sequenzierungsdaten bestätigt (NCBI Pathogen Detection/MicroBIGG-E, gleiches negatives Vorzeichen, r=+0,38 Korrelation mit der phänotypischen Rate), erscheint jedoch nicht im vollständigen Panel 2000–2023, und der Antibiotikaverbrauch selbst ist in dem Modell, das ihn kontrollieren soll, nicht signifikant. Zu lesen als: ein reales, enges, stichprobenfensterspezifisches Muster, kein bestätigter kausaler Klima→AMR-Zusammenhang.

Dieses Ergebnis hat einen echten QA-Prozess überstanden — ein unabhängiger Testdurchlauf deckte einen fehlenden Permutationstest für das verbrauchsbereinigte Modell auf, und ein späterer Robustheitscheck deckte einen Confounder-Spaltenauswahl-Bug auf, der bedeutete, dass der Antibiotikaverbrauch tatsächlich nie im Modell war, wie ursprünglich berichtet. Beides wird in docs/paper.md offen offengelegt, nicht übertüncht.

Related MCP server: DMAP-AI MCP Server

Was in diesem Repo ist

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)

Zwei vorab erwähnenswerte Erkenntnisse

  1. Der Export des ECDC-Surveillance-Atlas ist vollständig scriptbar, nicht nur über die manuelle Oberfläche. Der Export sendet einen einfachen parametrisierten GET, und sein downloadTokenId-Parameter wird serverseitig nicht wirklich validiert — jeder Wert funktioniert, sobald ein Session-Cookie initialisiert ist. fetch_ears_net.py zieht das vollständige Land×Jahr-Raster für eine gegebene Pathogen-Antibiotika-Kombination in zwei HTTP-Anfragen.

  2. Die Dataverse-API gibt dem Standard-python-requests-User-Agent eine 403-Antwort — nirgends dokumentiert, ein browserähnlicher User-Agent ist erforderlich (siehe config.DATAVERSE_REQUEST_HEADERS).

Schnellstart

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-Server — Live-Daten, nicht nur die eingefrorene CSV

mcp_server/ stellt zwei Datenquellen dieses Projekts über das Model Context Protocol bereit, sodass jeder MCP-kompatible Client (Claude Desktop, ein benutzerdefinierter Agent) Live-Wetter- oder Live-genomische-AMR-Daten auf Abruf abfragen kann, anstatt nur eu_eea_pilot_panel.csv zu lesen. Basierend auf dem offiziellen mcp-Python-SDK von Anthropic (nicht der erfundenen "MCP 2.0"/"Agent Plugins"-Terminologie, die ein früherer Entwurf dieses Scopes verwendete — siehe mcp_server/README.md für die vollständige Terminologiekorrektur und einen echten API-Drift-Befund: die FastMCP-Klasse, die die meisten Tutorials verwenden, wurde aus dem aktuellen SDK entfernt). Getestet mit einem echten externen Prozess-Client (mcp_server/test_external_client.py), nicht nur mit einem In-Process-Aufruf — echte Wetterdaten für Paris, echte Carbapenem-Gen-Prävalenz (16,83 %) für französische E. coli-Isolate. Siehe mcp_server/README.md für die Einrichtung und eine dokumentierte Namensbesonderheit (NCBI gruppiert E. coli in seinem eigenen Schema unter "E.coli and Shigella", nicht unter "Escherichia coli").

Automatisierte eval-gesteuerte Validierung

validate_pipeline.py automatisiert den Fit + Permutationstest von stage3_identification.py zu einem wiederholbaren Gate: Es schlägt fehl, wenn die Nullverteilung des Permutationstests degeneriert aussieht (ein echter Check, ob die Shuffle-Logik still bricht) oder wenn die Ergebnisse signifikant von einer gespeicherten Baseline abweichen. Dies ist so konzipiert, dass es den obigen Confounder-Bug automatisch erkannt hätte, nicht nur, wenn ein Mensch zufällig genau hinschaut. Ein GitHub-Actions-Workflow (.github/workflows/validate.yml) ist bereit, dies bei jedem Push auszuführen, sobald das Repo auf GitHub ist.

Aufgeschoben / standardmäßig nicht abgerufen

GRDI v1.10 (Raster-GeoTIFFs, 932 MB) und EnvClim (2,6 GB Geopackage) — gerasterte/subnationale Produkte, die für ein Land-Jahr-Panel unverhältnismäßig sind. fetch_confounders.py gibt ihre Dateilisten aus, damit ein zukünftiger subnationaler Build entscheiden kann, ob sich die Investition in GIS-Werkzeuge lohnt.

Related MCP Connectors

Related MCP Servers