在OpenBUGS中通过多次运行跟踪模拟时间序列与特定值的交点

时间:2014-10-13 20:29:44

标签: winbugs

我有一个OpenBUGS模型,它使用观察到的数据(y.values)随着时间的推移(x.values)模拟许多运行(~100000),每次运行的y值(y.est)的新估计。观察到的数据显示出最大值的显着下降。

我想跟踪每次运行从最大丰度(T.max)下降到最大丰度(T.10%)的10%所需的时间长度。由于最大丰度值在不同运行中发生变化,因此最大值的10%也会因运行而异,因此T.10%会因运行而异。

设置存储T.max的参数非常简单,不会因为运行而异,因为最大值足够大于任何其他值。

我无法弄清楚的是,如何存储y-est值和T.10%的交集。

我的第一次尝试是使用step()函数确定每个y-est值是高于还是低于T.10%:

above.below[i] <- step(T.10% - y.est[i])

这为每个y.est值生成一串1和0(例如,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1, 1,1,1,1,1,1,1等等。)如果每次运行只是从最大值到最小值连续下降,我可以使用rank()函数来确定有多少above.below[i]个值发生在T.10%以上:

decline.length <- rank(above.below[1:N], 0)

在此示例中,decline.length将等于上面字符串中的&#39; 0的数量,即9。不幸的是,y-est值偶尔会显示以下增长时段他们的跌幅低于T.10%。因此,above.below值的向量可以如下所示:0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,0,0,0,1,0,0,1,1,1,1等等。因此,decline.length等于14而不是9,给定后续的0在向量中。

我想要做的是弄清楚如何在第一个&#39;之前的above.below中仅存储&#39; 0的数量; above.below[1:10]而不是above.below[1:N]。不幸的是,它并不总是第一个第一个步骤,其中第一个&#39; 1&#39;发生这种情况,因此我需要在模拟过程中使above.below范围的最大范围因运行而异。

我在OpenBUGS中努力实现这一点,因为它是一种非程序性的语言,但我认为可以做到,我只是不知道这样做的诀窍。我希望有人更熟悉step()rank()函数可以提供一些专家意见。

非常感谢任何指导!

1 个答案:

答案 0 :(得分:2)

我提供了两种解决方案:

1)计算每个时间步的累计总和:

for (i in 1:N){
    above.below[i] <- step(T.10% - y.est[i])
    cum.above.below[i] <- sum(above.below[1:i])
}

decline.length <- rank(cum.above.below[1:N], 0)

2)计算每年是否高于或低于阈值,没有1和0:

for(i in 1:N){
    above.below[i] <- step(T.10% - y.est[i])
    dummy[i] <- above.below[i] * i + (1 - above.below[i]) * (N+1)
}

decline.length <- ranked(dummy[], 1)

dummy为1时,iabove.belowdummy为0时,above.below为N + 1。