如何使用logit函数编写JAGS二项式模型文件

时间:2019-04-25 07:06:54

标签: r bayesian montecarlo jags

我正在使用JAGS进行分配,以模拟二项式分布,其p参数是另一个变量d的函数。

这就是我想要做的:

  1. 从后验中为两个参数alpha / beta生成10000个样本
  2. 在dist = 25的情况下进行100次尝试,从后验预测成功次数产生样本
  3. 计算25英尺距离时成功率的95个可信区间

我已经编写了模型,但是出现了错误。

下面是我已经尝试过的代码

#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]是一个逻辑节点,无法观察到

我认为模型文件甚至都没有设置为执行我想做的事情。

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中的系数)