我有一个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()
函数可以提供一些专家意见。
非常感谢任何指导!
答案 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时,i
为above.below
,dummy
为0时,above.below
为N + 1。