2016-09-29 87 views
2

我想用JAGS来推断(随机)纯出生过程中的出生率。使用JAGS纯粹的出生过程推断

在化学的语言,这种模式是相当于反应:X-> 2X与速率的α* X(也可以被看作是一个链式反应的模型)

这是R代码我用于生成过程(在固定时间)以及用于对参数α进行推断的锯齿代码。

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) 

当我运行代码,我收到以下错误:

Error in jags.model(textConnection(model_string), data = list(y = y, N = N), : 
    RUNTIME ERROR: 
Compilation error on line 4. 
y[2] is a logical node and cannot be observed 

我试图像把阿尔法* Y [I-1]在一个新的变量不同的东西(比如,拉姆达[我]]或更改新[i-1]的调用新[i],但没有任何工作。任何想法为什么这是失败的?另一个更聪明的方法来做到这一点?

预先感谢您。

+0

我在其他地方找到了答案。你可以在这里阅读:https://sourceforge.net/p/mcmc-jags/discussion/610036/thread/6b159634/ –

回答

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)。

enter image description here

考虑到该指数会给你的出生率(即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.ratevariable.names说法。

+0

这绝对是一个比我预期的更好的解决方案。但我不完全理解为什么lambda是alpha * i的指数,而不是简单的alpha * i。 –

+1

因为此模型使用日志链接。日志链接的倒数是指数,将其带回一个更容易解释的比例(比率)。关于[泊松回归](http://en.wikipedia.org/wiki/Poisson_regression)的维基百科页面有足够的信息。因此,例如,如果您想模拟1.2的增长率(从一个时间步到下一个时间增加20%),您可以将其日志“alpha < - log(1.2)”并在模拟中使用。此模型也可以让您包含协变量,而另一种解决方案则不会。 –

+0

立即清空。再次感谢。 –