2017-04-05 83 views
1

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

这里是我试图做的,但它给错误信息,说“节点与父母不一致”:

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],) 
    } 

这个工作,但我不”不知道这是否是正确的做法。你能分享你的想法吗?

谢谢!

回答

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) 

在此之后,我们就可以绘制出估计和覆盖参数值为true

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

黑点是真正的参数值,蓝色的点和线的估计。只要有足够的数据来估计所有这些参数,看起来这种设置没有问题。 enter image description here

+0

谢谢!这非常有帮助。 – user3669725

1

它看起来像在第一个实现中有语法错误。请尝试:

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

并将结果与​​第二个实现的结果进行比较。根据文件,这些都是正确的,但建议使用功能sort

+0

感谢您指出!我的实际代码实际上有这个d [1:10]一块,但仍然有同样的错误....我问了关于此问题的另一个问题:http://stackoverflow.com/questions/43216398/jags-model-with-错误节点不一致的,以父母 – user3669725