シミュレーションの結果と論文の結果が常に同期していることを確認するにはどうすればよいですか?


34

私の論文の1つでは、いくつかの数値に加えていくつかの数値結果をリストしています。私がやりたいのは、論文の数値結果が常にコードと一致することを確認することです。今は、シミュレーション結果から数値結果を紙に直接コピーします。これは非常にシンプルでローテクですが、結果を誤ってコピーしたり、紙の結果をコード出力。

論文で引用した数値結果を、コードで生成された結果と同期させる良い方法はありますか?(ここでは、コードを実行することは、論文を更新したいときはいつでも簡単で実用的であると想定しています。)これらの数値結果は、必ずしも表形式に適しているとは限りません。原稿に表がある場合もありますが、より一般的には、方程式の数値としてシミュレーションパラメーターがリストされています。例は次のようになります。

y=(y1,,yn)

ここで、初期条件の要素を置き換えたいy常微分方程式系を数値的に積分するシミュレーションで使用する実際のパラメーターにます。この例のような1回限りのデータにテーブルを使用すると、過剰になり、必要以上にインクが多くなります。

図は簡単なケースだと思います:ドキュメントが(LaTeXソース、Markdown、RSTなどから)ビルドされるたびに、コードを実行してビルドプロセスを開始します。しかし、私のシミュレーションで生成された数値を私の論文と同期させるためのより良い提案があれば、ぜひ聞いてみてください。

回答:


14

いくつかのコメントが示唆したように、このアプローチは、長い上構築することにより、Rコミュニティで開発されたSweave、より最近ではとknitr。明らかに、このアプローチには、現時点では言語固有であるという欠点がありますが、学術論文で定期的に使用されているという利点があります。

実際の出版物でのSweaveの使用

  • 生物統計学のジャーナルは、これらの提出を奨励し、reproduciblityエディタは、コードとデータを実行し、これらの結果を得ることができされた学術論文にkitemark文字「R」を配置します。
  • 基本的に、Rジャーナルのすべての出版物はSweaveに基づいています。

もちろん、より一般的には、Sweave / knitrユーザーは、メソッドが実際に結果を再現するという個人的な自信を持って、最終出力のみをほとんどのジャーナルに送信します。同様に、sweaveは、プロの講演などのスライドを作成するためによく使用されます。

便利な機能

実際に役立つように、このようなシステムには特定の機能が必要です。非常に多くのユーザーがいるため、これらの多くはでよく開発されていknitrます。いくつかのハイライト:

  • キャッシング。出力を表示するためにコンパイルする必要があるマークダウンやラテックスなどの形式で記述すると、結果をキャッシュできない場合にコードを含めることができなくなります。巧妙なキャッシングは、成功したチャンクを再実行する必要がないためknitr、pure Rでの作業よりも集中的なコードのデバッグを実際に簡単にします。

  • コード表示を切り替えます。正式な出版物では、基礎となるコードを出力に表示したくない場合があります。一方、読者が入力内容を正確に確認できるようにするには、出力形式で結果を生成する(適切に書式設定され、構文が強調された)コードを表示することが重要です。

  • コミュニティ。おそらく、自作のソリューションに対するこのアプローチの最も説得力のある利点は、モデルに精通しており、モデルを改善しようとしている人々の数です。

  • 他の機能の優れた例の多くは、「軽量公開」またはWebでの共有のためのツールを含むknitr Webページのデモにあります。これらの機能の多くは、原稿を書くときにのみ行うことよりも、このアプローチを自分の一般的なワークフローとの互換性を高めるのに役立ちます。

歴史的な脚注。

名前が示すように、Knuthの「リテラシープログラミング」に根ざしていますが、リテラシープログラミングはソフトウェアコードとドキュメンテーションの接続に重点を置いているため(Rコミュニティでは、その役割はRoxygen、 「読み書き可能なプログラミングツリー」)。

を超えて

原則として、たとえばインタラクティブなオンラインプラットフォームを使用して、ドキュメント全体を編集および再コンパイルすることなく、入力を変更して出力を表示するリーダーの機能など、動的なドキュメントにさらに多くを求めることができます。 XDynDocsは、この方向への一歩かもしれません。

その他のアプローチ

  • dexy.itを監視したい場合があります
  • 少し異なるアプローチで:http://www.runmycode.org/の出版物に関連するコードをホストする経済学論文が増えており、クラウド上で分析を再実行し、カスタム入力パラメーターまたはカスタム入力データを許可します。

Carl、私はしばらくの間あなたのウェブサイトをフォローしてきましたが、knitrでのあなたのアプローチは私の質問のインスピレーションの1つでした。Zed Shawはそれを使って、How To Learn Python the Hard Waygit repoを参照)の本のソースを構築するため、しばらくの間dexyをフォローしています。他のリテラシープログラミングアプローチとは対照的に、私がdexyで気に入っているのは、コードとテキストが疎結合であり、デバッガーを正常に使用できることです。
ジェフオックスベリー

ジェフ、クール、コメントありがとう!アンナ・ネルソンもデカップリングを大いに信じています。Rユーザーは、コードの外部化、または新しいspin()関数を使用してknitrのデカップリングを実現できます。個人的には、Greg Wilsonのリテラシープログラミングに関する苦情はかなり古いものだと思います。私は彼がnowebで説明したのと同じひどい経験をしましたが、その複雑なデバッグは最新のツールには存在しません。識字CIにはdoxygenを使用します。Knitrは、キャッシングと環境処理のおかげで、Rよりもデバッグが簡単です。
cboettig

20

あなたが求めているのは、「Executable Paper」のElsivierグランドチャレンジです。多くのアプローチが試みられましたが、著者が示唆するほど説得力のあるものはありません。使用されるテクニックの例をいくつか示します。

マダガスカルプロジェクトは、makeスクリプト内で、フィギュアとペーパーを同時に生成するシミュレーションを実行します。

IPython Notebookは、あなたが心のコンテンツを読んで作成するときに実行できるドキュメントを提供します。(Wordプラグイン、Mathematica、および同じ方法で使用される他の多数のソリューションを見てきました)

VisTrailsは、サービス指向アーキテクチャアプローチを使用し、「信頼」または「ワークフロー」マネージャーを提供します。基本的には、フックをコードに登録してから、作業を再現するワークフローまたは実験を設計します。HPCクラスターも含め、多くの種類のコードで使用されています。このアプローチを使用すると、実験を再現する方法があります。

これらのタイプのソリューションはたくさんありますが、それらは私が感銘を受けた3つです。それは難しい問題であり、私たちは本当に対処することすら近くないと信じています。論文でコードを公開することさえできません。結果を再現することを期待できますか?= P


同様の方法でsweaveがありますが、これは私が使用しているものではなく、概念的に興味深いものです。
dmckee

マダガスカルプロジェクトは、著者の1人による講演を聞いたときに興味深いものになりそうでした。私は実際にそれを使用しようとしませんでした。
ケン

@dmckee:sweaveとknitrで大成功を収めた人々を知っています。Greg WilsonがSoftware Carpentryに与えたのと同じ理由で、文芸的プログラミングアプローチには不満です。紙とコードが密に結合されているため、コード上でデバッガーを実行するのが難しくなりますテキスト)。
ジェフオックスベリー

私はこの目的でSweaveを使用していますが、非常にうまく機能し、Lyxと互換性があります。組織モードはさらに優れており、ほとんどの一般的な言語をサポートしています。
デビッドルバウアー

13

私は、この問題に対する他の人のソリューションを使用することにあまり成功していません。私は通常、自分のために働き、仕事を成し遂げるシンプルなものが欲しいだけです。このために、私は通常、すべての結果の実行、出力の解析、および図/表の作成を担当する1つのpythonスクリプトを作成しようとします。

コードを記述して、結果をテキスト形式で含むデータファイルを生成します。出力ファイルの存在を最初にテストすることにより(たとえば、os.path.isfile()を使用してPythonで)、スクリプトでこれらの結果を再実行することを回避できます。結果を再実行する場合は、データファイルを削除するだけです。データファイルが存在する場合、これらのファイルのパーサーを実行します。このため、正規表現用のpythonモジュールは非常に便利です(再)。

次に、解析された出力から、図または表を作成します。latexのテーブルの場合、コードを記述して別のファイルにテーブルを生成し(拡張子.tblを使用)、これをラテックスファイルに含めることができます。私にとって重要なのは、1つのpythonスクリプトを使用することです。私がたくさんいるなら、私は後でどれがどれで、何をするのか疑問に思います。この説明があいまいすぎる場合は、いくつか例を示します。


1
私はすでにこのようなことを図に対して行っています。ただし、私が書いている論文では、テーブルはデータを表示するのに不自然な形式になります。多くの場合、初期条件をODE(実際には、4〜6個の数値のようなもの、コンマで区切られたもの)、または方程式の右辺の一部としての数値のマトリックス全体に含めたいだけです。テーブルのアイデアが好きです。私が述べたこれらのケースでは、テーブルとして再フォーマットするのは不自然だと感じており、より自然な形式でデータを含めたいと思います。
ジェフオックスベリー

ネイサン、例を投稿してもいいですか?テキストファイルをgitにコミットし、gitを使用して結果を管理することを除いて、同じアプローチを使用します。それから、プロット/テーブルを作成するPythonスクリプトがあります。プロットまたはテーブルごとに1つのスクリプトがあります。
オンデジČertík12年

コマンドを使用して、シェルスクリプトの出力を直接latexにパイプすることもでき\input{|"path-to-script.py"}ます。すべてのパラメーターを単一のpython(またはお気に入りの言語)ファイルに入れ、コマンドラインパラメーターを使用してにアクセスする方が良いと思います\input{|"path-to-script.py param-name"}。この場合、他のスクリプトにparamファイルを含めてシミュレーションを実行できます。ただし、コンパイルが遅くなり、その他のマイナス面がいくつかあります。
ヘリウム


7

さらに重要なことは、私の意見では、1か月または1年ですべての結果をゼロから再生成する方法を見つけることができることを確認することです(たとえば、審判が何かを追加または変更するように求めた場合)。そのために、私が行うことは、すべての結果を再現する方法についての非常に詳細な指示を含むテキストファイルを含めることです。他の人(共著者など)に試してもらい、これらをテストするのが最善です。これらの指示(およびすべてのコード)を審判と読者にも提供することをお勧めします。

ここでは一例である(実際に私の共著者、アロンAhmadiaにより調製は)。


私はそれを以前に(自分の正気のために)しましたが、ありがたいことに、アドバイザーが私に結果を再生成して再確認するように頼んだときに報われました。それ以来、すべてを下書きの付録に実行するスクリプトのソースコードをダンプするだけに切り替えて、そこにあるので、私は何をしたかを知っています.1つのボタンをクリックしてすべての数字と数字を取得できます。
ジェフオックスベリー

このスクリプトは、MATLABスクリプトであるため、現在インストールを行いません。関数のドキュメントでは、サードパーティのパッケージへの依存関係がリストされています。これらのサードパーティパッケージには、インストール方法に関する明確なドキュメントがあります(また、ありがたいことに、積極的にサポートされ、優れた開発者がおり、メーリングリストがアクティブです)。
ジェフオックスベリー

6

EmacsのorgmodeとBabelの組み合わせはそれを達成します。Babelはさまざまなプログラミング言語およびスクリプト言語からコードスニペットを実行できます。たとえば、シミュレーションデータを含むファイルを開いて、orgmodeのテーブルに入れて、LaTeX(および他の多くの形式)にエクスポートできます。orgmodeのすべての主要なコンボに慣れるにはかなり時間がかかりますが、実行するとすべてが自動的に行われます。


私は組織モードが好きです。アウトラインに使用します。Babelでは使用していません。私はそれを試してみる必要があります。
ジェフオックスベリー

2012年1月のJ. Statからの優れた概要です。ソフトウェアjstatsoft.org/v46/i03/paper
デビッドルバウアー

LaTeXテンプレートをEuropean Physical Journal A(EPJ A)から組織モードファイルに変換する方法を示すチュートリアルを書きました。
Melioratus

4

すべてのコードを実行するのが安価な場合、次のようなローテクを行うことができます。

次のように書式設定された文字列を使用してドキュメントをテンプレート化できます

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

このようなPythonスクリプトを使用します

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

そして、このようなことをします

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

その後、これをMakefileでラップできます。


この質問を書いたときの私の最初の考えは、あなたが提案したような解決策のようなものでした。私はもともと、マクロプリプロセッサを使用するような低レベルの技術を考えていましたが、Pythonはおそらくより優れた(そして確かに読みやすい)アプローチであり、ビルドシステムは結果の増分再生成を処理できます。
ジェフオックスベリー

本当にこれは、Pythonサーバーページのようなものの非常に基本的な実装にすぎません。自動生成されたコンテンツのアイデアは、しばらくの間、Webコミュニティに存在していました。それが学界に移行するのを見るのは素晴らしいことです。
MRocklin

同意した。Jinja2を使用して、あなたが提案したことを実行できます。実際、それがdexyが行うことですが、構文の強調表示やその他の雑多なタスクも処理するクールなフィルターがたくさんあります。
ジェフオックスベリー

4

LaTeXを使用している場合、比較的ローテクのソリューションは、次のような行全体を含むコードをファイルから吐き出す(または、スクリプトを使用してコードの出力からフィルタリングする)ことです。

\newcommand{\myresults1}{<value>}

次に、\inputコマンドを使用してそのファイルをドキュメントに追加し、定義されたコマンドを使用して値を配置できます。


2

私はエルゼビアで働いています。私の会社は、ジャーナルの問題でCollageフレームワーク(Executable Paper Grand Challengeに対応して開発された)の使用を開始し、作成者が記事とともに実行可能コードのチャンクを発行できるようにしました。この機能により、読者は記事で報告された結果を簡単に再現し、公開された資料を自分の研究に再利用できます。Collageは、多種多様なオープンソースおよび独自のソフトウェアをサポートしています。詳細については、こちらの情報ビデオおよびCollage Authoring Environment Webサイトをご覧ください


2番目のリンクは、間違ったものへのリンクです。
デビッドケッチャソン

@Hylke Koers:このリンクを付けるつもりでした:collage.elsevier.com
ポール

@ポール:編集しました。元の2番目のリンクは、Collage Google Groupへでした。たぶん、より良いリンクはCollage自体になりますが、私の焦点は、投稿の善意を(ほとんど)維持しつつ、プロモーションのように聞こえる部分を削除することでした。必要に応じて投稿を自由に編集してください。
ジェフオックスベリー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.