我正在使用JAGS进行分配,以模拟二项式分布,其p
参数是另一个变量d
的函数。
这就是我想要做的:
我已经编写了模型,但是出现了错误。
下面是我已经尝试过的代码
#R-code
distance=seq(from=2,to=20,by=1)
Ntrys=c(1443,694,455,353,272,256,240,217,200,237,202,192,174,167,201,195,191,147,152)
Nsucc=c(1346,577,337,208,149,136,111,69,67,75,52,46,54,28,27,31,33,20,24)
psucc=Nsucc/Ntrys
glm1.data=list(N=19, Nsucc=Nsucc,psucc=psucc,distance=distance)
glm1.model=jags.model("glm1.model",glm1.data,n.chains=2)
glm1.samps=coda.samples(glm1.model, variable.names=c("alpha", "beta"), 1e5)
#model file
model{
for (i in 1:N){
Nsucc[i] ~ dbern(psucc[i])
log((psucc[i])/(1-psucc[i])) <- alpha + beta*(distance[i])
}
alpha ~ dunif(-10,10)
beta ~ dunif(-10,10)
}
我收到错误
jags.model(“ glm1.model”,glm1.data,n.chains = 2)中的错误:
运行时错误:
第4行出现编译错误。
pmiss [1]是一个逻辑节点,无法观察到
我认为模型文件甚至都没有设置为执行我想做的事情。
答案 0 :(得分:0)
您无需计算rjags
之外的概率,但可以使用二项分布函数dbin(p,N)
,该函数接受参数p
,成功概率和{{ 1}},尝试次数。另外,N
函数可以用作链接函数。
更新后的模型功能为
logit
给定预测值的某些值,可以通过将预测值的值添加到数据中并将相关数量的mod <-
"model{
# likelihood
for (i in 1:N){
Nsucc[i] ~ dbin(p[i], Ntrys[i])
logit(p[i]) <- alpha + beta*distance[i]
}
# priors
alpha ~ dunif(-10,10)
beta ~ dunif(-10,10)
}"
附加到结果向量来生成预测。因此,传递给NA
的数据变为
rjags
然后编译并运行模型
glm1.data <- list(N=20, Nsucc=c(Nsucc, NA), Ntrys=c(Ntrys, 100), distance=c(distance, 25))
然后您可以从分位数生成间隔
# set.seed so sampling is reproducible
library(rjags)
load.module("glm")
glm1.model <- jags.model(textConnection(mod), glm1.data,
n.chains=2,
inits=list(.RNG.name="base::Wichmann-Hill",
.RNG.seed=1))
update(glm1.model, n.iter = 1000, progress.bar="none")
# sample: monitor the unknown predictions, Nsucc[20], p[20]
glm1.samps <- coda.samples(glm1.model, variable.names=c("alpha", "beta", "Nsucc[20]", "p[20]"), 1e5)
或最高密度间隔
s <- summary(glm1.samps)
s$quantiles
(只是为了好玩,比较library(HDInterval)
hdi(glm1.samps)
:glm
中的系数)