3

背景:

我正在运行蒙特卡洛模拟以表明特定过程(累积平均值)不会随着时间的推移而收敛,并且在模拟中经常会出现很大差异(随机变量的期望 = 无穷大)。我想在折线图上绘制大约 10 个这些模拟,其中 x 轴具有迭代次数,y 轴具有直到该点的累积平均值。

这是我的问题:

我将运行第一个模拟(每个模拟有 10,000 次迭代),并根据其当前范围构建主图。但通常其中一个模拟的范围比第一个大几个数量级,因此情节超出了原始范围。那么,有没有办法在添加一组新的点或线时动态更新绘图的 ylim 或 xlim ?

我可以为此想到两种解决方法:1.存储每个模拟,然后选择具有最大范围的模拟,并以此构建基本图(不优雅,我必须在内存中存储大量数据,但可能对笔记本电脑友好[[编辑:正如 Marek 指出的那样,这不是一个内存密集型的例子,但如果你知道一个很好的解决方案,它支持更多的迭代,这样它就会成为一个问题(想想高维需要大得多的 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 的关于贝叶斯统计的书中看到,使用 ts() 而不是 lines() 来计算累积和/均值很酷。它看起来很漂亮:

替代文字

于 2009-09-25T06:06:42.390 回答