约束R JAGS中的参数顺序

时间:2017-04-05 13:42:34

标签: r parameters constraints jags

我对R JAGS中的一个简单问题感到困惑。例如,我有10个参数:d [1],d [2],...,d [10]。从数据中可以直观地看出它们应该增加。所以我想对它们施加约束。

这是我尝试做的事情,但它提供了错误信息,说明" Node与父母不一致":

    model{
    ...
    for (j in 1:10){
    d.star[j]~dnorm(0,0.0001)
    }
    d=sort(d.star)
    }

然后我尝试了这个:

  d[1]~dnorm(0,0.0001)
  for (j in 2:10){
   d[j]~dnorm(0,0.0001)I(d[j-1],)
  }

这很有用,但我不知道这是否是正确的方法。你能分享一下自己的想法吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

如果你不确定这样的事情,最好只是模拟一些数据,以确定你建议的模型结构是否有效(扰流警报:它确实如此)。

以下是我使用的模型:

cat('model{
  d[1] ~ dnorm(0, 0.0001) # intercept
  d[2] ~ dnorm(0, 0.0001)
  for(j in 3:11){
    d[j] ~ dnorm(0, 0.0001) I(d[j-1],)
  }
  for(i in 1:200){
    y[i] ~ dnorm(mu[i], tau)
    mu[i] <- inprod(d, x[i,])
  }
  tau ~ dgamma(0.01,0.01)
  }',
file = "model_example.R")```

以下是我模拟用于此模型的数据。

library(run.jags)
library(mcmcplots)

# intercept with sorted betas 
set.seed(161)
betas <- c(1,sort(runif(10, -5,5)))

# make covariates, 1 for intercept
x <- cbind(1,matrix(rnorm(2000), nrow = 200, ncol = 10))

# deterministic part of model
y_det <- x %*% betas

# add noise
y <- rnorm(length(y_det), y_det, 1)

data_list <- list(y = as.numeric(y), x = x)

# fit the model
mout <- run.jags('model_example.R',monitor = c("d", "tau"), data = data_list)

在此之后,我们可以绘制估计值并覆盖真实参数值

caterplot(mout, "d", reorder = FALSE)
points(rev(c(1:11)) ~ betas, pch = 18,cex = 0.9)

黑点是真实参数值,蓝点和线是估计值。只要有足够的数据来估算所有这些参数,看起来这个设置就可以了。 enter image description here

答案 1 :(得分:1)

It looks like there is an syntax error in the first implementation. Just try:

model{
  ...
  for (j in 1:10){
    d.star[j]~dnorm(0,0.0001)
  }
  d[1:10] <- sort(d.star)  # notice d is indexed.
}

and compare the results with those of the second implementation. According to the documentation, these are both correct, but it is advised to use the function sort.