Перевод моделей WinBUGS в рстан - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть модели WinBUGS, которые мне нужно использовать в R. Ниже, однако, поскольку я не знаком с WinBUGS и для согласованности с другими частями анализа, я был бы признателен за любую помощь для преобразования их в rstan ,

Вот модели и данные (полный скрипт):

ОШИБКИ Модель

# Check your OS Version
if ( Sys.info()['sysname'] == "Darwin" ) { WINDOWS <- FALSE } else { WINDOWS <- TRUE }

if (!WINDOWS) {
  # You can run WINBugs from MacOSX using wine
  # https://www.r-bloggers.com/running-r2winbugs-on-a-mac-running-osx/
  #
  setwd(path.expand("~/dev/stackoverflow/53809468"))
  bugs.directory = path.expand("~/.wine/drive_c/Program Files/WinBUGS14")
} else {
  # You have to run RStudio in administrator mode to 
  # correctly launch and execute WINBugs
  setwd(path.expand("~/dev/stackoverflow/53809468"))
  bugs.directory <- 'C:/Program Files/WinBUGS14'
}
library(R2WinBUGS)
dat <-
    data.frame(
      A = c(1, 1, 0, 0),
      B = c(1, 0, 1, 0),
      Pass = c(278,
               100, 153, 79),
      Fail = c(743, 581, 1232, 1731))
N <- length(dat$Pass)
case <- dat$Pass
nn <- dat$Fail + dat$Pass
A <- dat$A
B <- dat$B
data <- list(N = N, case = case, A = A, B = B, nn = nn)
regi1.bug <- "model {
  for (i in 1:N){
    pp[i] <- exp(a0) * (1 + a1*A[i] + a2*B[i] + a3*A[i]*B[i])
    case[i] ~ dbin(pp[i], nn[i])}
  a0 ~ dnorm(0, 5)
  a1 ~ dnorm(0, 5)
  a2 ~ dnorm(0, 5)
  a3 ~ dnorm(0, 5)
  ones <- 1
  ones ~ dbern(C1)
  C1 <- step(0 - a0)*step(1 + a1)*step(exp(- a0) - 1 - a1)*step(1 - a2)*
    step(exp(-a0) -1 - a2)*step(1 + a1 + a2 + a3)*step(exp(- a0) - 1 - a1 - a2 - a3)}"
writeLines(regi1.bug, "regi1.bug")
  inits <- function() {
  list(a0 = -4, a1 = 0, a2 = 0, a3 = 0)
}
  sim1 <- bugs(
  data,
  inits = inits,
  model.file = "regi1.bug",
  parameters.to.save = c("a0", "a1", "a2", "a3"),
  n.chains = 4,
  n.burnin = 5e+05,
  n.iter = 1e+06,
  bugs.directory = bugs.directory,
  debug = FALSE)
print(sim1)
# mean sd 2.5% 25% 50% 75% 97.5% Rhat
# a0 -2.8 0.1 -2.9 -2.8 -2.8 -2.7 -2.6 1
# a1 1.3 0.2 0.9 1.2 1.3 1.5 1.8 1
# a2 0.8 0.1 0.5 0.7 0.8 0.9 1.0 1
# a3 1.0 0.3 0.5 0.9 1.0 1.2 1.5 1
regi2.bug <- "model {
  for (i in 1:N){
    odds[i] <- exp(b0) * (1 + b1*A[i] + b2*B[i] + b3*A[i]*B[i])
    pp[i] <- odds[i]/(1 + odds[i])
    case[i] ~ dbin(pp[i], nn[i])
  }
  b0 ~ dnorm(0, 5)
  b1 ~ dnorm(0, 5)
  b2 ~ dnorm(0, 5)
  b3 ~ dnorm(0, 5)
  ones <- 1
  ones ~ dbern(C1)
  C1 <- step(1 + b1)*step(1 + b2)*step(1 + b1 + b2 + b3)
}"
writeLines(regi2.bug, "regi2.bug")

inits <- function() {
  list(b0 = 0, b1 = 1, b2 = 1, b3 = 1)
}
  sim2 <-
  bugs(
    data,
    inits = inits,
    model.file = "regi2.bug",
    parameters.to.save = c("b0", "b1", "b2", "b3"),
    n.chains = 4,
    n.burnin = 5e+05,
    n.iter = 1e+06,
    bugs.directory = bugs.directory,
    debug = FALSE
  )
print(sim2)
# mean sd 2.5% 25% 50% 75% 97.5% Rhat
# b0 -2.7 0.1 -2.8 -2.7 -2.7 -2.6 -2.5 1
# b1 1.4 0.2 1.0 1.3 1.4 1.6 2.0 1
# b2 0.9 0.2 0.5 0.7 0.9 1.0 1.3 1
# b3 1.3 0.3 0.7 1.1 1.3 1.5 1.9 1

Консольный вывод:

> source('.../dev/stackoverflow/53809468/53809468.R')
Loading required package: coda
Loading required package: boot
Inference for Bugs model at "regi1.bug", fit using WinBUGS,
 4 chains, each with 1e+06 iterations (first 5e+05 discarded), n.thin = 2000
 n.sims = 1000 iterations saved
         mean  sd 2.5%  25%  50%  75% 97.5% Rhat n.eff
a0       -2.8 0.1 -2.9 -2.8 -2.8 -2.7  -2.6    1   560
a1        1.3 0.2  0.9  1.2  1.3  1.5   1.8    1   400
a2        0.8 0.1  0.5  0.7  0.8  0.9   1.0    1   520
a3        1.0 0.3  0.5  0.9  1.0  1.2   1.5    1  1000
deviance 42.6 5.6 33.7 38.5 42.0 46.0  55.1    1   290

For each parameter, n.eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor (at convergence, Rhat=1).

DIC info (using the rule, pD = Dbar-Dhat)
pD = 2.9 and DIC = 45.5
DIC is an estimate of expected predictive error (lower deviance is better).
Inference for Bugs model at "regi2.bug", fit using WinBUGS,
 4 chains, each with 1e+06 iterations (first 5e+05 discarded), n.thin = 2000
 n.sims = 1000 iterations saved
         mean  sd 2.5%  25%  50%  75% 97.5% Rhat n.eff
b0       -2.7 0.1 -2.8 -2.7 -2.7 -2.6  -2.5    1  1000
b1        1.4 0.2  1.0  1.3  1.4  1.6   2.0    1  1000
b2        0.9 0.2  0.5  0.7  0.9  1.0   1.3    1   420
b3        1.3 0.3  0.7  1.1  1.3  1.5   1.9    1  1000
deviance 49.3 6.8 38.4 44.4 48.6 53.7  64.8    1  1000

For each parameter, n.eff is a crude measure of effective sample size,
and Rhat is the potential scale reduction factor (at convergence, Rhat=1).

DIC info (using the rule, pD = Dbar-Dhat)
pD = 3.0 and DIC = 52.3
DIC is an estimate of expected predictive error (lower deviance is better).
> 

Заранее спасибоза любую помощь.

...