Rjags/runjags中,使用dinterval时出现"node inconsistent with parents"错误的原因是什么?

In Rjags/runjags, what causes the "node inconsistent with parents" error when using dinterval?

我绞尽脑汁想办法解决这个问题,但我已经无计可施了!首先,必要的背景:湖泊中的水生植物是用耙子取样的。你把一把耙子扔进湖里,把它拉回你的船里,然后你就可以弄清楚它的尖齿上有什么植物。在我们的例子中,我们同时测量 presence/absence 和“丰度”,但以 ordinal/interval-censored 的方式 --> 如果物种 X 在耙子上根本没有被注意到,则为 0,如果它覆盖了,则为 1 < 25% 的耙齿,如果覆盖范围在 25% 到 75% 之间,则为 2 个;如果覆盖范围 > 75%,则为 3 个。然而,当一个物种的丰度较低时,很容易完全错过它,因此 0 是粗略的——它们可能并不代表真正的缺失,而这正是我们的模型试图探索的问题。

所以,这里真的有三层——我们根本无法直接观察到的真正的、完全潜在的丰富,部分潜在的“真实 presence/absence”,因为我们知道真正的存在在哪里但不是真正缺席的地方,然后我们就有了观察到的 presence/absence 数据。更有趣的是,我们认为一些环境变量可能会影响真实丰度和真实发生率,但会有所不同,然后其他变量可能会影响可检测性,而这正是我们试图梳理的那些过程。

所以,无论如何,我的实际模型比我在下面粘贴的模型 更大更复杂,但这是一种功能性(但可能在学术上毫无价值)的训练它的版本复制了我得到的错误。

#data setup
N = 1500 #Number of cases
obs = sample(c(0,1,2,3), N, 
             replace=T, prob=c(0.7, 0.2, 0.075, 0.025)) #Our observed, interval-censored data.
X1 = rnorm(N) #Some covariate that probably affects both occurrance and abundance but maybe in different ways.
abundances = rep(NA, times = N) #Abundance is a latent variable we don't directly observe. From elsewhere, I know the values here need to be NAs so the model will know to impute them
occur = rep(1, times = N) #Occurance is a degraded form of our abundance data.

#d will be the initials for the abundance data, since this is apparently needed to jumpstart the imputation.
d = vector()
for(o in 1:N) {
  if (obs[o]==0) { d[o] = 0.025; occur[o] = 0 }
  if (obs[o]==1) { d[o] = 0.15 }
  if (obs[o]==2) { d[o] = 0.5 }
  if (obs[o]==3) { d[o] = 0.875 }
}

#Data
test.data = list("N" = N, 
                 "obs" = obs,
                 "X1" = X1, 
                 "abund" = abundances,
                 "lim" = c(0.05, 0.25, 0.75, 0.9999),
                 "occur" = occur)
#Inits
inits = list(abund = d)

cat("model
    {
    for (i in 1:N) {
    
obs[i] ~ dinterval(abund[i], lim)
abund[i] ~ dbeta(theta[i], rho[i]) T(0.0001, 0.9999)
theta[i] <- mu[i] * epsilon
rho[i] <- epsilon * (1-mu[i])

logit(mu[i]) <- alpha1 + X.beta1 * X1[i]

occur[i] ~ dbern(phi[i])
logit(phi[i]) <- alpha2 + X.beta2 * X1[i]

    }
    
#Priors
epsilon ~ dnorm(5, 0.1) T(0.01, 10)
alpha1 ~ dnorm(0, 0.01)
X.beta1 ~ dnorm(0, 0.01)
alpha2 ~ dnorm(0, 0.01)
X.beta2 ~ dnorm(0, 0.01)
}
 ", file = "training.txt")

test.run = jags.model(file = "training.txt", inits = inits, data=test.data, n.chains = 3) 

params = c("epsilon", 
                "alpha1",
                "alpha2",
                "X.beta1", 
                "X.beta2")

run1 = run.jags("training.txt", data = test.data, n.chains=3, burnin = 1000, sample = 5000, adapt = 4000, thin = 2,
                monitor = c(params), method="parallel", modules = 'glm')

最后,我得到了这个错误,并且我 总是 每次尝试像这样远程做某事时得到这个错误:

Graph information: Observed stochastic nodes: 3000 Unobserved stochastic nodes: 1505 Total graph size: 19519 . Reading parameter file inits1.txt. Initializing model Error in node obs Node inconsistent with parents

我已经阅读了每一个 的帖子,涵盖了我能找到的这个错误,包括, this one, this one, and this one。根据我的研究和测试,我可以推测错误可能是由于以下原因之一造成的。

  1. 我对潜在丰度变量的首字母不知何故不够充分。听起来这需要非常有用的初始值才能工作。
  2. 我的一个或多个先验允许不允许的值,或者它们过于宽泛,这会以某种方式引起问题。这可能是一个特别的问题,因为我使用的 beta 分布对没有 0 和 1 之外的值有强烈的要求。
  3. 我错误地使用了 dinterval() 函数,这似乎是可能的,因为它总是包含它的行触发了错误。
  4. 我的模型指定有误。

但我看不出我可能哪里出错了——我已经为 1 和 2 尝试了许多不同的选项,据我从文档中可以看出 (see pages 55-56),我正确使用 dinterval。我错过了什么??

如果相关,根据我收集到的信息,dinterval() 的想法是 ~ 左侧的变量是第一个参数中给出的变量的区间删失版本(此处为 abundance ).然后,第二个参数(此处为 lim)是一个“断点”向量,它指示丰度数据结束的间隔。因此,在这里,如果您低于最低 lim,则最终观察到的丰度代码为 0 (此处为 0.05),如果您位于 lim 的前两个值之间,则为 1,等等。这就像丰度变量被推过 lim 变量创建的“分级筛”以产生分级输出变量,即我们观察到的丰度.

非常欢迎任何指导!!

我有 运行 你使用 JAGS 4.3.0 和 rjags 4-12 的例子。对我来说,带有 rjags 运行s 的版本是正确的。带有 运行jags 的版本不起作用,因为您没有提供初始值。这很容易通过添加参数

来解决
inits=list(inits, inits, inits)

调用 run.jags()。

您已经正确理解了 dinterval 的用途。这是一个“可观察函数”,它通过可能性对其参数施加约束。使用 dinterval 时,您必须始终提供满足第一次迭代约束的初始值。据我所知,您的初始值确实满足约束,并且我可以 运行 您的示例(具有初始值)这一事实证实了这一点。