Hello! I am attempting to simulate from a SIRS model in NIMBLE with a seasonal force of infection (beta[t] in the second set of code below), and all of the random distributions generate NAs (e.g.,
The first set of code below does not include a seasonal component and works. The second set is the simplest example I could come up with that throws NA warnings. Do you have any suggestions on how to approach this problem? Thank you in advance for any help you can provide.
Code that works:
SIRS_code <- nimbleCode({
S[1] <- N - I0 - R0
I[1] <- I0
R[1] <- R0
probIR <- 1 - exp(-gamma)
probRS <- 1 - exp(-phi)
### loop over time
for(t in 1:tau) {
probSI[t] <- 1 - exp(- beta1 * I[t] / N)
Istar[t] ~ dbin(probSI[t], S[t])
Rstar[t] ~ dbin(probIR, I[t])
Sstar[t] ~ dbin(probRS, R[t])
# update S, I, R
S[t + 1] <- S[t] - Istar[t] + Sstar[t]
I[t + 1] <- I[t] + Istar[t] - Rstar[t]
R[t + 1] <- R[t] + Rstar[t] - Sstar[t]
# data not perfectly observed
nu[t] <- logit(Istar[t]/N+0.0001)
logit(Y[t]) ~ dnorm(nu[t], 0.1)
}
# priors
beta1 ~ dgamma(0.1, 0.1)
gamma ~ dgamma(0.1, 0.1)
phi ~ dgamma(0.1, 0.1)
})
n_weeks <- 52
n_seasons <- 2
constantsList <- list(N = 10000,
I0 = 5,
R0 = 0,
tau = n_weeks*n_seasons)
sirsModel <- nimbleModel(SIRS_code,
constants = constantsList)
# exclude data from parent nodes
dataNodes <- c('Istar', 'Rstar', 'Sstar', 'logit_Y')
dataNodes <- sirsModel$expandNodeNames(dataNodes, returnScalarComponents = TRUE)
parentNodes <- sirsModel$getParents(dataNodes, stochOnly = TRUE)
parentNodes <- parentNodes[-which(parentNodes %in% dataNodes)]
parentNodes <- sirsModel$expandNodeNames(parentNodes, returnScalarComponents = TRUE)
nodesToSim <- sirsModel$getDependencies(parentNodes, self = FALSE, downstream = T)
initsList <- list(beta1 = 0.6,
gamma = 0.2,
phi = 0.1)
sirsModel$setInits(initsList)
set.seed(1)
sirsModel$simulate(nodesToSim, includeData = TRUE)
Minimal example that throws NA warnings:
SIRS_code <- nimbleCode({
S[1] <- N - I0 - R0
I[1] <- I0
R[1] <- R0
probIR <- 1 - exp(-gamma)
probRS <- 1 - exp(-phi)
### loop over time
for(t in 1:tau) {
probSI[t] <- 1 - exp(- beta[t] * I[t] / N)
## need to add seasonal beta to this next
beta[t] <- 0.5*(1+0.9*sin((2*pi/52)*(w[t]-52/4)))
Istar[t] ~ dbin(probSI[t], S[t])
Rstar[t] ~ dbin(probIR, I[t])
Sstar[t] ~ dbin(probRS, R[t])
# update S, I, R
S[t + 1] <- S[t] - Istar[t] + Sstar[t]
I[t + 1] <- I[t] + Istar[t] - Rstar[t]
R[t + 1] <- R[t] + Rstar[t] - Sstar[t]
# data not perfectly observed
nu[t] <- logit(Istar[t]/N+0.0001)
logit(Y[t]) ~ dnorm(nu[t], 0.1)
}
# priors
gamma ~ dgamma(0.1, 0.1)
phi ~ dgamma(0.1, 0.1)
})
n_weeks <- 52
n_seasons <- 2
constantsList <- list(N = 10000,
I0 = 5,
R0 = 0,
tau = n_weeks*n_seasons,
w = rep(1:n_weeks, n_seasons))
sirsModel <- nimbleModel(SIRS_code,
constants = constantsList)
# exclude data from parent nodes
dataNodes <- c('Istar', 'Rstar', 'Sstar', 'logit_Y')
dataNodes <- sirsModel$expandNodeNames(dataNodes, returnScalarComponents = TRUE)
parentNodes <- sirsModel$getParents(dataNodes, stochOnly = TRUE)
parentNodes <- parentNodes[-which(parentNodes %in% dataNodes)]
parentNodes <- sirsModel$expandNodeNames(parentNodes, returnScalarComponents = TRUE)
nodesToSim <- sirsModel$getDependencies(parentNodes, self = FALSE, downstream = T)
initsList <- list(gamma = 0.2,
phi = 0.1)
sirsModel$setInits(initsList)
set.seed(1)
sirsModel$simulate(nodesToSim, includeData = TRUE)