我正在尝试使用JAGS来推断(随机)纯生育过程中的出生率。
在化学语言中,该模型等同于反应:X-> 2X,速率α* X(也可以看作链式反应的模型)
这是我用来生成进程的R代码(在固定时间)和用于推断参数alpha的jags代码。
<stddef.h>
当我运行代码时,出现以下错误:
library(rjags)
y <- 1; # Starting number of "individuals"
N <- 25 # number of time samplings
alpha <- 0.2 # per-capita birth rate
# Generate the time series
for(i in 2:N) {
y<- c(y,y[i-1]+rpois(1,alpha*y[i-1]))
};
# The jags code
model_string <- "model{
for(i in 2:N) {
New[i] ~ dpois(alpha*y[i-1])
y[i] <- y[i-1] + New[i]
}
alpha ~ dunif(0, 2)
}"
# Create and run the jags model
model <- jags.model(textConnection(model_string), data = list(y = y,N = N), n.chains = 3, n.adapt= 10000)
update(model, 5000); # Burnin for 10000 samples
mcmc_samples <- coda.samples(model, variable.names=c("alpha"), n.iter=5000)
我尝试了不同的东西,例如将alpha * y [i-1]放入一个新变量(比如lambda [i])或者用New [i-1]改变对New [i]的调用,但没有任何效果。知道为什么会失败吗?另一种更聪明的方法吗?
提前谢谢。
答案 0 :(得分:1)
另一种解决方案是改变模拟数据的方式,并使用模型的链接功能。
N <- 25 # number of time samplings
alpha <- 0.2 # log per-capita birth rate
# Generate the time series
steps <- 1:N # simulating 25 steps
log.y<- alpha*steps # the log-scale expected count
expected.y <- exp(log.y) # back to the real scale
y <- rpois(N, expected.y) # add Poisson noise to your expected.y
# The jags code
model_string <- "model{
for(i in 1:N) {
y[i] ~ dpois(lambda[i])
log(lambda[i]) <- log.lambda[i]
log.lambda[i] <- alpha * i
}
alpha ~ dunif(-10, 10)
}"
# Create and run the jags model
model <- jags.model(textConnection(model_string),inits = list(alpha = 1), data = list(y = y,N = N), n.chains = 1, n.adapt= 10000)
update(model, 5000); # Burnin for 10000 samples
mcmc_samples <- coda.samples(model, variable.names=c("alpha"), n.iter=5000)
您可以在下面看到此模型也正确检索参数(alpha = 0.2)。
取指数可以得出出生率(即exp(0.2) = 1.22
),或者你可以在模型中做到并跟踪一个导出的参数,它只是alpha
的指数。该模型将是:
model_string <- "model{
for(i in 1:N) {
y[i] ~ dpois(lambda[i])
log(lambda[i]) <- log.lambda[i]
log.lambda[i] <- alpha * i
}
alpha ~ dunif(-10, 10)
birth.rate <- exp(alpha)
}"
您只需跟踪birth.rate
参数中的variable.names
。