限制 R JAGS 中参数的顺序
Constrain order of parameters in R JAGS
我对R JAGS中的一个简单问题感到困惑。例如,我有 10 个参数:d[1]、d[2]、...、d[10]。从数据中可以直观地看出它们应该在增加。所以我想给他们一个约束。
这是我尝试执行的操作,但它给出了错误消息 "Node inconsistent with parents":
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],)
}
这行得通,但我不知道这是否是正确的方法。你能分享你的想法吗?
谢谢!
如果您不确定这样的事情,最好只模拟一些数据来确定您建议的模型结构是否有效(剧透警告:有效)。
这是我使用的模型:
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)
黑点是真实的参数值,蓝点和线是估计值。只要有足够的数据来估计所有这些参数,这个设置看起来就可以正常工作。
第一个实现好像有语法错误。试试看:
model{
...
for (j in 1:10){
d.star[j]~dnorm(0,0.0001)
}
d[1:10] <- sort(d.star) # notice d is indexed.
}
并将结果与第二个实现的结果进行比较。根据文档,这些都是正确的,但建议使用函数 sort
.
我对R JAGS中的一个简单问题感到困惑。例如,我有 10 个参数:d[1]、d[2]、...、d[10]。从数据中可以直观地看出它们应该在增加。所以我想给他们一个约束。
这是我尝试执行的操作,但它给出了错误消息 "Node inconsistent with parents":
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],)
}
这行得通,但我不知道这是否是正确的方法。你能分享你的想法吗?
谢谢!
如果您不确定这样的事情,最好只模拟一些数据来确定您建议的模型结构是否有效(剧透警告:有效)。
这是我使用的模型:
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)
黑点是真实的参数值,蓝点和线是估计值。只要有足够的数据来估计所有这些参数,这个设置看起来就可以正常工作。
第一个实现好像有语法错误。试试看:
model{
...
for (j in 1:10){
d.star[j]~dnorm(0,0.0001)
}
d[1:10] <- sort(d.star) # notice d is indexed.
}
并将结果与第二个实现的结果进行比较。根据文档,这些都是正确的,但建议使用函数 sort
.