我是Jags的新手,我试图对我的数据拟合一个多项式模型。当我运行代码时,我得到以下错误。"positive.counts[1,1:9] is partly observed and partly missing".我上网查了一下,发现这是由于一个节点不能同时有观测值和缺失值。这是因为在我的数据中(见下面的代码),有值和NA在同一行。如果我把NA用0值代替,模型就可以正常工作了.有谁有办法解决这个问题吗?下面你可以找到数据和代码!
非常感谢。
Elisa
##########################################################################
# load jags
library(runjags)
# define the data:
data <- list("N_cases"=c(978,737, 737, 1189, 270, 268), "positive.counts" = matrix(c(649 ,567 ,464 ,821, 98, 117,203 , 133, 81, 290, 41, 26,3, 7, 4, 6, 5, 0,NA, NA, NA, NA, 20, 19,24, 15, 3, NA, 21, 15,NA, NA, 184, NA, 17, 23, NA, NA, NA, NA, 26, 17,99, 15, 1, 72, 14, 25,NA, NA, NA, NA, 28, 26),6,9), "n"= 6,"n_responses" = 9)
# define the model
model { mu.w <- 0
prec <- 0.5
for (s in 1:n_responses) {
w[s] ~ dnorm(mu.w, prec);
a[s] <- exp(w[s]); # positive parameter
}
for (i in 1:n){
positive.counts[i,1:n_responses] ~ dmulti(p[i,1:n_responses], N_cases[i])
}
for(i in 1:n){
for (s in 1:n_responses) {
delta[i, s] ~ dgamma(a[s], 1)
}
}
for(i in 1:n){
for (s in 1:n_responses) {
p[i, s] <- delta[i,s] / sum(delta[i,1:n_responses])
}
}
}
# run the model
n.adapt=1000
n.burn=5000
n.iters=10000
n.chains <- 5;
n.total.samples <- 10000
n.samples.per.chain <- (n.total.samples %/% n.chains)
n.thin <- n.iters %/% n.samples.per.chain; if(n.thin==0) n.thin <- 1;
tomonitor <- c("a","p")
mcmc.post <- run.jags(model="multi_model.jags",
data=data,
method="parallel",
sample=n.samples.per.chain,
burnin=n.burn,
adapt=n.adapt,
n.chains=n.chains,
thin=n.thin,
monitor= tomonitor);
正如你所发现的那样,JAGS不能让你对部分观测的多叉分布进行建模。 这是一个限制。 如果你替换掉 NA
s与零,你不再说 "我没有行和列变量组合的数据",而是说 "我没有观察到这个行和列变量组合的事件"。 所以模型会(可能)运行并产生一些输出。 但是你不再对你观察到的数据集进行建模。 所以模型的结果不再适用于你的数据。 你从中得出的结论将是无效的。
所以,你需要一种方法来模拟具有不完整观测值的多项式数据。 一种方法是将你的数据转化为一系列相关的二项式变量。 对于您的具有k个类别的多项式数据中的每个类别c[i],您创建一个二项式变量Y[i] ~ Bin(p[i],n),其中n是观测值的数量(N_cases
在您的数据中?)与预测因子的组合(行的 positive.counts
in your data?),而p[i]= Prob(x >= c[i])。 换句话说,p[i]是具有相关预测变量集的观测值属于c[i]或以上类别的概率。 所以,根据定义,p[1]=1)。
如果这种解释有点抽象,我很抱歉,但你给了我们你的代码,但没有背景。 我无法用你的解释来解释 实际 模型,因为我不知道它是什么。
在JAGS中给出了两种拟合这种模型的方法。此职位. 你可以相信答案的作者 他是Martyn Plummer. 他写了JAGS。
非常感谢你的回答和好的建议.我没有很清楚地解释我的自我:当我说带零的模型正常工作时,我的意思是它正在运行。我知道这样做是错误的,但这只是一个检查,以确保错误与NaN有关,并排除任何其他类型的错误.我也没有很好地解释我的模型:测试阳性的病例数遵循一个多叉分布,其中N_cases是观察的总数,p[i]是每个n_responses预测因子的概率(正如你正确所说的那样).我在我的代码中实现了你向我指出的Martyn Plummer的代码,但现在我得到了另一个错误。" Cannot insert node into p.bin[6,2]. Dimension mismatch". 尺寸不匹配"。你知道这里出了什么问题吗?下面你可以找到代码。非常感谢
model{
mu.w <- 0
prec <- 0.5
for (j in 1:n_responses) {
w[j] ~ dnorm(mu.w, prec);
a[j] <- exp(w[j]); # positive parameter
}
for (i in 1:n) {
N_cases.bin[i,1] <- N_cases[i]
p.bin[i,1] <- p[i,1]
for (j in 2:n_responses) {
N_cases.bin[i,j] <- N_cases.bin[i,j-1] - positive.counts[i,j-1]
p.bin[i,j] <- p[i,j]/(sum(p[i,j:n_responses]) + piz)
}
for (j in 1:n_responses) {
delta[i, j] ~ dgamma(a[j], 1)
p[i, j] <- delta[i,j] / sum(delta[i,1:n_responses])
positive.counts[i, j] ~ dbinom(p.bin[i,j], N_cases.bin[i,j])
}
piz[i] <- 1 - sum(p[i,1:n_responses])
Z[i] <- N_cases[i] - sum(positive.counts[i,1:n_responses])
}
}