切片向量显示误差我们的范围

问题描述

我有这部分 jags 代码。我真的看不到代码在哪里超出范围。任何人都可以看到我无法识别的任何错误吗?这些是数据大小。

N = 96

L = c(4,4,4)

length(media1) = 96

length(weights1) = 4

      for(t in 1:N){
        current_window_x <- ifelse(t <= L[1],media1[1:t],media1[(t - L[1] + 1):t])
        t_in_window <- length(current_window_x)
        new_media1[t] <- ifelse(t <= L[1],inprod(current_window_x,weights1[1:t_in_window]),weights1))
      }

错误是(其中第 41 行对应于循环中的第一行)

      Error in jags.model(model.file,data = data,inits = init.values,n.chains = n.chains,: 
      RUNTIME ERROR:
      Compilation error on line 41.
      Index out of range taking subset of  media1

解决方法

实际上,我今天早些时候刚刚在这里找到了我正在做的事情的答案。答案在this post中。要点是 jags 中的 ifelse() 不是控制流语句,它是一个函数,并且 TRUEFALSE 条件都被评估。因此,即使您说使用 media1[1:t] if t<=L[1],也会评估 FALSE 条件从而产生错误。

一旦您能够修复该问题,另一个问题是您正在重新定义参数 current_window_x,这将引发错误。我认为处理可变窗口宽度的最简单方法就是对 new_media 的前几个观察值进行硬编码,然后计算循环中剩余的观察值,如下所示:

new_media[1] <- media1[1]*weights1[1]
new_media[2] <- inprod(media1[1:2],weights1[1:2])
new_media[3] <- inprod(media1[1:3],weights1[1:3])
for(t in 4:N){
  new_media[t] <- inprod(media1[(t - L[1] + 1):t],weights1)
}