Menü der Dokumentation
- Startseite
- Dokumentation
- Reproduzierbarkeitsprüfungen
- Research Traceability
Experiment-Logging und Rückverfolgbarkeit zum Paper
Eine Metrikdatei ohne Konfiguration, Seed und Commit lässt sich keinem Ergebnis zuordnen. Protokollieren Sie jeden Lauf und ordnen Sie Ihre Skripte dem Manuskript zu.
Zuletzt aktualisiert
In Ihrem Bericht
- Bereich
- Execution
- Prüfung
- Research Traceability
Warum das wichtig ist
Monate nach der Einreichung fragen Gutachtende, warum sich eine Abbildung verändert hat. Die Antwort dauert Minuten, wenn jeder Lauf Konfiguration und Commit festgehalten hat, und Tage, wenn die Abbildung aus einem nie gespeicherten Notebook-Zustand stammt.
Drei der Ten Simple Rules for Reproducible Computational Research gehören hierher: festhalten, wie jedes Ergebnis entstanden ist, manuelle Datenbearbeitung vermeiden und die Rohdaten hinter Abbildungen speichern.
So sieht gute Praxis aus
- Jeder Lauf hinterlässt neben seinen Ausgaben ein Protokoll: Konfiguration, Seed, Metriken, Git-Commit und Paketversionen.
- Parameter stehen in Konfigurationsdateien oder Kommandozeilen-Optionen, sodass sich ein Lauf allein aus seinem Protokoll wiederholen lässt.
- Eine Tabelle im README ordnet jede Abbildung und Tabelle ihrem Befehl zu.
- Läufe für das Paper liegen getrennt von explorativen Läufen, etwa in
results/paper/. - Skripte statt Bearbeitung in Tabellenkalkulationen oder manuellem Filtern; ein unvermeidbar manueller Schritt ist beschrieben.
So beheben Sie es
Legen Sie im README eine Zuordnung zum Paper an, eine Zeile pro Abbildung oder Tabelle:
| Paper | Befehl | Ausgabe |
|------------|--------------------------------------------------------|---------------------|
| Abb. 2 | Rscript analysis/figure2.R | results/figure2.pdf |
| Tabelle 1 | python -m analysis.table1 --config configs/table1.yaml | results/table1.csv |Python. Schreiben Sie bei jedem Lauf Konfiguration, Seed und Commit neben die Ausgaben:
import json, subprocess, sys
from datetime import datetime, timezone
from pathlib import Path
def record_run(cfg: dict, out_dir: Path, metrics: dict) -> None:
commit = subprocess.run(["git", "rev-parse", "HEAD"],
capture_output=True, text=True).stdout.strip()
out_dir.mkdir(parents=True, exist_ok=True)
(out_dir / "run.json").write_text(json.dumps({
"config": cfg, # includes cfg["seed"]
"metrics": metrics,
"git_commit": commit,
"python": sys.version,
"finished_at": datetime.now(timezone.utc).isoformat(),
}, indent=2))R. Lesen Sie Parameter aus YAML und speichern Sie sie mit sessionInfo() neben der Abbildung:
cfg <- yaml::read_yaml("configs/figure2.yaml")
set.seed(cfg$seed)
# ... analysis using cfg$resolution, cfg$min_cells ...
out <- "results/figure2"
dir.create(out, recursive = TRUE, showWarnings = FALSE)
yaml::write_yaml(cfg, file.path(out, "config_used.yaml"))
writeLines(capture.output(sessionInfo()), file.path(out, "sessionInfo.txt"))Verwandte Themen
- Zahlen und Abbildungen zum Code zurückverfolgen
- Manuskript und Code im Einklang
- Seeds und Determinismus
Diese Prüfung für Ihr Repository
Jede Analyse liefert Befunde zu dieser Prüfung, mit Dateiverweisen und Korrekturvorschlägen.