2011-06-22 11 views
22

自分自身が大きな分析を完了した位置にあり、今や若干異なる入力仮定で分析を繰り返す必要があります。大量の分析を繰り返すための戦略

この場合の分析では、クラスター分析、複数のグラフのプロット、およびクラスターIDとその他の関心のある変数のエクスポートが行われます。要点は、それが広範な分析であり、繰り返され、2回比較される必要があることです。

私はみなさ:

  • 機能を作成します。これは理想的ではありません。なぜなら、関数または親環境で評価しているかどうかを知るためにコードを変更する必要があるからです。この追加の努力は過剰であると思われ、デバッグが難しくなり、副作用を招く可能性があります。
  • for-loopで囲みます。また、理想的ではありません。インデックス化変数を作成する必要があります。インデックス変数も副作用をもたらす可能性があります。
  • いくつかのプリアンブルコードを作成し、分析を別のファイルにラップし、sourceです。これは機能しますが、非常に醜く、最適ではないようです。

分析の目的は、私がさらに差異を分析できるオブジェクトのセット(リストまたは別々の出力ファイル)で終了することです。

このタイプの問題に対処するには、どのような戦略が適していますか?

答えて

17

コードを再利用できるようにするには、時間と労力がかかります。

おそらく情報学の重要な問題です(他の多くの分野にはない):同様の方法で50個のファイルの名前を変更するスクリプトを作成するのですか、それとも手作業で名前を変更するのでしょうか? 。

答えは、個人的にも非常に個人的でも、ケースによっても異なると私は信じています。プログラミングが簡単ならば、あなたの努力は比較的低くなります(そして、プログラマは通常新しいトリックを学ぶのが好きなので、隠された、しばしば逆効果のモチベーションです)ので、早く再利用ルートに行くことにします。

あなたの特別なケースでは、私はソーシングオプションを使用します:コードを2回だけ再利用する予定であるため、多大な労力を費やすことになります。 。では、それがエレガントなソリューションではない場合はどうなりますか?誰もあなたがそれをするのを見るつもりはなく、皆は迅速な結果に満足しています。

再利用が予想よりも高くなる1年またはそれ以上になった場合は、引き続き投資することができます。また、その時点では、少なくとも3つのケースがあります。このケースでは、コードの再利用およびファンキーな再利用可能なバージョンの結果を現在の結果と比較できます。

私がコードを再利用することを前もって知っている場合、開発中にそのことを念頭に置いています。いずれにしても、私は関数にはないコードを書くことはほとんどありません(SO、その他のすぐに使える2つのライナーを除いて):私の考えを構造化するのが簡単になります。

+0

+1これは2度だけ行うからです。答えはまた、分析のたびにどれくらい変わることになっているかにもよるが、いくつかのパラメータ、入力データ、 (1)主要なパラメータを抜き出してコードの先頭に定義すること[あるいは解析の本体を別のファイルとソース(source)に入れる]と(2)関数の中にコードの本体をラップします。あなたの親と機能環境の違いがここにあるのは私には分かりません。 –

+0

+1これは私が最後にやったことです。私は、実行ごとに変更されたすべてのパラメータをリストにまとめました。次に、それぞれの実行の入力値を含む別々のリスト(構造が同じ)を作成しました。各反復ごとに、必要なリストをコピーし、結果の変数を出力リストに保存しました。言い換えれば、プリアンブルとクリーンアップへのコードのラッピングと、完了した仕事。できます。それは醜い場合は大丈夫です... – Andrie

3

私は、これらのケースでは、小さなシェルスクリプト、pdfトリミングプログラムとSweaveの組み合わせで作業するのが好きです。それはあなたに良いレポートを返し、あなたに情報源を提供することを奨励します。通常、私はパッケージを作成するのとほぼ同じように、いくつかのファイルを扱います(少なくとも私はそれをそう感じています:)。私は、データジャグリングのために別々のファイルを用意しています。たとえば、descriptiveStats.R、regressions.Rなど、さまざまな種類の分析用ファイルを用意しています。

はところで、ここではSweaveファイルは通常、必要なときに、上述したRファイルをソース

#!/bin/sh 
R CMD Sweave docSweave.Rnw 
for file in `ls pdfs`; 
do pdfcrop pdfs/"$file" pdfs/"$file" 
done 
pdflatex docSweave.tex 
open docSweave.pdf 

、私の小さなシェルスクリプトです。それがあなたが探しているものなのかどうかはわかりませんが、それはこれまでの私の戦略です。私は少なくとも、透明で再現性のあるレポートを作成することが、少なくとも戦略に従うことに役立つと信じています。

+0

+1シェルスクリプトをもっと探求しなければなりません - 私はRでそれらを使わない傾向があります。これは、 "ソース"を使うことと同等か、少なくとも類似しているようです。 – Andrie

+0

それはOSによって少しずつ異なります。 Python、シェルスクリプト、リンゴスクリプトが私のニーズに最も適しているかどうかはまだ分かりませんが、Rでシェルスクリプトを見れば、特に自動化されたレポートのように見えるようです。 –

10

可能な場合は、外部パラメータファイルでセット/実行/実験の間で異なるパラメータを設定します。次に、コードをソースしたり、関数を呼び出したり、パッケージを利用することもできますが、操作は外部で定義された小さなパラメータのセットによって決まります。

たとえば、JSONはこれで非常にうまく動作し、RJSONIOrjsonパッケージではファイルをリストに読み込むことができます。 parametersNN.jsonというリストにロードしたとします。 "parameters01.json" と負荷のようにすることを

{ 
"Version": "20110701a", 
"Initialization": 
{ 
    "indices": [1,2,3,4,5,6,7,8,9,10], 
    "step_size": 0.05 
}, 
"Stopping": 
{ 
    "tolerance": 0.01, 
    "iterations": 100 
} 
} 

割引:次のように例がある

library(RJSONIO) 
Params <- fromJSON("parameters.json") 

、あなたはオフにして実行しています。 (注:私はR内の "parameters"リストを見ていれば、後でセットを識別できるように、私のパラメータファイル内でユニークなバージョン#を使用するのが好きです。)あなたのスクリプトを呼び出して、ファイル、例えば:

Rscript --vanilla MyScript.R parameters01.json 

、その後は、プログラム内で、commandArgs()関数からパラメータファイルを識別します。

コードを関数とパッケージに分割することができますが、これはおそらく短期間で一般化可能なバニラスクリプトを作成する最も簡単な方法であり、コードを分離する必要があるため長期的には良い方法です実行/データセット/実験依存パラメータの仕様から

編集:正確に言えば、私はJSONの入出力ディレクトリやファイル(またはパターン/接頭辞の名前)を指定することさえあります。これにより、1つのパラメータセットがどのように特定の出力セットにつながるかが非常に明確になります。間にあるものは、指定されたパラメータで実行されるコードですが、実際にコードを大きく変更しないでください。


更新: 3ヶ月、および実行の何千は、私の前の回答よりも賢く、私は、JSONのパラメータの外部記憶装置は、1-1000異なる実行するのに有用であることを言うと思います。パラメータまたは構成番号が数千以上の場合は、構成管理にデータベースを使用することに切り替えてください。それぞれの設定はJSON(またはXML)で始まる可能性がありますが、異なるパラメータレイアウトに取り組むには、SQLiteのようなデータベース(RSQLite経由)が優れたソリューションである大規模なソリューションが必要です。

私は、元の質問に対して、いくつかのパラメータの変更を繰り返して、何回か繰り返すしかないことを認識していますが、進行中のリサーチで数百または数千のパラメータを変更すると、必要。 :)

+0

これは私にとって非常に有益な答えでした。私は 'JSON'にいたらずにconfigディレクトリに小さな' .R'スクリプトを使用しました。グリッド・エンジンは、ジョブ名を含む環境変数を設定しているので、その名前を読み取って、同じ名前の構成ファイルをプルすることができます。私のニーズに適しています。それはあなたのように聞こえるはるかに実質的です! –

+1

@ AriB.Friedmanがお手伝いしてうれしい! DBのアプローチは何千もの人にとってうまくいくようです。それ以外の場合は、実験的デザインと同様にパラメータ設定を考えることができます。デザインのパラメータをDBに保存することができます。最終的に、異なるランが異なる結果をもたらす理由を知りたいことがあります。 – Iterator

1

私はそのような結果をグローバルリストにプッシュする傾向があります。 私はCommon Lispを使っていますが、Rはそれほど違いはありません。

+1

+1はい、これは私が最後にしたものです。変更が必要な変数のリストを作成し、結果を含む別のリストを作成します。次に、ローカル変数をリストの内外に切り替えます。 – Andrie

1

私はSweaveを多く使用していますが、最初からSweaveファイルを使用していました(たとえば、最終製品が何らかのレポートになる必要があると知っていれば)。結果はむしろ、「独立した」(すなわち、3つのレポートを生成する必要があり、比較レポートが検査されることを意味している場合

  • :分析の第二及び第三の時間を部品を繰り返す

    、2つのオプションがあります新しいデータファイルの形で提供され、Sweaveファイルのコピーとともに独自のディレクトリに移動し、別のレポートを作成します(ソースに似ていますが、Sweaveにとって自然な感じですプレーンソース用)。

  • もし私がちょうど1つのSweaveファイルの中でもう一度同じことをする必要があれば、コードチャンクを再利用することを検討したいと思います。これは、醜いfor-loopに似ています。

    その理由は、当然、結果が比較のためにまとめられており、それがレポートの最後の部分になるからです。

  • 最初からパラメータセットと比較があることが明らかな場合は、解析の各部分がうまく機能するとすぐに関数にラップされるようにコードを記述します(つまり、私は、エディタウィンドウに関数を書いていますが、関数を記述している間はワークスペース内の行を直接評価しています)。

はあなたが説明した状況にあることを考えると、私はニックに同意する - sourceと間違って何もして他のすべては、あなたがスクリプトとしてすでにそれを持っていることを、今より多くの努力を意味します。

2

あなたの3番目のオプションはそれほど悪くありません。私は多くの場合これを行います。あらかじめ用意されたコードの結果を環境に入れて、さらに分析するために使用したいコードを付けることで、より多くの構造を構築することができます。 例:

setup1 <- local({ 
      x <- rnorm(50, mean=2.0) 
      y <- rnorm(50, mean=1.0) 
      environment() 
      # ... 
     }) 

    setup2 <- local({ 
      x <- rnorm(50, mean=1.8) 
      y <- rnorm(50, mean=1.5) 
      environment() 
      # ... 
     }) 

attach(setup1)および実行/ソースあなた解析コード

plot(x, y) 
t.test(x, y, paired = T, var.equal = T) 
... 
終了

detach(setup1) 2つ目を付けます。

少なくとも、セットアップを簡単に切り替えることができます。何度かお手伝いしました。

+0

+1このアプローチは本当に面白いです。私は一般的に 'attach'を使わないようにしていますが、私はこの問題を回避する環境を作るという考えが好きです。私はこれをさらに探求します。 – Andrie

+0

私はAndrieが言及したように、 'attach'の使用について同じ注意を払って、これも好きです。これについてきちんとしているのは、それが単なるパラメータリストよりも一般的であり、計算を含むことができるということです。 – Iterator

関連する問題