Zum Inhalt springen
Menü der Dokumentation

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:

README.md
| 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:

python
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:

R
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"))

Diese Prüfung für Ihr Repository

Jede Analyse liefert Befunde zu dieser Prüfung, mit Dateiverweisen und Korrekturvorschlägen.