Wie stelle ich sicher, dass die Ergebnisse meiner Simulationen und die Ergebnisse in meiner Arbeit immer synchron sind?


34

In einer meiner Arbeiten liste ich neben einigen Zahlen auch einige numerische Ergebnisse auf. Ich möchte sicherstellen, dass die numerischen Ergebnisse in meinem Artikel immer mit dem Code übereinstimmen. Im Moment kopiere ich die numerischen Ergebnisse von meiner Simulationsausgabe direkt in das Papier, was extrem einfach und technisch einfach, aber fehleranfällig ist, da ich die Ergebnisse falsch kopieren oder vergessen könnte, die Papierergebnisse mit den zu synchronisieren Code-Ausgabe.

Gibt es eine gute Möglichkeit, die numerischen Ergebnisse, die ich in meinen Artikeln zitiere, mit den Ergebnissen meines Codes zu synchronisieren? (Hier gehe ich davon aus, dass die Ausführung des Codes einfach und praktisch ist, wenn ich mein Papier aktualisieren möchte.) Diese numerischen Ergebnisse lassen sich nicht unbedingt in Tabellenform anzeigen. Manchmal habe ich Tabellen in Manuskripten, aber häufiger habe ich Simulationsparameter als Zahlen in Gleichungen aufgeführt . Ein Beispiel wäre so etwas wie:

y=(y1,,yn)

Hier möchte ich die Elemente der Anfangsbedingung durch die tatsächlichen Parameter ersetzen, die ich in einer Simulation verwende, die ein System gewöhnlicher Differentialgleichungen numerisch integriert. Die Verwendung einer Tabelle für einmalige Daten wie dieses Beispiel scheint zu viel zu bedeuten und mehr Tinte als erforderlich.y

Ich gehe davon aus, dass Zahlen ein einfacherer Fall sind: Wenn das Dokument "erstellt" wird (aus LaTeX-Quelle, Markdown, RST usw.), starten Sie den Erstellungsprozess durch Ausführen des Codes. Wenn die Leute jedoch bessere Vorschläge haben, um die von meinen Simulationen erzeugten Zahlen mit meinem Papier synchron zu halten, würde ich sie gerne hören.

Antworten:


14

Wie einige Kommentare andeuteten, wurde dieser Ansatz in der R-Community seit langem weiterentwickelt, indem auf Sweaveund in jüngerer Zeit aufgegriffen wurde knitr. Offensichtlich hat dieser Ansatz den Nachteil, im Moment sprachspezifisch zu sein, aber den Vorteil, dass er regelmäßig in wissenschaftlichen Arbeiten verwendet wird.

Verwendung von Sweave in realen Publikationen

  • Das Journal of Biostatistics regt diese Einreichungen an und versieht akademische Arbeiten mit einem Kitemarkierungsbuchstaben "R", in dem der Reproduzierbarkeitseditor den Code und die Daten ausführen und diese Ergebnisse erhalten konnte.
  • Grundsätzlich basieren alle Veröffentlichungen im R-Journal auf Sweave.

Gewöhnlich senden Benutzer von Sweave / knitr nur die endgültige Ausgabe an die meisten Journale, mit der persönlichen Gewissheit, dass die Methoden tatsächlich die Ergebnisse reproduzieren. Ebenso wird sweave oft verwendet, um Folien für professionelle Gespräche usw. zu erstellen.

Nützliche Funktionen

Um in der Praxis nützlich zu sein, sollte ein solches System bestimmte Merkmale aufweisen. Bei einer kritischen Masse von Anwendern sind viele davon in gut entwickelt knitr. Ein paar Höhepunkte:

  • Caching. Das Schreiben in einem Format wie Markdown oder Latex, das kompiliert werden muss, um die Ausgabe zu sehen, macht dies, einschließlich des Codes, unmöglich, wenn die Ergebnisse nicht zwischengespeichert werden können. Cleveres Caching knitrerleichtert das Debuggen von intensivem Code erheblich als das reine Arbeiten R, da erfolgreiche Chunks nicht erneut ausgeführt werden müssen.

  • Code-Anzeige umschalten. In einer formalen Publikation darf keiner der zugrunde liegenden Codes in der Ausgabe sichtbar sein. In der Zwischenzeit ist es oft nützlich, den (gut formatierten, syntaktisch hervorgehobenen) Code anzuzeigen, der die Ergebnisse im Ausgabeformat erzeugt, wenn der Leser genau sehen soll, was Sie eingeben.

  • Gemeinschaft. Der vielleicht überzeugendste Vorteil dieses Ansatzes gegenüber einer Homebrew-Lösung ist die Anzahl der Personen, die mit dem Modell vertraut sind und versuchen, es zu verbessern.

  • Viele schöne Beispiele für andere Funktionen finden Sie auf den Knitr-Webseiten-Demos , einschließlich Tools für "Lightweight Publishing" oder das Teilen im Web. Viele dieser Funktionen tragen dazu bei, dass dieser Ansatz besser mit dem allgemeinen Arbeitsablauf vereinbar ist und nicht nur beim Schreiben des Manuskripts.

Historische Fußnote.

Der Schwerpunkt liegt, wie der Name schon sagt, auf Knuths "literate programming", da sich die literate programming auf die Verknüpfung von Software - Code und Dokumentation konzentriert (in der R - Community spielt diese Rolle eine Rolle Roxygen, die ihre Wurzeln auf einen anderen Zweig von Knuth zurückführt) der "Literate Programming Tree").

Überschreiten

Grundsätzlich können wir von einem dynamischen Dokument viel mehr verlangen, beispielsweise die Fähigkeit des Lesers, die Eingaben zu ändern und die Ausgaben anzuzeigen, ohne das gesamte Dokument bearbeiten und neu kompilieren zu müssen, beispielsweise mithilfe einer interaktiven Online-Plattform. XDynDocs kann ein Schritt in diese Richtung sein.

Andere Ansätze

  • Könnte ein Auge auf dexy.it haben wollen
  • Ein etwas anderer Ansatz: Eine wachsende Anzahl von Wirtschaftspapieren hostet Code für Veröffentlichungen auf http://www.runmycode.org/ , der die Analysen in der Cloud erneut ausführt und benutzerdefinierte Eingabeparameter oder benutzerdefinierte Eingabedaten zulässt.

Carl, ich verfolge deine Website schon eine Weile und dein Umgang mit knitr war eine der Inspirationen für meine Frage. Ich verfolge Dexy auch schon eine Weile, weil Zed Shaw es benutzt, um die Quelle für sein Buch How To Learn Python the Hard Way (siehe Git-Repo ) zu erstellen . Was ich an Dexy im Gegensatz zu anderen Ansätzen der Alphabetisierung mag, ist, dass Code und Text lose gekoppelt sind, was eine vernünftige Verwendung eines Debuggers ermöglicht.
Geoff Oxberry

Geoff, cool, danke für die Kommentare! Anna Nelson glaubt auch sehr an die Entkopplung. R-Benutzer können die Entkopplung in Knitr mit Code-Externalisierung oder der neuen spin()Funktion durchführen. Persönlich denke ich, dass Greg Wilsons Beschwerden über Lese- und Schreibprogramme ziemlich veraltet sind. Ich hatte die gleiche schreckliche Erfahrung, die er mit noweb beschreibt, aber dieses verschlungene Debugging existiert in den modernen Tools einfach nicht. Zum Lesen und Schreiben verwende ich Sauerstoff. Knitr ist dank Caching und Umgebungshandling einfacher zu debuggen als R.
Cboettig

20

Was Sie fordern, ist die große Herausforderung von Elsivier für das "Executable Paper" . Obwohl viele Ansätze ausprobiert wurden, sind keine so überzeugend, wie die Autoren vermuten. Hier einige Beispiele für angewandte Techniken.

Madagascar Project verfolgt Ihren Ansatz, innerhalb des make-Skripts werden die Simulationen ausgeführt, die die Figuren und das Papier gleichzeitig produzieren.

IPython Notebook bietet ein Dokument, das Sie ausführen können, wenn Sie nach Herzenslust Zahlen lesen und produzieren. (Ich habe Word-Plugins, Mathematica und zahlreiche andere Lösungen gesehen, die auf dieselbe Weise verwendet wurden.)

VisTrails verwendet einen serviceorientierten Architekturansatz und bietet einen "Providence" - oder "Workflow" -Manager. Grundsätzlich registrieren Sie Hooks für den Code und entwerfen dann einen Arbeitsablauf oder ein Experiment, das Ihre Arbeit reproduziert. Es wurde für viele Arten von Codes verwendet, sogar für HPC-Cluster. Mit diesem Ansatz können Sie die Experimente nachvollziehen.

Es gibt Unmengen solcher Lösungen, aber das sind drei, von denen ich beeindruckt war. Es ist ein hartes Problem und ich glaube, wir sind nicht einmal in der Nähe der Adressierung. Wir können nicht einmal Leute dazu bringen, ihren Code mit ihren Papieren zu veröffentlichen. Wie können wir erwarten, dass sie die Ergebnisse reproduzieren? = P


In ähnlicher Weise gibt es Sweave , das ich nicht benutze, aber das Konzept ist faszinierend.
dmckee

Das Madagaskar-Projekt schien interessant zu sein, als ich einen Vortrag eines seiner Autoren hörte. Ich habe es aber nicht wirklich versucht.
Ken

@dmckee: Ich kenne Leute , die gehabt haben gute Erfolge mit Sweave und knitr . Ich bin aus den gleichen Gründen, die Greg Wilson in Bezug auf Software Carpentry anführt, misstrauisch gegenüber gebildeten Programmieransätzen : Das Papier und der Code sind zu eng miteinander verbunden, was es schwierig macht, einen Debugger für den Code auszuführen (und dem Proofing im Wege stehen könnte) der Text).
Geoff Oxberry

Ich benutze Sweave für diesen Zweck, es funktioniert sehr gut und ist mit Lyx kompatibel. Der Org-Modus ist noch besser und unterstützt die meisten gängigen Sprachen.
David LeBauer

13

Ich hatte nicht viel Erfolg darin, die Lösungen anderer Leute für dieses Problem zu verwenden. Normalerweise möchte ich nur etwas Einfaches, das für mich funktioniert und die Arbeit erledigt. Zu diesem Zweck versuche ich im Allgemeinen, ein Python-Skript zu schreiben, das alle Ergebnisse ausführt, die Ausgabe analysiert und die Abbildungen / Tabellen erstellt.

Ich schreibe meine Codes, um Datendateien zu generieren, die die Ergebnisse in einem Textformat enthalten. Sie können vermeiden, dass diese Ergebnisse in Ihrem Skript erneut ausgeführt werden, indem Sie zunächst prüfen, ob die Ausgabedatei vorhanden ist (in Python beispielsweise mit os.path.isfile ()). Wenn Sie Ihre Ergebnisse erneut ausführen möchten, entfernen Sie einfach die Datendateien. Wenn die Datendateien vorhanden sind, führe ich einen Parser dieser Dateien aus. Dafür ist das Python-Modul für reguläre Ausdrücke sehr nützlich (re).

Dann erstelle ich aus der analysierten Ausgabe die Zahlen oder Tabellen. Bei Latex-Tabellen können Sie den Code zum Generieren der Tabelle in eine separate Datei schreiben (ich verwende die Erweiterung .tbl) und diese dann in Ihre Latex-Datei einfügen. Der Schlüssel für mich ist, 1 Python-Skript zu verwenden. Wenn ich viele habe, frage ich mich später, welche welche sind und was sie tun. Wenn diese Beschreibung zu vage ist, kann ich Ihnen einige Beispiele schicken.


1
Ich mache so etwas schon für Figuren. In den Papieren, die ich schreibe, wären Tabellen jedoch ein unnatürliches Format, um die Daten darzustellen. Oft möchte ich wirklich nur die Anfangsbedingung in eine ODE aufnehmen (also wirklich so etwas wie 4-6 Zahlen, durch Kommas getrennt) oder eine ganze Zahlenmatrix als Teil der rechten Seite einer Gleichung. Ich mag deine Idee für Tische. In den genannten Fällen halte ich eine Neuformatierung als Tabellen für unnatürlich und möchte die Daten in einem natürlicheren Format einfügen.
Geoff Oxberry

Nathan, würde es dir etwas ausmachen, Beispiele zu posten? Ich benutze den gleichen Ansatz, außer dass ich die Textdateien in git festschreibe und git verwalte, um die Ergebnisse zu verwalten. Ich habe dann Python-Skripte, um Diagramme / Tabellen zu erstellen. Ich habe ein Skript pro Handlung oder Tabelle.
Ondřej Čertík

Sie können die Ausgabe eines Shell-Skripts auch mit dem Befehl direkt an latex leiten \input{|"path-to-script.py"}. Ich denke, Sie sollten alle Parameter in eine einzige Python- (oder welche Sprache auch immer Ihre Lieblings-) Datei schreiben und Befehlszeilenparameter verwenden, um darauf zuzugreifen \input{|"path-to-script.py param-name"}. In diesem Fall können Sie die param-Datei in andere Skripte einbinden, um die Simulationen auszuführen. Es verlangsamt jedoch die Kompilierung und weist einige andere negative Punkte auf.
Helium


7

Noch wichtiger ist meiner Meinung nach, dass Sie herausfinden können, wie Sie alle Ihre Ergebnisse in einem Monat oder einem Jahr von Grund auf neu generieren können (zum Beispiel, wenn Schiedsrichter Sie auffordern, etwas hinzuzufügen oder zu ändern). Zu diesem Zweck schließe ich eine Textdatei mit sehr detaillierten Anweisungen zur Reproduktion aller Ergebnisse ein. Testen Sie diese am besten, indem Sie sie von einer anderen Person (z. B. einem Co-Autor) ausprobieren lassen. Ich empfehle, dass Sie diese Anleitung (und Ihren gesamten Code) auch den Schiedsrichtern und Lesern zur Verfügung stellen.

Hier ist ein Beispiel (tatsächlich erstellt von meinem Mitautor Aron Ahmadia).


Ich habe das schon einmal gemacht (aus Gründen meiner eigenen Gesundheit), und zum Glück hat es sich ausgezahlt, als mein Berater mich bat, die Ergebnisse erneut zu generieren und zu überprüfen. Seitdem habe ich einfach den Quellcode eines Skripts kopiert, das alles in einem Anhang meiner Entwürfe ausführt, damit es dort ist. Ich weiß, was ich getan habe, und ich kann auf eine Schaltfläche klicken, um alle Zahlen und Zahlen abzurufen.
Geoff Oxberry

Das Skript führt derzeit keine Installation durch, da es sich nur um ein MATLAB-Skript handelt. In der Funktionsdokumentation werden Abhängigkeiten zu Paketen von Drittanbietern aufgelistet. Diese Pakete von Drittanbietern verfügen wiederum über eine klare Dokumentation zu deren Installation (und werden dankenswerterweise auch aktiv unterstützt, haben großartige Entwickler und aktive Mailinglisten).
Geoff Oxberry

6

Emacs Orgmode in Kombination mit Babel schafft das. Babel kann Code-Schnipsel aus verschiedenen Programmier- und Skriptsprachen ausführen, z. B. die Datei mit den Simulationsdaten öffnen und sie im orgmode in eine Tabelle einfügen, die nach LaTeX (und vielen anderen Formaten) exportiert werden kann. Es dauert eine Weile, bis man sich an alle Tastenkombinationen im Orgmode gewöhnt hat, aber sobald sie ausgeführt werden, erfolgt alles automatisch.


Ich mag org-mode; Ich benutze es für Umrisse. Ich habe es bei Babel nicht benutzt. Ich muss es ausprobieren.
Geoff Oxberry

Hier ist eine hervorragende Übersicht von Jan 2012 J. Stat. Software jstatsoft.org/v46/i03/paper
David LeBauer

Ich habe ein Tutorial geschrieben , in dem gezeigt wird, wie die LaTeX-Vorlage aus dem European Physical Journal A (EPJ A) in eine Datei im Organisationsmodus konvertiert wird.
Melioratus

4

Wenn Ihr gesamter Code billig ist, könnten Sie etwas Low-Teches tun, wie das Folgende:

Sie können Ihre Dokumente mit formatierten Zeichenfolgen so vorlegen, dass sie so aussehen

"we observed a %(fractional_improvement)s increase in ..."

Haben Sie Python-Skripte, die so aussehen

results = {"alpha"                  : run_alpha_computation(...),
           "fractional_improvement" : run_fi_computation(...), 
           ...}

Und dann mach so etwas

for fn in filenames:
    file = open(fn);      s = file.read();       file.close()
    file = open(fn, 'w'); file.write(s%results); file.close()

Sie können dies dann in ein Makefile einwickeln.


Mein erster Gedanke, als ich diese Frage schrieb, war eine Lösung, wie Sie sie vorgeschlagen haben. Ursprünglich dachte ich an etwas weniger technisches wie die Verwendung eines Makro-Präprozessors, aber Python ist wahrscheinlich ein besserer (und mit Sicherheit besser lesbarer) Ansatz, als ein Build-System, das die inkrementelle Regeneration von Ergebnissen bewältigt.
Geoff Oxberry

Dies ist wirklich nur eine sehr einfache Implementierung von Python-Server-Seiten. Die Idee von automatisch generierten Inhalten gibt es schon seit einiger Zeit in der Web-Community. Es wäre schön zu sehen, dass es in die akademische Welt abwandert.
MRocklin

Einverstanden. Jinja2 könnte verwendet werden, um das zu tun, was Sie vorgeschlagen haben. Tatsächlich ist es das, was Dexy tut, aber mit einer Reihe cooler Filter, die auch Syntax-Hervorhebungen und andere verschiedene Aufgaben erledigen.
Geoff Oxberry

4

Wenn Sie LaTeX verwenden, besteht eine relativ einfache Lösung darin, Ihren Code aus einer Datei ausspucken zu lassen (oder mithilfe eines Skripts aus der Codeausgabe herauszufiltern), die eine ganze Reihe von Zeilen wie diese enthält:

\newcommand{\myresults1}{<value>}

Anschließend können Sie mit dem \inputBefehl diese Datei in Ihr Dokument einfügen und die definierten Befehle verwenden, um die Werte zu platzieren.


2

Ich arbeite für Elsevier. Mein Unternehmen hat damit begonnen, das Collage-Framework (das als Reaktion auf die "Executable Paper Grand Challenge" entwickelt wurde) in Zeitschriftenausgaben zu verwenden, damit Autoren mit ihrem Artikel ausführbaren Code veröffentlichen können. Diese Funktion erleichtert es den Lesern, die im Artikel gemeldeten Ergebnisse zu reproduzieren und veröffentlichtes Material für ihre eigene Forschung wiederzuverwenden. Collage unterstützt eine Vielzahl von Open-Source- und proprietären Programmen. Weitere Informationen finden Sie im Informationsvideo hier und auf der Collage Authoring Environment-Website .


Das zweite Glied ist das Falsche.
David Ketcheson

@Hylke Koers: Wollten Sie diesen Link setzen: collage.elsevier.com ?
Paul

@Paul: Ich habe die Änderungen vorgenommen. Der ursprüngliche zweite Link war die Collage Google Group. Vielleicht wäre ein besserer Link zu Collage selbst, aber mein Fokus lag darauf, die guten Absichten des Beitrags (meistens) zu bewahren, während die Teile entfernt wurden, die ihn zu Werbezwecken machten. Fühlen Sie sich frei, den Beitrag zu bearbeiten, wie Sie es für richtig halten.
Geoff Oxberry
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.