问题描述
我有这部分 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()
不是控制流语句,它是一个函数,并且 TRUE
和 FALSE
条件都被评估。因此,即使您说使用 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)
}