0

我有我的 jags 代码的这一部分。我真的看不到代码超出范围的地方。谁能看到我无法识别的任何错误?这些是数据大小。

N = 96

L = c(4,4,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]), 
        inprod(current_window_x, 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
4

1 回答 1

0

实际上,我今天早些时候刚刚在这里遇到了我正在做的事情的答案。答案就在这篇文章中。要点是,ifelse()在 jags 中不是控制流语句,它是一个函数,并且对TRUEandFALSE条件都进行了评估。因此,即使您说要使用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)
}

于 2021-03-03T20:51:01.280 回答