【问题标题】:Rjags jags model compiling error when using for loop使用 for 循环时 Rjags jags 模型编译错误
【发布时间】:2022-11-05 17:39:10
【问题描述】:

我正在使用 Rjags 包来运行 MCMC。我有二项式数据集,我尝试运行“for循环”函数,以便在组合数据中为来自不同作者的多个数据集生成参数。 我为我想要获得后验的每个参数指定了 jags 模型和无信息先验,但我一直收到这样的错误消息;


jcode <- "model{ 
    for (i in 1:3){
    n.pos[i] ~ dbinom(seropos_est[i],N[i]) #fit to binomial data
    seropos_est[i] = 1-exp(-lambdaS1*age[i]) #catalytic model
    }
 for (i in 4:7) {
    n.pos[i] ~ dbinom(seropos_est[i],N[i]) #fit to binomial data
    seropos_est[i] = 1-exp(-lambdaS2*age[i]) #catalytic model
    }
 for (i in 8:11) {
    n.pos[i] ~ dbinom(seropos_est[i],N[i]) #fit to binomial data
    seropos_est[i] = 1-exp(-lambdaS3*age[i]) #catalytic model
    }
  #priors 
    lambdaS1 ~ dnorm(0,1) #uninformative prior
    lambdaS2 ~ dnorm(0,1) #uninformative prior
    lambdaS3 ~ dnorm(0,1) #uninformative prior
 }"
 

参数向量 参数向量 <- c("lambdaS1", "lambdaS2", "lambdaS3")

`

mcmc.length=50000
jdat = list(n.pos= df_chik$N.pos,
            N=df_chik$N,
            age=df_chik$agemid)
jmod = jags.model(textConnection(jcode), data=jdat, n.chains=4, n.adapt=15000)
jpos = coda.samples(jmod, paramVector, n.iter=mcmc.length)

`错误信息

Compiling model graph
   Resolving undeclared variables
   Allocating nodes
Graph information:
   Observed stochastic nodes: 11
   Unobserved stochastic nodes: 3
   Total graph size: 74

Initializing model
Deleting model

这是我不断收到的错误消息。如果有人可以帮助我解决这个问题,我将不胜感激!

【问题讨论】:

  • 这是什么语言?
  • 这是R包!
  • 好的@Hyo-rim Kang

标签: bayesian sampling mcmc rjags


【解决方案1】:

您在“错误消息”下显示的文本,即此文本:

Compiling model graph
   Resolving undeclared variables
   Allocating nodes
Graph information:
   Observed stochastic nodes: 11
   Unobserved stochastic nodes: 3
   Total graph size: 74

Initializing model
Deleting model

... 不是错误,而是 rjags 的预期输出。但是我怀疑您没有复制真正的错误消息,这可能类似于“节点 n.pos[1] 的无效父值”。原因是对于 seropos_est[] 你有以下形式的关系:

seropos_est[i] = 1-exp(-lambdaS1*age[i])

其中 lambdaS1 是一个不受约束的变量。所以exp(-lambdaS1*age[i])的结果可以在1以上,也就是说seropos_est[i]可以为负数,对概率参数无效。事实上,给定 lambdaS1 的正常先验,模型将使用零值初始化该变量,这意味着 seropos_est[i] 被初始化为零,如果您的任何 n.pos 大于零,这也是无效的。因此,您需要重新指定模型以将 seropos_est 约束到有效参数空间,可能通过更改 lambdaS1 等的先验(假设年龄为正)。

此外,您的代码中有:

lambdaS1 ~ dnorm(0,1) #uninformative prior

但这当然不是无意义的。无论如何,实际上不存在“无信息先验”之类的东西——根据定义,所有先验都包含一些信息。您可以做的最好的事情是“最少信息先验”或“非信息先验”,这就是为什么通常建议使用此术语而不是误导性词“无信息”的原因。

将来,如果您的问题包含一个最小的可重现示例,这将有助于我们为您提供帮助,以便我们可以运行模型并准确查看您所看到的内容。在这种情况下,真正缺少的只是对数据的访问。

希望有帮助,

马特

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-20
    • 2021-12-02
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多