2014-07-22 47 views
1

我正在嘗試學習WINBUGS,並嘗試構建一個小模型,從一個教科書中的示例調整(代碼如下),假設感染運營商的隱藏人口,同時具有增長率(「R0」)和隨時間的移除率(篩選和治療)。但是,我傾向於得到一系列錯誤消息(「無效或意外令牌掃描」,「無法執行INIT」等)。因此,有更多WINBUGS經驗的人能夠如此友善地注視我在理解WINBUGS方面是否犯了愚蠢的錯誤?我特別不確定是否可以在WINBUGS中完成羣體的順序更新(N.est [t + 1] < - N.est [t] + newcases - obs)?提前感謝WINBUGS - 代碼中的錯誤

set.seed(1) 
n.years <- 10   # Number of years 
N1 <- 30    # Initial population size 
rnode <- 0.3 
attendance <- 0.4 

#generating some data. the model has a hidden population of infected carriers that grows, and is screened periodically (with x% attendance). screened individuals are removed from the population. the observed cases are used in the bayesian framework (BUGS) to infer the hidden parameters 


obs <- N <- newcases <- numeric(n.years) 
N[1] <- N1 
for (t in 1:(n.years-1)){ 
    newcases[t] <- rbinom(n=1,size=N[t],prob=rnode) # 
    obs[t] <- rbinom(1, N[t], attendance) #observed cases 
    N[t+1] <- N[t] + newcases[t] - obs[t] } 

# Specifying model in BUGS language 
sink("ssm.bug") 
cat(" 
    model { 
    # Priors and constraints 
    N.est[1] ~ dbin(0.3, 100) # Prior for initial population size 
    rnode ~ dunif(0, 1)   # Prior for R0 
    attendance ~ dunif(0, 1)  # Prior for attendance at screening 

    # Likelihood 
    # State process 
    for (t in 1:(T-1)){ 
    newcases ~ dbin(rnode,N.est[t]) 
    obs ~ dbin(attendance,N.est[t]) 
    N.est[t+1] <- N.est[t] + newcases - obs  
    } 
    ",fill = TRUE) 
sink() 

# Bundle data 
bugs.data <- list(obs = obs, T = n.years) 

# Initial values 
inits <- function(){list(rnode=0.5,attendance=0.5, N.est = c(runif(1, 20, 40), rep(NA, (n.years-1))))} 

# Parameters monitored 
parameters <- c("rnode", "attendance", "N.est") 

# MCMC settings 
ni <- 25000 
nt <- 3 
nb <- 10000 
nc <- 3 

# Call WinBUGS from R (BRT <1 min) 
ssm <- bugs(bugs.data, inits, parameters, "ssm.bug", n.chains = nc, n.thin = nt, n.iter = ni, n.burnin = nb, debug = TRUE, bugs.directory = bugs.dir, working.directory = getwd()) 

# Define function to draw a graph to summarize results 
graph.ssm <- function(ssm, N, y){ 
    fitted <- lower <- upper <- numeric() 
    n.years <- length(y) 
    for (i in 1:n.years){ 
    fitted[i] <- mean(ssm$sims.list$N.est[,i]) 
    lower[i] <- quantile(ssm$sims.list$N.est[,i], 0.025) 
    upper[i] <- quantile(ssm$sims.list$N.est[,i], 0.975)} 
    m1 <- min(c(y, fitted, N, lower)) 
    m2 <- max(c(y, fitted, N, upper)) 
    par(mar = c(4.5, 4, 1, 1), cex = 1.2) 
    plot(0, 0, ylim = c(m1, m2), xlim = c(0.5, n.years), ylab = "Population size", xlab = "Year", las = 1, col = "black", type = "l", lwd = 2, frame = FALSE, axes = FALSE) 
    axis(2, las = 1) 
    axis(1, at = seq(0, n.years, 5), labels = seq(0, n.years, 5)) 
    axis(1, at = 0:n.years, labels = rep("", n.years + 1), tcl = -0.25) 
    polygon(x = c(1:n.years, n.years:1), y = c(lower, upper[n.years:1]), col = "gray90", border = "gray90") 
    points(N, type = "l", col = "red", lwd = 2) 
    points(y, type = "l", col = "black", lwd = 2) 
    points(fitted, type = "l", col = "blue", lwd = 2) 
    legend(x = 1, y = m2, legend = c("True", "Observed", "Estimated"), lty = c(1, 1, 1), lwd = c(2, 2, 2), col = c("red", "black", "blue"), bty = "n", cex = 1) 
} 

# Execute function: Produce figure 
graph.ssm(ssm, N, y) 

回答

1

在一般情況下,我會建議鑽研WinBUGS軟件或OpenBUGS您開始通過R2WinBUGS(或R2OpenBUGS)自動化的東西之前,先調試模型。

在你的模型上面,我發現馬上,你是在最後缺少一個封閉的括號,即你需要

model { 
# Priors and constraints 
N.est[1] ~ dbin(0.3, 100) # Prior for initial population size 
rnode ~ dunif(0, 1)   # Prior for R0 
attendance ~ dunif(0, 1)  # Prior for attendance at screening 

# Likelihood 
# State process 
for (t in 1:(T-1)){ 
    newcases ~ dbin(rnode,N.est[t]) 
    obs ~ dbin(attendance,N.est[t]) 
    N.est[t+1] <- N.est[t] + newcases - obs  
} 
} 

OpenBUGS給你這些類型的錯誤的一個不錯的主意,當你點擊型號|規格 - >檢查模型。如果模型無法編譯,則光標跳轉到發生錯誤的位置(在模型代碼的末尾)。