簡體   English   中英

在 Rjags/runjags 中,使用 dinterval 時出現“node inconsistent with parents”錯誤的原因是什么?

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

我絞盡腦汁想出解決這個問題的方法,但我無能為力,首先:必要的背景。 湖泊中的水生植物是用耙子取樣的,你把耙子扔進湖里,然后把它拉回你的船里。 並且你弄清楚它的尖齒上有什么植物,在我們的例子中,我們測量存在/不存在以及“豐度”,但是以有序/間隔審查的方式 --> 如果物種 X 沒有被注意到它是 0完全沒有耙子,1 如果它覆蓋 < 25% 的耙齒,2 如果它覆蓋在 25 到 75% 之間。 如果它覆蓋 > 75%,則為 3,但是,當一個物種的豐度較低時,很容易完全錯過它,因此 0 是粗略的——它們可能並不代表真正的缺失。 這確實是我們 model 試圖探索的問題。

所以,這里真的有三層——我們根本無法直接觀察到的真實的、完全潛在的豐富,部分潛在的“真實存在/不存在”,因為我們知道真實的存在在哪里,但不知道真正的不存在在哪里,然后我們有我們觀察到的存在/不存在數據。 更有趣的是,我們認為一些環境變量可能會影響真實豐度和真實發生率,但會有所不同,然后其他變量可能會影響可檢測性,而這正是我們試圖梳理的那些過程。

所以,無論如何,我的實際 model 比我在下面粘貼的大得多和復雜得多,但這里有一種功能性(但可能在學術上毫無價值)的訓練版本,它復制了我得到的錯誤。

#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')

最后,我得到了這個錯誤,每當我嘗試像這樣遠程做某事時,我總是會得到這個錯誤:

圖信息:觀察到的隨機節點:3000個未觀察到的隨機節點:1505個總圖大小:19519。讀取參數文件inits1.txt。 初始化 model錯誤節點obs 1節點與父節點不一致

我已經閱讀了我能找到的涵蓋此錯誤的所有帖子,包括這個這個這個這個 我可以從我的研究和測試中推測錯誤可能是由於以下原因之一而發生的。

  1. 我對潛在豐度變量的縮寫不知何故不夠用。 聽起來這需要非常有用的初始值才能工作。
  2. 我的一個或多個先驗允許不允許的值,或者它們過於寬泛,這會以某種方式引起問題。 這可能是一個特別的問題,因為我使用的 beta 分布對沒有 0 和 1 之外的值有強烈的要求。
  3. 我錯誤地使用了 dinterval() function,這似乎很可能是因為包含它的行總是觸發錯誤。
  4. 我的 model 指定有誤。

但我看不出我可能哪里出錯了——我已經為 1 和 2 嘗試了許多不同的選項,據我從文檔中可以看出(參見第 55-56 頁),我正確地使用了 dinterval . 我錯過了什么??

如果相關,根據我收集到的信息,dinterval() 的想法是 ~ 左側的變量是第一個參數(此處為豐度)中給出的變量的區間刪失版本。 然后,第二個參數(此處為 lim)是一個“斷點”向量,它指示豐度數據結束的間隔。因此,在這里,如果您低於最低 lim,則最終觀察到的豐度代碼為 0 (此處為 0.05),如果您位於 lim 的前兩個值之間,則為 1,等等。這就像豐度變量被推過 lim 變量創建的“分箱篩”以產生分箱的 output 變量,我們觀察到的豐度.

任何指導將是最受歡迎的!

我已經使用 JAGS 4.3.0 和 rjags 4-12 運行了您的示例。 對我來說,帶有 rjags 的版本運行正確。 帶有 runjags 的版本不起作用,因為您沒有提供初始值。 這很容易通過添加參數來解決

inits=list(inits, inits, inits)

調用 run.jags()。

您已經正確理解了 dinterval 的用途。 這是一個“可觀察函數”,它通過可能性對其參數施加約束。 使用 dinterval 時,您必須始終提供滿足第一次迭代約束的初始值。 據我所知,您的初始值確實滿足約束條件,並且我可以運行您的示例(使用初始值)這一事實證實了這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM