3

バックグラウンド:

モンテカルロ シミュレーションを実行して、特定のプロセス (累積平均) が時間の経過とともに収束せ、シミュレーションで大きく発散することが多いことを示しています (確率変数の期待値 = 無限大)。これらのシミュレーションの約 10 個を折れ線グラフにプロットしたいと思います。ここで、x 軸には反復回数があり、y 軸にはその時点までの累積平均があります。

これが私の問題です:

最初のシミュレーション (各シミュレーションで 10,000 回の反復) を実行し、現在の範囲に基づいてメイン プロットを作成します。しかし、多くの場合、シミュレーションの 1 つが最初のものよりも数桁大きい範囲を持つため、プロットは元の範囲から外れます。では、新しい点または線のセットを追加したときに、プロットの ylim または xlim を動的に更新する方法はありますか?

これには 2 つの回避策が考えられます: 1. 各シミュレーションを保存し、次に範囲が最大のものを選択し、それからベース グラフを作成します (エレガントではなく、大量のデータをメモリに保存する必要があります。 [[編集: マレクが指摘するように、これはメモリ集約型の例ではありませんが、問題になるようなはるかに多くの反復をサポートする優れたソリューションを知っている場合 (高次元を考えてください)収束のためにはるかに大きな MC サンプルを必要とするウォーク) 次に、すぐにジャンプします]] ) 2. 見栄えの良いバージョンを構築するように見えるシードを見つけ、ylim を手動で設定します。これにより、デモが再現可能になります。

当然のことながら、私は回避策よりもエレガントなものを求めています。Rでのシミュレーションでは珍しいことではないと思うので、これがあまりにも平凡な問題ではないことを願っています.何かアイデアはありますか?

4

2 に答える 2

5

ベースグラフィックスを使用してこれが可能かどうかはわかりません。誰かが解決策を持っているなら、ぜひ見てみたいです。ただし、グリッド (lattice および ggplot2) に基づくグラフィック システムでは、グラフィック オブジェクトを保存および更新できます。ggplot2 ではめちゃくちゃ簡単です。

require(ggplot2)

いくつかのデータを作成し、範囲を取得します。

foo <- as.data.frame(cbind(data=rnorm(100), numb=seq_len(100)))

最初の ggplot オブジェクトを作成してプロットします。

p <- ggplot(as.data.frame(foo), aes(numb, data)) + layer(geom='line')
p

さらにデータを作成し、プロットに追加します

foo <- as.data.frame(cbind(data=rnorm(200), numb=seq_len(200)))

p <- p + geom_line(aes(numb, data, colour="red"), data=as.data.frame(foo))

新しいオブジェクトをプロットする

p
于 2009-09-25T06:52:48.410 に答える
0

(1)がベストだと思います。実際、これはエレガントではないと思います。xlim または ylim よりも大きなポイントに到達するたびに再描画すると、計算量が増えると思います。

また、Peter Hoff のベイジアン統計に関する本で、累積合計/平均に lines() の代わりに ts() をうまく使用しているのを見ました。それはかなり気の利いたように見えます:

代替テキスト

于 2009-09-25T06:06:42.390 に答える