R/nof1.rjags.R

Defines functions nof1.nma.binomial.rjags nof1.nma.poisson.rjags nof1.nma.normal.rjags nof1.nma.rjags nof1.ma.ordinal.rjags nof1.ma.binomial.rjags nof1.ma.poisson.rjags nof1.ma.normal.rjags nof1.ma.rjags nof1.ordinal.rjags nof1.poisson.rjags nof1.binomial.rjags nof1.normal.rjags nof1.rjags

nof1.rjags <- function(nof1){

  response <- nof1$response
  code <- if(response == "normal"){
    nof1.normal.rjags(nof1)
  } else if(response == "ordinal"){
    nof1.ordinal.rjags(nof1)
  } else if(response == "binomial"){
    nof1.binomial.rjags(nof1)
  } else if(response == "poisson"){
    nof1.poisson.rjags(nof1)
  }
  return(code)
}

nof1.normal.rjags <- function(nof1){

  code <- paste0("model{")

  code <- paste0(code,
                 "\n\tfor (i in 1:", nof1$nobs, ") {")

  if (nof1$corr.y) {
    code <- paste0(code,
                   "\n\t\tY[i] ~ dnorm(m[i], prec*((1 - equals(i, 1)) * 1 + equals(i, 1) * (1-rho^2)))",
                   "\n\t\tm[i] <- mu[i] + rho * e[i]")
  } else {
    code <- paste0(code,
                   "\n\t\tY[i] ~ dnorm(m[i], prec)",
                   "\n\t\tm[i] <- mu[i]")
  }

  code <- paste0(code,
                 "\n\t\tmu[i] <- beta_", nof1$Treat.name[1], "*Treat_", nof1$Treat.name[1], "[i]")

  if (length(nof1$Treat.name) > 1){
    for(i in nof1$Treat.name[2:length(nof1$Treat.name)]){
      code <- paste0(code, " + beta_", i, "*Treat_", i, "[i]")
    }
  }

  if (nof1$bs.trend){
    for (i in 1:nof1$bs_df){
      code <- paste0(code, " + eta_", i, "*bs", i, "[i]")
    }
  }

  code <- paste0(code,
                 "\n\t}")

  if (nof1$corr.y) {
    code <- paste0(code,
                   "\n",
                   "\n\te[1] <- 0",
                   "\n\tfor (i in 2:", nof1$nobs, ") {",
                   "\n\t\te[i] <- (1 - equals(i, 1)) * (Y[i-1] - mu[i-1]) + equals(i, 1) * 0",
                   "\n\t}")

    code <- paste0(code,
                   "\n\trho ~ ", nof1$rho.prior[[1]], "(", nof1$rho.prior[[2]], ", ", nof1$rho.prior[[3]], ")")
  }

  for(i in nof1$Treat.name){
    code <- paste0(code,
                   "\n\tbeta_", i, " ~ ", nof1$beta.prior[[1]], "(", nof1$beta.prior[[2]], ", ", nof1$beta.prior[[3]], ")")

    # Truncated normal distribution for beta's
    if (length(nof1$beta.prior) > 3) {

      if (!is.na(nof1$beta.prior[[4]])) {
        code <- paste0(code,
                       " T(", nof1$beta.prior[[4]], ",")
      } else {
        code <- paste0(code,
                       " T(,")
      }

      if(!is.na(nof1$beta.prior[[5]])) {
        code <- paste0(code,
                       nof1$beta.prior[[5]], ")")
      } else {
        code <- paste0(code,
                       ")")
      }
    } # if (length(beta.prior) > 3) {
  } #  for(i in Treat.name){
  code <- paste0(code, "\n")

  if (nof1$bs.trend){
    for (i in 1:nof1$bs_df){
      code <- paste0(code, "\n\teta_", i, " ~ ", nof1$eta.prior[[1]], "(", nof1$eta.prior[[2]], ", ", nof1$eta.prior[[3]], ")")
    }
  }

  if (nof1$hy.prior[[1]] == "dunif") {
    code <- paste0(code,
                   "\n\tprec <- pow(sd, -2)",
                   "\n\tsd ~ ", nof1$hy.prior[[1]], "(", nof1$hy.prior[[2]], ", ", nof1$hy.prior[[3]], ")")
  } else if(nof1$hy.prior[[1]] == "dgamma"){
    code <- paste0(code,
                   "\n\tsd <- pow(prec, -0.5)",
                   "\n\tprec ~ dgamma(", nof1$hy.prior[[2]], ", ", nof1$hy.prior[[3]], ")",
                   "\n\tlogprec <- log(prec)")
  } else if(nof1$hy.prior[[1]] == "dhnorm"){
    code <- paste0(code,
                   "\n\tsd ~ dnorm(", nof1$hy.prior[[2]], ", ", nof1$hy.prior[[3]], ")T(0,)",
                   "\n\tprec <- pow(sd, -2)")
  }

  code <- paste0(code,
                 # nof1.hy.prior.rjags(nof1$hy.prior),
                 "\n}")
  return(code)
}

nof1.binomial.rjags <- function(nof1){

  with(nof1, {

    code <- paste0("model{")
    code <- paste0(code,
                   "\n\tfor (i in 1:", nobs, ") {",
                   "\n\t\tlogit(p[i]) <- beta_", Treat.name[1], "*Treat_", Treat.name[1], "[i]")

    if (length(Treat.name) > 1){
      for(i in Treat.name[2:length(Treat.name)]){
        code <- paste0(code, " + beta_", i, "*Treat_", i, "[i]")
      }
    }

    # if(!is.null(knots)){
    #   for(j in 1:ncol(BS)){
    #     code <- paste0(code, " + gamma", j, "* BS[i,", j, "]")
    #   }
    # }

    code <- paste0(code,
                   "\n\t\tY[i] ~ dbern(p[i])",
                   "\n\t}")
    # "\n\talpha ~ ", alpha.prior[[1]], "(", alpha.prior[[2]], ",", alpha.prior[[3]], ")")

    for(i in Treat.name){
      code <- paste0(code, "\n\tbeta_", i, " ~ ", beta.prior[[1]], "(", beta.prior[[2]], ",", beta.prior[[3]], ")")
    }

    # if(!is.null(knots)){
    #   for(j in 1:ncol(BS)){
    #     code <- paste0(code, "\n\tgamma", j, " ~ ", gamma.prior[[1]], "(", gamma.prior[[2]], ",", gamma.prior[[3]], ")")
    #   }
    # }
    code <- paste0(code, "\n}")

    return(code)
  })

}

nof1.poisson.rjags <- function(nof1){

  with(nof1, {

    code <- paste0("model{")
    code <- paste0(code,
                   "\n\tfor (i in 1:", nobs, ") {",
                   "\n\t\tlog(lambda[i]) <- beta_", Treat.name[1], "*Treat_", Treat.name[1], "[i]")

    if (length(Treat.name) > 1){
      for(i in Treat.name[2:length(Treat.name)]){
        code <- paste0(code, " + beta_", i, "*Treat_", i, "[i]")
      }
    }

    if (bs.trend){
      for (i in 1:bs_df){
        code <- paste0(code, " + eta_", i, "*bs", i, "[i]")
      }
    }

    code <- paste0(code,
                   "\n\t\tY[i] ~ dpois(lambda[i])",
                   "\n\t}")
    #               "\n\talpha ~ ", alpha.prior[[1]], "(", alpha.prior[[2]], ",", alpha.prior[[3]], ")")

    for(i in Treat.name){
      code <- paste0(code, "\n\tbeta_", i, " ~ ", beta.prior[[1]], "(", beta.prior[[2]], ",", beta.prior[[3]], ")")
    }

    if (bs.trend){
      for (i in 1:bs_df){
        code <- paste0(code, "\n\teta_", i, " ~ ", eta.prior[[1]], "(", eta.prior[[2]], ", ", eta.prior[[3]], ")")
      }
    }

    code <- paste0(code, "\n}")
    return(code)
  })
}

nof1.ordinal.rjags <- function(nof1){

  code <- paste0("model{\n")
  code <- paste0(code,
                 "\tfor (i in 1:", nof1$nobs, ") {\n")

  code <- paste0(code,
                 "\t\tfor (j in 2:", nof1$ncat, ") {\n")

  if (nof1$ord.model == "cumulative") {

    code <- paste0(code,
                   "\t\t\tlogit(q[i, j-1]) <- alpha[j-1]")
    for(Treat.name.i in 2:nof1$n.Treat){
      code <- paste0(code,
                     " + beta_", nof1$Treat.name[Treat.name.i], " * Treat_", nof1$Treat.name[Treat.name.i], "[i]")
    }
    code <- paste0(code, "\n")
    code <- paste0(code,
                   "\t\t}\n")

    code <- paste0(code,
                   "\t\tp[i, 1] <- q[i, 1]\n")
    code <- paste0(code,
                   "\t\tfor (j in 2:", nof1$ncat - 1, ") {\n")
    code <- paste0(code,
                   "\t\t\tp[i,j] <- q[i, j] - q[i, j-1]\n")
    code <- paste0(code,
                   "\t\t}\n")
    code <- paste0(code,
                   "\t\tp[i, ", nof1$ncat, "] <- 1 - q[i, ", nof1$ncat - 1, "]\n")

  } else { # (nof1$ord.model == "acat")
    code <- paste0(code,
                   "\t\t\tp[i, j] <- p[i, j-1] * c[i, j-1]\n")
    code <- paste0(code,
                   "\t\t\tlog(c[i, j-1]) <- alpha[j-1]")
    for(Treat.name.i in 2:nof1$n.Treat){
      code <- paste0(code,
                     " + beta_", nof1$Treat.name[Treat.name.i], " * Treat_", nof1$Treat.name[Treat.name.i], "[i]")
    }
    code <- paste0(code, "\n")
    code <- paste0(code,
                   "\t\t}\n")

    # at least 3 categories in the ordinal outcome because we always retain the missing levels
    # so at least 2 contrasts
    code <- paste0(code,
                   "\t\tp[i, 1] <- 1 / (1 + c[i, 1] + c[i, 1] * c[i, 2]")

    # need to test if there are more than 5 levels
    if (nof1$ncat >= 4) {
      for (i in 4:nof1$ncat) {
        code <- paste0(code,
                       " + c[i, 1]")
        for (j in 2:(i - 1)) {
          code <- paste0(code,
                         " * c[i, ", j, "]")
        }
      }
    }
    code <- paste0(code,
                   ")\n")
  }


  code <- paste0(code,
                 "\t\tY[i] ~ dcat(p[i, ])\n")
  code <- paste0(code,
                 "\t}\n\n")

  # "\n\t\tp[i,1] <- 1 - Q[i,1]",
  # "\n\t\tfor(r in 2:", ncat-1, ") {",
  # "\n\t\t\tp[i,r] <- Q[i,r-1] - Q[i,r]",
  # "\n\t\t}",
  # "\n\t\tp[i,", ncat, "] <- Q[i,", ncat-1, "]",
  # "\n\t\tfor(r in 1:", ncat-1, ") {",
  # "\n\t\t\tlogit(Q[i,r]) <- -c[r]") # + epsilon[i]")

  # if(!is.null(knots)){
  #   for(j in 1:ncol(BS)){
  #     code <- paste0(code, " + gamma", j, "* BS[i,", j, "]")
  #   }
  # }

  # priors
  if (nof1$ord.model == "cumulative") {

    # dalpha put increasing restriction on alpha
    code <- paste0(code,
                   "\talpha[1] <- dalpha[1]\n",
                   "\tdalpha[1] ~ ", nof1$alpha.prior[[1]], "(", nof1$alpha.prior[[2]], ", ", nof1$alpha.prior[[3]], ")\n")

    code <- paste0(code,
                   "\tfor (j in 2:", nof1$ncat - 1,") {\n")
    code <- paste0(code,
                   "\t\talpha[j] <- alpha[j-1] + dalpha[j]\n")
    code <- paste0(code,
                   "\t\tdalpha[j] ~ ", nof1$alpha.prior[[1]], "(", nof1$alpha.prior[[2]], ", ", nof1$alpha.prior[[3]], ") T(0, )\n")
    code <- paste0(code,
                   "\t}\n")

  } else { # nof1$ord.model == "acat"
    code <- paste0(code,
                   "\tfor (j in 2:", nof1$ncat, ") {\n")
    code <- paste0(code,
                   "\t\talpha[j-1] ~ ", nof1$alpha.prior[[1]], "(", nof1$alpha.prior[[2]], ", ", nof1$alpha.prior[[3]], ")\n")
    code <- paste0(code,
                   "\t}\n\n")
  }

  for(Treat.name.i in 2:nof1$n.Treat){
    code <- paste0(code,
                   "\tbeta_", nof1$Treat.name[Treat.name.i], " ~ ", nof1$beta.prior[[1]], "(", nof1$beta.prior[[2]], ", ", nof1$beta.prior[[3]], ")\n")
  }

  # code <- paste0(code,
  #                "\n\t\t}",
  #                "\n\t}",
  #                "\n\tfor(i in 2:", ncat-1, ") {",
  #                "\n\t\tdc[i] ~ ", dc.prior[[1]], "(", dc.prior[[2]], ",", dc.prior[[3]], ")",
  #                "\n\t}",
  #                "\n\tc[1] <- dc[1]",
  #                "\n\tfor (i in 2:", ncat-1, ") {",
  #                "\n\t\tc[i] <- c[i-1] + dc[i]",
  #                "\n\t}",
  #                "\n\tdc[1] ~ ", c1.prior[[1]], "(", c1.prior[[2]], ",", c1.prior[[3]], ")")
  #
  # for(i in Treat.name){
  #   code <- paste0(code, "\n\tbeta_", i, " ~ ", beta.prior[[1]], "(", beta.prior[[2]], ",", beta.prior[[3]], ")")
  # }
  # if(!is.null(knots)){
  #   for(j in 1:ncol(BS)){
  #     code <- paste0(code, "\n\tgamma", j, " ~ ", gamma.prior[[1]], "(", gamma.prior[[2]], ",", gamma.prior[[3]], ")")
  #   }
  # }

  #code <- paste0(code, nof1.hy.prior.rjags(hy.prior), "\n}")
  code <- paste0(code, "}")
  return(code)

}

#################################
######### Meta analysis #########
#################################
nof1.ma.rjags <- function(nof1) {

  if (nof1$response == "normal") {
    code <- nof1.ma.normal.rjags(nof1)
  } else if (nof1$response == "poisson") {
    code <- nof1.ma.poisson.rjags(nof1)
  } else if (nof1$response == "binomial") {
    code <- nof1.ma.binomial.rjags(nof1)
  } else if (nof1$response == "ordinal") {
    code <- nof1.ma.ordinal.rjags(nof1)
  }


  return(code)
}

nof1.ma.normal.rjags <- function(nof1) {

  code <- paste0("model{\n")

  code <- paste0(code,
                 "\tfor (i in 1:n.ID) {\n\n")

  if ((nof1$model.intcpt == "fixed") & (nof1$model.slp == "random")) {
    # Fixed intercepts (prior)
    code <- paste0(code,
                   "\t\talpha[i] ~ ", nof1$alpha.prior[[1]], "(", nof1$alpha.prior[[2]], ", ", nof1$alpha.prior[[3]], ")")

    # Truncated normal distribution for beta's
    if (length(nof1$alpha.prior) > 3) {

      if (!is.na(nof1$alpha.prior[[4]])) {
        code <- paste0(code,
                       " T(", nof1$alpha.prior[[4]], ",")
      } else {
        code <- paste0(code,
                       " T(,")
      }

      if(!is.na(nof1$alpha.prior[[5]])) {
        code <- paste0(code,
                       nof1$alpha.prior[[5]], ")")
      } else {
        code <- paste0(code,
                       ")")
      }
    } # if (length(nof1$alpha.prior) > 3) {

    # Random effects
    code <- paste0(code,
                   "\n\t\tbeta[i, 1:", nof1$n.Treat - 1, "] ~ dmnorm.vcov(d[1:", nof1$n.Treat - 1, "], Sigma_delta[1:",
                   nof1$n.Treat - 1, ", 1:", nof1$n.Treat - 1, "])\n")

    for (Treat.name.i in 2:nof1$n.Treat) {
      code <- paste0(code,
                     "\t\tbeta_", nof1$Treat.name[Treat.name.i], "[i] <- beta[i, ", Treat.name.i - 1, "]\n")
    }


  } else if ((nof1$model.intcpt == "random") & (nof1$model.slp == "random")) { # (nof1$model.intcpt == "random")
    code <- paste0(code,
                   "\t\tbeta[i, 1:n.Treat] ~ dmnorm.vcov(b[1:n.Treat], Sigma_beta[1:n.Treat, 1:n.Treat])\n")
    for (n.Treat.i in 1:nof1$n.Treat) {
      code <- paste0(code,
                     "\t\tbeta_", nof1$Treat.name[n.Treat.i], "[i] <- beta[i, ", n.Treat.i, "]\n")
    }
  }
  code <- paste0(code, "\n")

  # First level model
  code <- paste0(code,
                 "\t\tfor (j in 1:nobs.ID[i]) {\n")

  # if (nof1$model.linkfunc == "log") {
  #   code <- paste0(code,
  #                  "\t\t\tY[j, i] ~ dnorm(mu[j, i], prec_resid) T(0, )\n")
  # } else {
  code <- paste0(code,
                 "\t\t\tY[j, i] ~ dnorm(mu[j, i], prec_resid)\n")
  # }

  # not common intercept
  if (nof1$model.intcpt != "common") {

    # fixed intercept, identity link
    if ((nof1$model.intcpt == "fixed")) {
      code <- paste0(code,
                     "\t\t\tmu[j, i] <- alpha[i]")

      # random intercept, identity link
    } else if (nof1$model.intcpt == "random") {
      code <- paste0(code,
                     "\t\t\tmu[j, i] <- beta_", nof1$Treat.name[1], "[i] * Treat_", nof1$Treat.name[1], "[j, i]")
    }

    # random slopes
    if (nof1$n.Treat > 1) {
      for(Treat.name.i in 2:nof1$n.Treat){
        code <- paste0(code,
                       " + beta_", nof1$Treat.name[Treat.name.i], "[i] * Treat_", nof1$Treat.name[Treat.name.i], "[j, i]")
      }
    }
    # cases not working yet: fixed and common slopes; other link functions

    # common intercept
  } else { # if (nof1$model.intcpt != "common") {

    # log link
    if (nof1$model.linkfunc == "log") {
      code <- paste0(code,
                     "\t\t\tmu[j, i] <- exp(lmu[j, i])\n")
      # identity link
    } else {
      code <- paste0(code,
                     "\t\t\tmu[j, i] <- lmu[j, i]\n")
    }

    # common intercept
    code <- paste0(code,
                   "\t\t\tlmu[j, i] <- beta_", nof1$Treat.name[1], " * Treat_", nof1$Treat.name[1], "[j, i]")

    # common slopes
    if (nof1$n.Treat > 1) {
      for(Treat.name.i in 2:nof1$n.Treat){
        code <- paste0(code,
                       " + beta_", nof1$Treat.name[Treat.name.i], " * Treat_", nof1$Treat.name[Treat.name.i], "[j, i]")
      }
    }
    # cases not working yet: fixed and random slopes;
  }


  # adjust for covariates
  if (!is.null(nof1$names.covariates)) {

    for (covariates.i in 1:length(nof1$names.covariates)) {
      code <- paste0(code,
                     " + beta_", nof1$names.covariates[covariates.i], " * ", nof1$names.covariates[covariates.i], "[j, i]")
    }

  }

  # adjust for trend by basis splines
  if (nof1$spline.trend) {
    for (l in 1:nof1$spline_df){
      code <- paste0(code, " + eta[", l, "]*spline", l, "[time[j, i]]")
    }
  }

  # adjust for trend by step functions
  if (nof1$step.trend) {
    for (p in nof1$n.steps){
      code <- paste0(code, " + eta[", p-1, "]*step", p, "[j, i]")
    }
  }

  code <- paste0(code, "\n")

  code <- paste0(code, "\t\t}\n") # for (j in 1:nobs.ID[i])
  code <- paste0(code, "\t}\n\n")  # for (i in 1:n.ID)

  # Priors
  # prior for residual error
  code <- paste0(code,
                 "\tsd_resid <- pow(prec_resid, -0.5)\n")
  code <- paste0(code,
                 "\tprec_resid ~ ", nof1$hy.prior[[1]], "(", nof1$hy.prior[[2]], ", ", nof1$hy.prior[[3]], ")\n\n")

  # prior for treatment effect
  if ((nof1$model.intcpt == "fixed") & (nof1$model.slp == "random")) {
    code <- paste0(code,
                   "\tprec_delta ~ ", nof1$hy.prior[[1]], "(", nof1$hy.prior[[2]], ", ", nof1$hy.prior[[3]], ")\n")
    code <- paste0(code,
                   "\tsigmaSq_d <- pow(prec_delta, -1)\n\n")

    for (Treat.name.i in 2:nof1$n.Treat) {
      code <- paste0(code,
                     "\td[", Treat.name.i-1, "] ~ ", nof1$beta.prior[[1]], "(", nof1$beta.prior[[2]], ", ", nof1$beta.prior[[3]], ")\n")
      code <- paste0(code,
                     "\tSigma_delta[", Treat.name.i-1, ", ", Treat.name.i-1, "] <- sigmaSq_d\n")

      if ((Treat.name.i-1) > 1) {
        for (Treat.name.j in 1:(Treat.name.i-1-1)) {
          code <- paste0(code,
                         "\tSigma_delta[", Treat.name.i-1, ", ", Treat.name.j, "] <- sigmaSq_d / 2\n")
        }
      }

      if (Treat.name.i <= (nof1$n.Treat - 1)) {
        for (Treat.name.j in Treat.name.i:(nof1$n.Treat-1)) {
          code <- paste0(code,
                         "\tSigma_delta[", Treat.name.i-1, ", ", Treat.name.j, "] <- sigmaSq_d / 2\n")
        }
      }
    }

  } else if ((nof1$model.intcpt == "random") & (nof1$model.slp == "random")) { # if (nof1$model.intcpt == "fixed") {

    code <- paste0(code,
                   "\tprec_beta ~ ", nof1$hy.prior[[1]], "(", nof1$hy.prior[[2]], ", ", nof1$hy.prior[[3]], ")\n")
    code <- paste0(code,
                   "\tsigmaSq_beta <- pow(prec_beta, -1)\n")
    code <- paste0(code,
                   "\trho ~ ", nof1$rho.prior[[1]], "(", nof1$rho.prior[[2]], ", ", nof1$rho.prior[[3]], ")\n\n")

    code <- paste0(code,
                   "\tfor (k in 1:n.Treat) {\n")
    code <- paste0(code,
                   "\t\tb[k] ~ ", nof1$beta.prior[[1]], "(", nof1$beta.prior[[2]], ", ", nof1$beta.prior[[3]], ")\n")
    code <- paste0(code,
                   "\t}\n\n") # for (k in 1:n.Treat) {

    # row 1
    code <- paste0(code,
                   "\tSigma_beta[1, 1] <- sigmaSq_beta\n")
    code <- paste0(code,
                   "\tfor (k in 2:n.Treat) {\n")
    code <- paste0(code,
                   "\t\tSigma_beta[1, k] <- rho * sigmaSq_beta\n")
    code <- paste0(code,
                   "\t}\n") # for (k in 2:n.Treat) {
    # row 2:(n.Treat-1)
    code <- paste0(code,
                   "\tfor (k in 2:(n.Treat - 1)) {\n")
    code <- paste0(code,
                   "\t\tSigma_beta[k, k] <- sigmaSq_beta\n")
    code <- paste0(code,
                   "\t\tfor (l in 1:(k-1)) {\n")
    code <- paste0(code,
                   "\t\t\tSigma_beta[k, l] <- rho * sigmaSq_beta\n")
    code <- paste0(code,
                   "\t\t}\n") # for (l in 1:(k-1)) {
    code <- paste0(code,
                   "\t\tfor (l in (k+1):n.Treat) {\n")
    code <- paste0(code,
                   "\t\t\tSigma_beta[k, l] <- rho * sigmaSq_beta\n")
    code <- paste0(code,
                   "\t\t}\n") # for (l in (k+1):n.Treat) {
    code <- paste0(code,
                   "\t}\n") # for (k in 2:(n.Treat - 1)) {
    # row n.Treat
    code <- paste0(code,
                   "\tSigma_beta[n.Treat, n.Treat] <- sigmaSq_beta\n")
    code <- paste0(code,
                   "\tfor (k in 1:(n.Treat - 1)) {\n")
    code <- paste0(code,
                   "\t\tSigma_beta[n.Treat, k] <- rho * sigmaSq_beta\n")
    code <- paste0(code,
                   "\t}\n") # for (k in 1:(n.Treat - 1)) {

  } else if ((nof1$model.intcpt == "common") & (nof1$model.slp == "common")) {

    for(i in nof1$Treat.name){
      code <- paste0(code,
                     "\tbeta_", i, " ~ ", nof1$beta.prior[[1]], "(", nof1$beta.prior[[2]], ", ", nof1$beta.prior[[3]], ")")

      # Truncated normal distribution for beta's
      if (length(nof1$beta.prior) > 3) {

        if (!is.na(nof1$beta.prior[[4]])) {
          code <- paste0(code,
                         " T(", nof1$beta.prior[[4]], ", ")
        } else {
          code <- paste0(code,
                         " T(, ")
        }

        if(!is.na(nof1$beta.prior[[5]])) {
          code <- paste0(code,
                         nof1$beta.prior[[5]], ")")
        } else {
          code <- paste0(code,
                         ")")
        }
      } # if (length(beta.prior) > 3) {

      code <- paste0(code, "\n")
    } #  for(i in Treat.name){
  }
  code <- paste0(code, "\n")

  # prior for covariate coefficients
  if (!is.null(nof1$names.covariates)) {

    for (covariates.i in 1:length(nof1$names.covariates)) {
      code <- paste0(code,
                     "\tbeta_", nof1$names.covariates[covariates.i], " ~ ", nof1$beta.prior[[1]], "(", nof1$beta.prior[[2]], ", ", nof1$beta.prior[[3]], ")\n")
    }
    code <- paste0(code, "\n")
  }

  # prior for trend coefficients - splines
  if (nof1$spline.trend) {
    code <- paste0(code,
                   "\tfor (l in 1:", nof1$spline_df, ") {\n")
    code <- paste0(code, "\t\teta[l] ~ ", nof1$eta.prior[[1]], "(", nof1$eta.prior[[2]], ", ", nof1$eta.prior[[3]], ")\n")
    code <- paste0(code,
                   "\t}\n")
  }

  # prior for trend coefficients - steps
  if (nof1$step.trend) {
    code <- paste0(code,
                   "\tfor (p in 1:", max(nof1$n.steps) - 1, ") {\n")
    code <- paste0(code, "\t\teta[p] ~ ", nof1$eta.prior[[1]], "(", nof1$eta.prior[[2]], ", ", nof1$eta.prior[[3]], ")\n")
    code <- paste0(code,
                   "\t}\n")
  }

  code <- paste0(code, "}") # model {

  # cat(code)
  return(code)
}

nof1.ma.poisson.rjags <- function(nof1) {

  code <- paste0("model{\n")

  code <- paste0(code,
                 "\tfor (i in 1:n.ID) {\n\n")

  if (nof1$model.intcpt == "fixed") {
    # Fixed intercepts (prior)
    code <- paste0(code,
                   "\t\talpha[i] ~ ", nof1$alpha.prior[[1]], "(", nof1$alpha.prior[[2]], ", ", nof1$alpha.prior[[3]], ")\n")

    # Random effects
    code <- paste0(code,
                   "\t\tbeta[i, 1:", nof1$n.Treat - 1, "] ~ dmnorm.vcov(d[1:", nof1$n.Treat - 1, "], Sigma_delta[1:",
                   nof1$n.Treat - 1, ", 1:", nof1$n.Treat - 1, "])\n")

    for (Treat.name.i in 2:nof1$n.Treat) {
      code <- paste0(code,
                     "\t\tbeta_", nof1$Treat.name[Treat.name.i], "[i] <- beta[i, ", Treat.name.i - 1, "]\n")
    }
  } else { # nof1$model.intcpt == "random"
    code <- paste0(code,
                   "\t\tbeta[i, 1:n.Treat] ~ dmnorm.vcov(b[1:n.Treat], Sigma_beta[1:n.Treat, 1:n.Treat])\n")
    for (n.Treat.i in 1:nof1$n.Treat) {
      code <- paste0(code,
                     "\t\tbeta_", nof1$Treat.name[n.Treat.i], "[i] <- beta[i, ", n.Treat.i, "]\n")
    }
  }
  code <- paste0(code, "\n")

  # First level model
  code <- paste0(code,
                 "\t\tfor (j in 1:nobs.ID[i]) {\n")

  code <- paste0(code,
                 "\t\t\tY[j, i] ~ dpois(lambda[j, i])\n")

  if (nof1$model.intcpt == "fixed") {
    code <- paste0(code,
                   "\t\t\tlog(lambda[j, i]) <- alpha[i]")
  } else {
    code <- paste0(code,
                   "\t\t\tlog(lambda[j, i]) <- beta_", nof1$Treat.name[1], "[i] * Treat_", nof1$Treat.name[1], "[j, i]")
  }

  if (nof1$n.Treat > 1) {
    for(Treat.name.i in 2:nof1$n.Treat){
      code <- paste0(code,
                     " + beta_", nof1$Treat.name[Treat.name.i], "[i] * Treat_", nof1$Treat.name[Treat.name.i], "[j, i]")
    }
  }

  # adjust for covariates
  if (!is.null(nof1$names.covariates)) {

    for (covariates.i in 1:length(nof1$names.covariates)) {
      code <- paste0(code,
                     " + beta_", nof1$names.covariates[covariates.i], " * ", nof1$names.covariates[covariates.i], "[j, i]")
    }

  }

  # adjust for trend by basis splines
  if (nof1$spline.trend) {
    for (l in 1:nof1$spline_df){
      code <- paste0(code, " + eta[", l, "]*spline", l, "[time[j, i]]")
    }
  }
  code <- paste0(code, "\n")

  code <- paste0(code, "\t\t}\n") # for (j in 1:nobs.ID[i])
  code <- paste0(code, "\t}\n\n")  # for (i in 1:n.ID)

  # Priors
  if (nof1$model.intcpt == "fixed") {
    # prior for treatment effect
    code <- paste0(code,
                   "\tprec_delta ~ ", nof1$hy.prior[[1]], "(", nof1$hy.prior[[2]], ", ", nof1$hy.prior[[3]], ")\n")
    code <- paste0(code,
                   "\tsigmaSq_d <- pow(prec_delta, -1)\n\n")

    for (Treat.name.i in 2:nof1$n.Treat) {
      code <- paste0(code,
                     "\td[", Treat.name.i-1, "] ~ ", nof1$beta.prior[[1]], "(", nof1$beta.prior[[2]], ", ", nof1$beta.prior[[3]], ")\n")
      code <- paste0(code,
                     "\tSigma_delta[", Treat.name.i-1, ", ", Treat.name.i-1, "] <- sigmaSq_d\n")

      if ((Treat.name.i-1) > 1) {
        for (Treat.name.j in 1:(Treat.name.i-1-1)) {
          code <- paste0(code,
                         "\tSigma_delta[", Treat.name.i-1, ", ", Treat.name.j, "] <- sigmaSq_d / 2\n")
        }
      }

      if (Treat.name.i <= (nof1$n.Treat - 1)) {
        for (Treat.name.j in Treat.name.i:(nof1$n.Treat-1)) {
          code <- paste0(code,
                         "\tSigma_delta[", Treat.name.i-1, ", ", Treat.name.j, "] <- sigmaSq_d / 2\n")
        }
      }
    }
  } else { # if (nof1$model.intcpt == "fixed") {
    code <- paste0(code,
                   "\tprec_beta ~ ", nof1$hy.prior[[1]], "(", nof1$hy.prior[[2]], ", ", nof1$hy.prior[[3]], ")\n")
    code <- paste0(code,
                   "\tsigmaSq_beta <- pow(prec_beta, -1)\n")
    code <- paste0(code,
                   "\trho ~ ", nof1$rho.prior[[1]], "(", nof1$rho.prior[[2]], ", ", nof1$rho.prior[[3]], ")\n\n")

    code <- paste0(code,
                   "\tfor (k in 1:n.Treat) {\n")
    code <- paste0(code,
                   "\t\tb[k] ~ ", nof1$beta.prior[[1]], "(", nof1$beta.prior[[2]], ", ", nof1$beta.prior[[3]], ")\n")
    code <- paste0(code,
                   "\t}\n\n") # for (k in 1:n.Treat) {

    # row 1
    code <- paste0(code,
                   "\tSigma_beta[1, 1] <- sigmaSq_beta\n")
    code <- paste0(code,
                   "\tfor (k in 2:n.Treat) {\n")
    code <- paste0(code,
                   "\t\tSigma_beta[1, k] <- rho * sigmaSq_beta\n")
    code <- paste0(code,
                   "\t}\n") # for (k in 2:n.Treat) {
    # row 2:(n.Treat-1)
    code <- paste0(code,
                   "\tfor (k in 2:(n.Treat - 1)) {\n")
    code <- paste0(code,
                   "\t\tSigma_beta[k, k] <- sigmaSq_beta\n")
    code <- paste0(code,
                   "\t\tfor (l in 1:(k-1)) {\n")
    code <- paste0(code,
                   "\t\t\tSigma_beta[k, l] <- rho * sigmaSq_beta\n")
    code <- paste0(code,
                   "\t\t}\n") # for (l in 1:(k-1)) {
    code <- paste0(code,
                   "\t\tfor (l in (k+1):n.Treat) {\n")
    code <- paste0(code,
                   "\t\t\tSigma_beta[k, l] <- rho * sigmaSq_beta\n")
    code <- paste0(code,
                   "\t\t}\n") # for (l in (k+1):n.Treat) {
    code <- paste0(code,
                   "\t}\n") # for (k in 2:(n.Treat - 1)) {
    # row n.Treat
    code <- paste0(code,
                   "\tSigma_beta[n.Treat, n.Treat] <- sigmaSq_beta\n")
    code <- paste0(code,
                   "\tfor (k in 1:(n.Treat - 1)) {\n")
    code <- paste0(code,
                   "\t\tSigma_beta[n.Treat, k] <- rho * sigmaSq_beta\n")
    code <- paste0(code,
                   "\t}\n") # for (k in 1:(n.Treat - 1)) {

  }
  code <- paste0(code, "\n")

  # prior for covariate coefficients
  if (!is.null(nof1$names.covariates)) {

    for (covariates.i in 1:length(nof1$names.covariates)) {
      code <- paste0(code,
                     "\tbeta_", nof1$names.covariates[covariates.i], " ~ ", nof1$beta.prior[[1]], "(", nof1$beta.prior[[2]], ", ", nof1$beta.prior[[3]], ")\n")
    }
    code <- paste0(code, "\n")
  }

  # prior for trend coefficients - splines
  if (nof1$spline.trend) {
    code <- paste0(code,
                   "\tfor (l in 1:", nof1$spline_df, ") {\n")
    code <- paste0(code, "\t\teta[l] ~ ", nof1$eta.prior[[1]], "(", nof1$eta.prior[[2]], ", ", nof1$eta.prior[[3]], ")\n")
    code <- paste0(code,
                   "\t}\n")
  }

  code <- paste0(code, "}") # model {

  # cat(code)
  return(code)
}

nof1.ma.binomial.rjags <- function(nof1) {

  code <- paste0("model{\n")

  code <- paste0(code,
                 "\tfor (i in 1:n.ID) {\n\n")

  if (nof1$model.intcpt == "fixed") {
    # Fixed intercepts (prior)
    code <- paste0(code,
                   "\t\talpha[i] ~ ", nof1$alpha.prior[[1]], "(", nof1$alpha.prior[[2]], ", ", nof1$alpha.prior[[3]], ")")

    # Truncated normal distribution for beta's
    if (length(nof1$alpha.prior) > 3) {

      if (!is.na(nof1$alpha.prior[[4]])) {
        code <- paste0(code,
                       " T(", nof1$alpha.prior[[4]], ", ")
      } else {
        code <- paste0(code,
                       " T(, ")
      }

      if(!is.na(nof1$alpha.prior[[5]])) {
        code <- paste0(code,
                       nof1$alpha.prior[[5]], ")")
      } else {
        code <- paste0(code,
                       ")")
      }
    } # if (length(nof1$alpha.prior) > 3) {
    code <- paste0(code, "\n")

    # Random effects
    code <- paste0(code,
                   "\t\tbeta[i, 1:", nof1$n.Treat - 1, "] ~ dmnorm.vcov(d[1:", nof1$n.Treat - 1, "], Sigma_delta[1:",
                   nof1$n.Treat - 1, ", 1:", nof1$n.Treat - 1, "])\n")

    for (Treat.name.i in 2:nof1$n.Treat) {
      code <- paste0(code,
                     "\t\tbeta_", nof1$Treat.name[Treat.name.i], "[i] <- beta[i, ", Treat.name.i - 1, "]\n")
    }

  } else { # nof1$model.intcpt == "random"
    code <- paste0(code,
                   "\t\tbeta[i, 1:n.Treat] ~ dmnorm.vcov(b[1:n.Treat], Sigma_beta[1:n.Treat, 1:n.Treat])\n")
    for (n.Treat.i in 1:nof1$n.Treat) {
      code <- paste0(code,
                     "\t\tbeta_", nof1$Treat.name[n.Treat.i], "[i] <- beta[i, ", n.Treat.i, "]\n")
    }
  }
  code <- paste0(code, "\n")

  # First level model
  code <- paste0(code,
                 "\t\tfor (j in 1:nobs.ID[i]) {\n")

  code <- paste0(code,
                 "\t\t\tY[j, i] ~ dbern(p[j, i])\n")

  if (nof1$model.linkfunc == "logit") {
    if (nof1$model.intcpt == "fixed") {
      code <- paste0(code,
                     "\t\t\tlogit(p[j, i]) <- alpha[i]")
    } else {
      code <- paste0(code,
                     "\t\t\tlogit(p[j, i]) <- beta_", nof1$Treat.name[1], "[i] * Treat_", nof1$Treat.name[1], "[j, i]")
    }

  } else if (nof1$model.linkfunc == "log") {
    code <- paste0(code,
                   "\t\t\tp[j, i] <- exp(rlp[j, i])\n")
    code <- paste0(code,
                   "\t\t\trlp[j, i] <- min(0, lp[j, i])\n")

    if (nof1$model.intcpt == "fixed") {
      code <- paste0(code,
                     "\t\t\tlp[j, i] <- alpha[i]")
    } else {
      code <- paste0(code,
                     "\t\t\tlp[j, i] <- beta_", nof1$Treat.name[1], "[i] * Treat_", nof1$Treat.name[1], "[j, i]")
    }
  }

  if (nof1$n.Treat > 1) {
    for(Treat.name.i in 2:nof1$n.Treat){
      code <- paste0(code,
                     " + beta_", nof1$Treat.name[Treat.name.i], "[i] * Treat_", nof1$Treat.name[Treat.name.i], "[j, i]")
    }
  }

  # adjust for covariates
  if (!is.null(nof1$names.covariates)) {

    for (covariates.i in 1:length(nof1$names.covariates)) {
      code <- paste0(code,
                     " + beta_", nof1$names.covariates[covariates.i], " * ", nof1$names.covariates[covariates.i], "[j, i]")
    }

  }

  # adjust for trend by basis splines
  if (nof1$spline.trend) {
    for (l in 1:nof1$spline_df){
      code <- paste0(code, " + eta[", l, "]*spline", l, "[time[j, i]]")
    }
  }
  code <- paste0(code, "\n")

  code <- paste0(code, "\t\t}\n") # for (j in 1:nobs.ID[i])
  code <- paste0(code, "\t}\n\n")  # for (i in 1:n.ID)

  # Priors
  if (nof1$model.intcpt == "fixed") {
    # prior for treatment effect
    code <- paste0(code,
                   "\tprec_delta ~ ", nof1$hy.prior[[1]], "(", nof1$hy.prior[[2]], ", ", nof1$hy.prior[[3]], ")\n")
    code <- paste0(code,
                   "\tsigmaSq_d <- pow(prec_delta, -1)\n\n")

    for (Treat.name.i in 2:nof1$n.Treat) {
      code <- paste0(code,
                     "\td[", Treat.name.i-1, "] ~ ", nof1$beta.prior[[1]], "(", nof1$beta.prior[[2]], ", ", nof1$beta.prior[[3]], ")\n")
      code <- paste0(code,
                     "\tSigma_delta[", Treat.name.i-1, ", ", Treat.name.i-1, "] <- sigmaSq_d\n")

      if ((Treat.name.i-1) > 1) {
        for (Treat.name.j in 1:(Treat.name.i-1-1)) {
          code <- paste0(code,
                         "\tSigma_delta[", Treat.name.i-1, ", ", Treat.name.j, "] <- sigmaSq_d / 2\n")
        }
      }

      if (Treat.name.i <= (nof1$n.Treat - 1)) {
        for (Treat.name.j in Treat.name.i:(nof1$n.Treat-1)) {
          code <- paste0(code,
                         "\tSigma_delta[", Treat.name.i-1, ", ", Treat.name.j, "] <- sigmaSq_d / 2\n")
        }
      }
    }

  } else { # if (nof1$model.intcpt == "fixed") {
    code <- paste0(code,
                   "\tprec_beta ~ ", nof1$hy.prior[[1]], "(", nof1$hy.prior[[2]], ", ", nof1$hy.prior[[3]], ")\n")
    code <- paste0(code,
                   "\tsigmaSq_beta <- pow(prec_beta, -1)\n")
    code <- paste0(code,
                   "\trho ~ ", nof1$rho.prior[[1]], "(", nof1$rho.prior[[2]], ", ", nof1$rho.prior[[3]], ")\n\n")

    code <- paste0(code,
                   "\tfor (k in 1:n.Treat) {\n")
    code <- paste0(code,
                   "\t\tb[k] ~ ", nof1$beta.prior[[1]], "(", nof1$beta.prior[[2]], ", ", nof1$beta.prior[[3]], ")\n")
    code <- paste0(code,
                   "\t}\n\n") # for (k in 1:n.Treat) {

    # row 1
    code <- paste0(code,
                   "\tSigma_beta[1, 1] <- sigmaSq_beta\n")
    code <- paste0(code,
                   "\tfor (k in 2:n.Treat) {\n")
    code <- paste0(code,
                   "\t\tSigma_beta[1, k] <- rho * sigmaSq_beta\n")
    code <- paste0(code,
                   "\t}\n") # for (k in 2:n.Treat) {
    # row 2:(n.Treat-1)
    code <- paste0(code,
                   "\tfor (k in 2:(n.Treat - 1)) {\n")
    code <- paste0(code,
                   "\t\tSigma_beta[k, k] <- sigmaSq_beta\n")
    code <- paste0(code,
                   "\t\tfor (l in 1:(k-1)) {\n")
    code <- paste0(code,
                   "\t\t\tSigma_beta[k, l] <- rho * sigmaSq_beta\n")
    code <- paste0(code,
                   "\t\t}\n") # for (l in 1:(k-1)) {
    code <- paste0(code,
                   "\t\tfor (l in (k+1):n.Treat) {\n")
    code <- paste0(code,
                   "\t\t\tSigma_beta[k, l] <- rho * sigmaSq_beta\n")
    code <- paste0(code,
                   "\t\t}\n") # for (l in (k+1):n.Treat) {
    code <- paste0(code,
                   "\t}\n") # for (k in 2:(n.Treat - 1)) {
    # row n.Treat
    code <- paste0(code,
                   "\tSigma_beta[n.Treat, n.Treat] <- sigmaSq_beta\n")
    code <- paste0(code,
                   "\tfor (k in 1:(n.Treat - 1)) {\n")
    code <- paste0(code,
                   "\t\tSigma_beta[n.Treat, k] <- rho * sigmaSq_beta\n")
    code <- paste0(code,
                   "\t}\n") # for (k in 1:(n.Treat - 1)) {
  }

  code <- paste0(code, "\n")

  # prior for covariate coefficients
  if (!is.null(nof1$names.covariates)) {

    for (covariates.i in 1:length(nof1$names.covariates)) {
      code <- paste0(code,
                     "\tbeta_", nof1$names.covariates[covariates.i], " ~ ", nof1$beta.prior[[1]], "(", nof1$beta.prior[[2]], ", ", nof1$beta.prior[[3]], ")\n")
    }
    code <- paste0(code, "\n")
  }

  # prior for trend coefficients - splines
  if (nof1$spline.trend) {
    code <- paste0(code,
                   "\tfor (l in 1:", nof1$spline_df, ") {\n")
    code <- paste0(code, "\t\teta[l] ~ ", nof1$eta.prior[[1]], "(", nof1$eta.prior[[2]], ", ", nof1$eta.prior[[3]], ")\n")
    code <- paste0(code,
                   "\t}\n")
  }

  code <- paste0(code, "}") # model {

  # cat(code)
  return(code)
}

nof1.ma.ordinal.rjags <- function(nof1) {

  code <- paste0("model{\n")
  code <- paste0(code,
                 "\tfor (i in 1:n.ID) {\n")
  code <- paste0(code,
                 "\t\tfor (j in 1:nobs.ID[i]) {\n")

  code <- paste0(code,
                 "\t\t\tfor (r in 1:(ord.ncat - 1)) {\n")
  # contrasts
  code <- paste0(code,
                 "\t\t\t\tp[i, j, r+1] <- p[i, j, r] * c[i, j, r]\n")
  code <- paste0(code,
                 "\t\t\t\tlog(c[i, j, r]) <- beta_", nof1$Treat.name[1], "[i, r] * Treat_", nof1$Treat.name[1], "[j, i]")
  for(n.Treat.i in 2:nof1$n.Treat){
    code <- paste0(code,
                   " + beta_", nof1$Treat.name[n.Treat.i], "[i, r] * Treat_", nof1$Treat.name[n.Treat.i], "[j, i]")
  }
  code <- paste0(code, "\n")
  code <- paste0(code,
                 "\t\t\t}\n") # for (r in 1:(ord.ncat - 1)) {

  # at least 3 categories in the ordinal outcome because we always retain the missing levels
  # so at least 2 contrasts
  code <- paste0(code,
                 "\t\t\tp[i, j, 1] <- 1 / (1 + c[i, j, 1] + c[i, j, 1] * c[i, j, 2]")
  # need to test if there are more than 5 levels
  if (nof1$ord.ncat >= 4) {
    for (i in 4:nof1$ord.ncat) {
      code <- paste0(code,
                     " + c[i, j, 1]")
      for (j in 2:(i - 1)) {
        code <- paste0(code,
                       " * c[i, j, ", j, "]")
      }
    }
  }
  code <- paste0(code, ")\n")

  code <- paste0(code,
                 "\t\t\tY[j, i] ~ dcat(p[i, j, ])\n")
  code <- paste0(code,
                 "\t\t}\n\n") # for (j in 1:nobs.ID[i]) {

  # random effects
  if (nof1$ord.parallel) {
    code <- paste0(code,
                   "\t\tbeta[i, 1, 1:n.Treat] ~ dmnorm.vcov(b[1, 1:n.Treat], Sigma_beta[1:n.Treat, 1:n.Treat])\n")
    for(n.Treat.i in 1:nof1$n.Treat){
      code <- paste0(code,
                     "\t\tbeta_", nof1$Treat.name[n.Treat.i], "[i, 1] <- beta[i, 1, ", n.Treat.i, "]\n")
    }
    code <- paste0(code,
                   "\t\tfor (r in 2:(ord.ncat - 1)) {\n")
    code <- paste0(code,
                   "\t\t\tbeta[i, r, 1] ~ dnorm(b[r, 1], prec_beta)\n")
    code <- paste0(code,
                   "\t\t\tbeta_", nof1$Treat.name[1], "[i, r] <- beta[i, r, 1]\n")
    for(n.Treat.i in 2:nof1$n.Treat){
      code <- paste0(code,
                     "\t\t\tbeta_", nof1$Treat.name[n.Treat.i], "[i, r] <- beta_", nof1$Treat.name[1],
                     "[i, r] + (beta_", nof1$Treat.name[n.Treat.i], "[i, 1] - beta_", nof1$Treat.name[1], "[i, 1])\n")
    }
    code <- paste0(code,
                   "\t\t}\n") # for (r in 2:(ord.ncat - 1)) {
  } else {
    code <- paste0(code,
                   "\t\tfor (r in 1:(ord.ncat - 1)) {\n")
    code <- paste0(code,
                   "\t\t\tbeta[i, r, 1:n.Treat] ~ dmnorm.vcov(b[r, 1:n.Treat], Sigma_beta[1:n.Treat, 1:n.Treat])\n")
    for(n.Treat.i in 1:nof1$n.Treat){
      code <- paste0(code,
                     "\t\t\tbeta_", nof1$Treat.name[n.Treat.i], "[i, r] <- beta[i, r, ", n.Treat.i, "]\n")
    }
    code <- paste0(code,
                   "\t\t}\n") # for (r in 1:(ord.ncat - 1)) {
  }
  code <- paste0(code,
                 "\t}\n\n") # for (i in 1:n.ID) {

  # priors
  # prior for b
  if (nof1$ord.parallel) {
    code <- paste0(code,
                   "\tfor (k in 1:n.Treat) {\n")
    code <- paste0(code,
                   "\t\tb[1, k] ~ ", nof1$beta.prior[[1]], "(", nof1$beta.prior[[2]], ", ", nof1$beta.prior[[3]], ")\n")
    code <- paste0(code,
                   "\t}\n") # for (k in 1:n.Treat) {
    code <- paste0(code,
                   "\tfor (r in 2:(ord.ncat - 1)) {\n")
    code <- paste0(code,
                   "\t\tb[r, 1] ~ ", nof1$beta.prior[[1]], "(", nof1$beta.prior[[2]], ", ", nof1$beta.prior[[3]], ")\n")
    code <- paste0(code,
                   "\t}\n\n") # for (r in 2:(ord.ncat - 1)) {
  } else {
    code <- paste0(code,
                   "\tfor (r in 1:(ord.ncat - 1)) {\n")
    code <- paste0(code,
                   "\t\tfor (k in 1:n.Treat) {\n")
    code <- paste0(code,
                   "\t\t\tb[r, k] ~ ", nof1$beta.prior[[1]], "(", nof1$beta.prior[[2]], ", ", nof1$beta.prior[[3]], ")\n")
    code <- paste0(code,
                   "\t\t}\n") # for (k in 1:n.Treat) {
    code <- paste0(code,
                   "\t}\n\n") # for (r in 1:(ord.ncat - 1)) {
  }

  # prior for sigma
  # row 1
  code <- paste0(code,
                 "\tSigma_beta[1, 1] <- sigmaSq_beta\n")
  code <- paste0(code,
                 "\tfor (k in 2:n.Treat) {\n")
  code <- paste0(code,
                 "\t\tSigma_beta[1, k] <- rho * sigmaSq_beta\n")
  code <- paste0(code,
                 "\t}\n") # for (k in 2:n.Treat) {
  # row 2:(n.Treat-1)
  code <- paste0(code,
                 "\tfor (k in 2:(n.Treat - 1)) {\n")
  code <- paste0(code,
                 "\t\tSigma_beta[k, k] <- sigmaSq_beta\n")
  code <- paste0(code,
                 "\t\tfor (l in 1:(k-1)) {\n")
  code <- paste0(code,
                 "\t\t\tSigma_beta[k, l] <- rho * sigmaSq_beta\n")
  code <- paste0(code,
                 "\t\t}\n") # for (l in 1:(k-1)) {
  code <- paste0(code,
                 "\t\tfor (l in (k+1):n.Treat) {\n")
  code <- paste0(code,
                 "\t\t\tSigma_beta[k, l] <- rho * sigmaSq_beta\n")
  code <- paste0(code,
                 "\t\t}\n") # for (l in (k+1):n.Treat) {
  code <- paste0(code,
                 "\t}\n") # for (k in 2:(n.Treat - 1)) {
  # row n.Treat
  code <- paste0(code,
                 "\tSigma_beta[n.Treat, n.Treat] <- sigmaSq_beta\n")
  code <- paste0(code,
                 "\tfor (k in 1:(n.Treat - 1)) {\n")
  code <- paste0(code,
                 "\t\tSigma_beta[n.Treat, k] <- rho * sigmaSq_beta\n")
  code <- paste0(code,
                 "\t}\n\n") # for (k in 1:(n.Treat - 1)) {

  code <- paste0(code,
                 "\tsigmaSq_beta <- pow(prec_beta, -1)\n")
  code <- paste0(code,
                 "\tprec_beta ~ ", nof1$hy.prior[[1]], "(", nof1$hy.prior[[2]], ", ", nof1$hy.prior[[3]], ")\n")

  code <- paste0(code,
                 "\trho ~ ", nof1$rho.prior[[1]], "(", nof1$rho.prior[[2]], ", ", nof1$rho.prior[[3]], ")\n")


  code <- paste0(code,
                 "}") # model {

  # cat(code)
  return(code)
}

#########################################
######### Network meta analysis #########
#########################################
nof1.nma.rjags <- function(nof1) {

  if (nof1$response == "normal") {
    code <- nof1.nma.normal.rjags(nof1)
  } else if (nof1$response == "poisson") {
    code <- nof1.nma.poisson.rjags(nof1)
  } else if (nof1$response == "binomial") {
    code <- nof1.nma.binomial.rjags(nof1)
  }
  # else if (nof1$response == "ordinal") {
  #   code <- nof1.ma.ordinal.rjags(nof1)
  # }

  return(code)
}

nof1.nma.normal.rjags <- function(nof1) {

  code <- paste0("model{\n")

  if (nof1$summ.nID.perTreat$n_ID_perNTreat[1] != 0) {
    code <- paste0(code,
                   "\tfor (i in 1:", nof1$summ.nID.perTreat$n_ID_perNTreat[1], ") {\n")

    # random intercept should not include participants with only one treatment
    if (nof1$model.intcpt == "random") {

      stop("Random intercept model should not include participants with only one treatment!")
      # code <- paste0(code,
      #                "\t\tbeta_1[i] ~ dnorm(b[uniq.Treat.matrix[1, i]], prec_beta)\n")
      #
      # # covariate coefficients will be 0 any way for only one treatment if fixed intercept
      # if (!is.null(nof1$cov.matrix)) {
      #
      #   for (cov.i in 1:nrow(nof1$cov.matrix)) {
      #     code <- paste0(code,
      #                    "\t\teta_cov_i[i, 1, ", cov.i, "] <- eta_cov[uniq.Treat.matrix[1, i], ", cov.i, "]\n")
      #   }
      #
      # } # assign the actual eta cov
    } # if random intercept

    # First level model
    code <- paste0(code,
                   "\t\tfor (j in 1:nobs.ID[i]) {\n")

    if (!nof1$corr.y) {
      code <- paste0(code,
                     "\t\t\tY.matrix[j, i] ~ dnorm(m[j, i], prec_resid)\n")
    }
    # when correlation, Y.matrix will be the same across different # of treatment
    # will be defined differently j = 1 and j > 1 because index cannot be 0

    code <- paste0(code,
                   "\t\t\tm[j, i] <- mu[j, i]")
    if (nof1$corr.y) {
      code <- paste0(code,
                     " + e[j, i]")
    }
    code <- paste0(code,
                   "\n")

    if (nof1$model.intcpt == "fixed") {
      code <- paste0(code,
                     "\t\t\tmu[j, i] <- alpha[i]")
    }
    # else if (nof1$model.intcpt == "random") {
    #   code <- paste0(code,
    #                  "\t\t\tmu[j, i] <- beta_1[i] * Treat.1[j, i]")
    # }

    # adjust for trend by basis splines
    if (nof1$spline.trend) {
      for (l in 1:nof1$spline.df){
        code <- paste0(code, " + eta[", l, "] * spline.matrix[time.matrix[j, i], ", l,"]")
      }
    }

    # adjust for trend by step functions
    if (nof1$step.trend) {
      for (l in 1:nof1$step.df){
        code <- paste0(code, " + eta[", l, "] * step.matrix[period.matrix[j, i], ", l,"]")
      }
    }

    # adjust for level 2 covariates
    # only random intercept because the coefficients for fixed intercept when one treatment being 0 anyway
    if (!is.null(nof1$cov.matrix)) {
      if (nof1$model.intcpt == "random") {

        for (cov.i in 1:nrow(nof1$cov.matrix)) {
          code <- paste0(code,
                         " + eta_cov_i[i, 1, ", cov.i, "] * cov.matrix[", cov.i, ", i] * Treat.1[j, i]")
        }

      } # if (nof1$model.intcpt == "random") {
    } # if (!is.null(nof1$cov.matrix)) {
    code <- paste0(code, "\n")

    code <- paste0(code,
                   "\t\t}\n") # for (j in 1:nobs.ID[i])

    code <- paste0(code,
                   "\t}\n\n") # for (i in cumsum:cumsum)
  } # if (nof1$summ.nID.perTreat$n_ID_perNTreat[1] != 0) {

  # when there is only 1 treatment on all participant, do not append code
  if (nrow(nof1$summ.nID.perTreat) >= 2) {

    # summ.nID.perTreat always have 1:maximum number of treatments per participant
    for (n.Treat.ID.i in 2:nrow(nof1$summ.nID.perTreat)) {

      # only append code when there are participants has this number of treatments
      if (nof1$summ.nID.perTreat$n_ID_perNTreat[n.Treat.ID.i] != 0) {

        code <- paste0(code,
                       "\tfor (i in ", cumsum(nof1$summ.nID.perTreat$n_ID_perNTreat)[n.Treat.ID.i-1]+1, ":", cumsum(nof1$summ.nID.perTreat$n_ID_perNTreat)[n.Treat.ID.i], ") {\n")

        # random effects
        if (nof1$model.intcpt == "fixed") {
          for (Treat.i in 2:n.Treat.ID.i) {
            code <- paste0(code,
                           "\t\tbeta_", Treat.i, "[i] ~ dnorm(d[uniq.Treat.matrix[", Treat.i, ", i]] - d[uniq.Treat.matrix[1, i]], prec_beta)\n")
          }
        } else if (nof1$model.intcpt == "random") {
          code <- paste0(code,
                         "\t\tbeta[i, 1:", n.Treat.ID.i,
                         "] ~ dmnorm.vcov(b[uniq.Treat.matrix[1:", n.Treat.ID.i, ", i]], Sigma_beta[uniq.Treat.matrix[1:", n.Treat.ID.i, ", i], uniq.Treat.matrix[1:", n.Treat.ID.i, ", i]])\n")
          for (Treat.i in 1:n.Treat.ID.i) {
            code <- paste0(code,
                           "\t\tbeta_", Treat.i, "[i] <- beta[i, ", Treat.i, "]\n")
          }
        }

        # assign the actual eta cov
        if (!is.null(nof1$cov.matrix)) {

          if (nof1$model.intcpt == "fixed") {
            for (Treat.i in 2:n.Treat.ID.i) {
              for (cov.i in 1:nrow(nof1$cov.matrix)) {
                code <- paste0(code,
                               "\t\teta_cov_i[i, ", Treat.i, ", ", cov.i, "] <- eta_cov[uniq.Treat.matrix[", Treat.i, ", i], ", cov.i, "] - eta_cov[uniq.Treat.matrix[1, i], ", cov.i, "]\n")
              }
            }
          } else if (nof1$model.intcpt == "random") {
            for (Treat.i in 1:n.Treat.ID.i) {
              for (cov.i in 1:nrow(nof1$cov.matrix)) {
                code <- paste0(code,
                               "\t\teta_cov_i[i, ", Treat.i, ", ", cov.i, "] <- eta_cov[uniq.Treat.matrix[", Treat.i, ", i], ", cov.i, "]\n")
              }
            }
          } # else if (nof1$model.intcpt == "random") {

        } # assign the actual eta cov

        # First level model
        code <- paste0(code,
                       "\t\tfor (j in 1:nobs.ID[i]) {\n")
        if (!nof1$corr.y) {
          code <- paste0(code,
                         "\t\t\tY.matrix[j, i] ~ dnorm(m[j, i], prec_resid)\n")
        }
        # when correlation, Y.matrix will be the same across different # of treatment
        # will be defined differently j = 1 and j > 1 because index cannot be 0

        code <- paste0(code,
                       "\t\t\tm[j, i] <- mu[j, i]")
        # correlation
        if (nof1$corr.y) {
          code <- paste0(code,
                         " + e[j, i]")
        }
        code <- paste0(code,
                       "\n")

        if (nof1$model.intcpt == "fixed") {
          code <- paste0(code,
                         "\t\t\tmu[j, i] <- alpha[i]")
        } else if (nof1$model.intcpt == "random") {
          code <- paste0(code,
                         "\t\t\tmu[j, i] <- beta_1[i] * Treat.1[j, i]")
        }
        for (Treat.i in 2:n.Treat.ID.i){
          code <- paste0(code,
                         " + beta_", Treat.i, "[i] * Treat.", Treat.i, "[j, i]")
        }

        # adjust for trend by basis splines
        if (nof1$spline.trend) {
          for (l in 1:nof1$spline.df){
            code <- paste0(code, " + eta[", l, "] * spline.matrix[time.matrix[j, i], ", l,"]")
          }
        }

        # adjust for trend by step functions
        if (nof1$step.trend) {
          for (l in 1:nof1$step.df){
            code <- paste0(code, " + eta[", l, "] * step.matrix[period.matrix[j, i], ", l,"]")
          }
        }

        # adjust for stratification covariates
        # fixed stratification covariates
        if (!is.null(nof1$fixed.strata.cov.matrix)) {

          for (cov.i in 1:nof1$n.fixed.cov.model) {
            code <- paste0(code,
                           " + eta_fixed_strata_cov[", cov.i, "] * fixed.strata.cov.matrix[", cov.i, ", i]")
          }
        }

        # random stratification covariates
        if (!is.null(nof1$random.strata.cov.matrix)) {
          for (cov.i in 1:nof1$n.random.cov.model) {
            code <- paste0(code,
                           " + eta_random_strata_cov_lvls[random.strata.cov.matrix[", cov.i, ", i], ", cov.i, "]")
          }
        }

        # adjust for level 2 covariates
        if (!is.null(nof1$cov.matrix)) {

          # random intercept also first intercept
          if (nof1$model.intcpt == "random") {
            for (cov.i in 1:nrow(nof1$cov.matrix)) {
              code <- paste0(code,
                             " + eta_cov_i[i, 1, ", cov.i, "] * cov.matrix[", cov.i, ", i] * Treat.1[j, i]")
            }
          }

          # fixed intercept do not need to do interaction with first treatment
          for (Treat.i in 2:n.Treat.ID.i) {
            for (cov.i in 1:nrow(nof1$cov.matrix)) {
              code <- paste0(code,
                             " + eta_cov_i[i, ", Treat.i, ", ", cov.i, "] * cov.matrix[", cov.i, ", i] * Treat.", Treat.i, "[j, i]")
            }
          }
          # eta_cov be a matrix of coefficients for the interaction between treatment and covariates
        } # if (!is.null(nof1$cov.matrix)) {
        code <- paste0(code, "\n")

        code <- paste0(code,
                       "\t\t}\n") # for (j in 1:nobs.ID[i])
        code <- paste0(code,
                       "\t}\n\n") # for (i in cumsum:cumsum)

      } # if (nof1$summ.nID.perTreat$n_ID_perNTreat[n.Treat.ID.i] != 0) {
    } # for (n.Treat.ID.i in 2:nrow(nof1$summ.nID.perTreat)) {
  }

  # e[j, i], resid[j, i] for correlation
  # take care of outcome measurements on non-consecutive days
  if (nof1$corr.y) {
    code <- paste0(code,
                   "\tfor (i in 1:", sum(nof1$summ.nID.perTreat$n_ID_perNTreat),"){\n")
    code <- paste0(code,
                   "\t\te[1, i] <- 0\n")
    code <- paste0(code,
                   "\t\tY.matrix[1, i] ~ dnorm(m[1, i], (1 - rho_resid^2) * prec_resid)\n")
    code <- paste0(code,
                   "\t\tfor (j in 2:nobs.ID[i]) {\n")
    code <- paste0(code,
                   "\t\t\te[j, i] <- rho_resid^(time.matrix[j, i] - time.matrix[j-1, i]) * (Y.matrix[j-1, i] - mu[j-1, i])\n")
    code <- paste0(code,
                   "\t\t\tY.matrix[j, i] ~ dnorm(m[j, i], prec_resid * (1 - rho_resid^2) / (1 - (rho_resid^2)^(time.matrix[j, i] - time.matrix[j-1, i])))\n")
    code <- paste0(code,
                   "\t\t}\n") # j loop
    code <- paste0(code,
                   "\t}\n\n") # i loop
  }

  # random stratification covariates
  if (!is.null(nof1$random.strata.cov.matrix)) {

    if (nof1$n.random.cov.model > 1) {
      # NEED TO CONSIDER CORRELATION AMONG RANDOM EFFECTS
      stop("NEED TO DEVELOP CODE FOR MORE THAN ONE RANDOM STRATIFICATION COVARIATES!")

    } else {
      code <- paste0(code,
                     "\tfor (i in 1:", max(nof1$random.strata.cov.matrix[1, ]), ") {\n")
      code <- paste0(code,
                     "\t\teta_random_strata_cov_lvls[i, 1] ~ dnorm(eta_random_strata_cov[1], prec_eta_random_strata_cov)\n")
      code <- paste0(code,
                     "\t}\n\n")

    }
  }

  # Priors
  if (nof1$model.intcpt == "fixed") {
    # alpha prior
    code <- paste0(code,
                   "\tfor (i in 1:", sum(nof1$summ.nID.perTreat$n_ID_perNTreat), ") {\n")
    code <- paste0(code,
                   "\t\talpha[i] ~ ", nof1$alpha.prior[[1]], "(", nof1$alpha.prior[[2]], ", ", nof1$alpha.prior[[3]], ")")
    # Truncated normal distribution for beta's
    if (length(nof1$alpha.prior) > 3) {

      if (!is.na(nof1$alpha.prior[[4]])) {
        code <- paste0(code,
                       " T(", nof1$alpha.prior[[4]], ", ")
      } else {
        code <- paste0(code,
                       " T(, ")
      }

      if(!is.na(nof1$alpha.prior[[5]])) {
        code <- paste0(code,
                       nof1$alpha.prior[[5]], ")")
      } else {
        code <- paste0(code,
                       ")")
      }
    } # if (length(nof1$alpha.prior) > 3) {
    code <- paste0(code, "\n")
    code <- paste0(code, "\t}\n\n") # for (i in 1:", n.ID, ") {"

    # prior for d
    code <- paste0(code,
                   "\td[1] <- 0\n")
    code <- paste0(code,
                   "\tfor (i in 2:", length(nof1$Treat.name), ") {\n")
    code <- paste0(code,
                   "\t\td[i] ~ ", nof1$beta.prior[[1]], "(", nof1$beta.prior[[2]], ", ", nof1$beta.prior[[3]], ")\n")
    code <- paste0(code, "\t}\n\n") # for (i in 1:", n.Treat, ") {"

  } else if (nof1$model.intcpt == "random") {
    # prior for b
    code <- paste0(code,
                   "\tfor (i in 1:", length(nof1$Treat.name), ") {\n")
    code <- paste0(code,
                   "\t\tb[i] ~ ", nof1$beta.prior[[1]], "(", nof1$beta.prior[[2]], ", ", nof1$beta.prior[[3]], ")\n")
    code <- paste0(code, "\t}\n\n") # for (i in 1:", n.Treat, ") {"

    # prior for Sigma_beta_...
    code <- paste0(code,
                   "\tsigmaSq_beta <- pow(prec_beta, -1)\n")
    code <- paste0(code,
                   "\trho ~ ", nof1$rho.prior[[1]], "(", nof1$rho.prior[[2]], ", ", nof1$rho.prior[[3]], ")\n")

    # row 1
    code <- paste0(code,
                   "\tSigma_beta[1, 1] <- sigmaSq_beta\n")
    code <- paste0(code,
                   "\tfor (k in 2:", length(nof1$Treat.name), ") {\n")
    code <- paste0(code,
                   "\t\tSigma_beta[1, k] <- rho * sigmaSq_beta\n")
    code <- paste0(code,
                   "\t}\n") # for (k in 2:n.Treat) {

    # row 2:(n.Treat-1), only if number of treatments greater than 2
    if (length(nof1$Treat.name) > 2) {

      code <- paste0(code,
                     "\tfor (k in 2:", length(nof1$Treat.name) - 1, ") {\n")
      code <- paste0(code,
                     "\t\tSigma_beta[k, k] <- sigmaSq_beta\n")
      code <- paste0(code,
                     "\t\tfor (l in 1:(k-1)) {\n")
      code <- paste0(code,
                     "\t\t\tSigma_beta[k, l] <- rho * sigmaSq_beta\n")
      code <- paste0(code,
                     "\t\t}\n") # for (l in 1:(k-1)) {
      code <- paste0(code,
                     "\t\tfor (l in (k+1):", length(nof1$Treat.name), ") {\n")
      code <- paste0(code,
                     "\t\t\tSigma_beta[k, l] <- rho * sigmaSq_beta\n")
      code <- paste0(code,
                     "\t\t}\n") # for (l in (k+1):n.Treat) {
      code <- paste0(code,
                     "\t}\n") # for (k in 2:(n.Treat - 1)) {
    }
    # row n.Treat
    code <- paste0(code,
                   "\tSigma_beta[", length(nof1$Treat.name), ", ", length(nof1$Treat.name), "] <- sigmaSq_beta\n")
    code <- paste0(code,
                   "\tfor (k in 1:", length(nof1$Treat.name) - 1, ") {\n")
    code <- paste0(code,
                   "\t\tSigma_beta[", length(nof1$Treat.name), ", k] <- rho * sigmaSq_beta\n")
    code <- paste0(code,
                   "\t}\n") # for (k in 1:(n.Treat - 1)) {

  } # else if (nof1$model.intcpt == "random") {

  # prior for prec_beta
  code <- paste0(code,
                 "\tprec_beta <- pow(sd_beta, -2)\n")
  code <- paste0(code,
                 "\tsd_beta ~ ", nof1$hy.prior[[1]], "(", nof1$hy.prior[[2]], ", ", nof1$hy.prior[[3]], ")\n\n")

  # prior for residual error
  code <- paste0(code,
                 "\tprec_resid <- pow(sd_resid, -2)\n")
  code <- paste0(code,
                 "\tsd_resid ~ ", nof1$hy.prior[[1]], "(", nof1$hy.prior[[2]], ", ", nof1$hy.prior[[3]], ")\n")

  # prior for serial correlation
  if (nof1$corr.y) {
    code <- paste0(code,
                   "\trho_resid ~ ", nof1$rho.prior[[1]], "(", nof1$rho.prior[[2]], ", ", nof1$rho.prior[[3]], ")\n")
  }
  code <- paste0(code,
                 "\n")

  # prior for trend coefficients - splines
  if (nof1$spline.trend) {
    code <- paste0(code,
                   "\tfor (l in 1:", nof1$spline.df, ") {\n")
    code <- paste0(code, "\t\teta[l] ~ ", nof1$eta.prior[[1]], "(", nof1$eta.prior[[2]], ", ", nof1$eta.prior[[3]], ")\n")
    code <- paste0(code,
                   "\t}\n\n")
  }

  # prior for trend coefficients - steps
  if (nof1$step.trend) {
    code <- paste0(code,
                   "\tfor (l in 1:", nof1$step.df, ") {\n")
    code <- paste0(code, "\t\teta[l] ~ ", nof1$eta.prior[[1]], "(", nof1$eta.prior[[2]], ", ", nof1$eta.prior[[3]], ")\n")
    code <- paste0(code,
                   "\t}\n\n")
  }

  # prior for coefficients for stratification covariates
  # fixed stratification covariates
  if (!is.null(nof1$fixed.strata.cov.matrix)) {
    code <- paste0(code,
                   "\tfor (i in 1:", nof1$n.fixed.cov.model,") {\n")
    code <- paste0(code,
                   "\t\teta_fixed_strata_cov[i] ~ ", nof1$eta.prior[[1]], "(", nof1$eta.prior[[2]], ", ", nof1$eta.prior[[3]], ")\n")
    code <- paste0(code,
                   "\t}\n\n")

  }

  # random stratification covariates
  if (!is.null(nof1$random.strata.cov.matrix)) {
    code <- paste0(code,
                   "\tfor (i in 1:", nof1$n.random.cov.model,") {\n")
    code <- paste0(code,
                   "\t\teta_random_strata_cov[i] ~ ", nof1$eta.prior[[1]], "(", nof1$eta.prior[[2]], ", ", nof1$eta.prior[[3]], ")\n")
    code <- paste0(code,
                   "\t}\n")

    # prior for prec_eta_random_strata_cov
    code <- paste0(code,
                   "\tprec_eta_random_strata_cov <- pow(sd_eta_random_strata_cov, -2)\n")
    code <- paste0(code,
                   "\tsd_eta_random_strata_cov ~ ", nof1$hy.prior[[1]], "(", nof1$hy.prior[[2]], ", ", nof1$hy.prior[[3]], ")\n\n")

  }

  # prior for coefficients for level 2 covariates
  if (!is.null(nof1$cov.matrix)) {

    code <- paste0(code,
                   "\tfor (j in 1:", nrow(nof1$cov.matrix), ") {\n")

    if (nof1$model.intcpt == "fixed") {
      code <- paste0(code,
                     "\t\teta_cov[1, j] <- 0\n")
      code <- paste0(code,
                     "\t\tfor (i in 2:", length(nof1$Treat.name), ") {\n")
    } else if (nof1$model.intcpt == "random") {
      code <- paste0(code,
                     "\t\tfor (i in 1:", length(nof1$Treat.name), ") {\n")
    }

    code <- paste0(code, "\t\t\teta_cov[i, j] ~ ", nof1$eta.prior[[1]], "(", nof1$eta.prior[[2]], ", ", nof1$eta.prior[[3]], ")\n")
    code <- paste0(code,
                   "\t\t}\n")
    code <- paste0(code,
                   "\t}\n\n")
  }

  code <- paste0(code,
                 "}") # model {

  # cat(code)
  return(code)
}


nof1.nma.poisson.rjags <- function(nof1) {

  code <- paste0("model{\n")

  if (nof1$summ.nID.perTreat$n_ID_perNTreat[1] != 0) {
    code <- paste0(code,
                   "\tfor (i in 1:", nof1$summ.nID.perTreat$n_ID_perNTreat[1], ") {\n")
    # First level model
    code <- paste0(code,
                   "\t\tfor (j in 1:nobs.ID[i]) {\n")
    code <- paste0(code,
                   "\t\t\tY.matrix[j, i] ~ dpois(lambda[j, i])\n")
    if (nof1$model.intcpt == "fixed") {
      code <- paste0(code,
                     "\t\t\tlog(lambda[j, i]) <- alpha[i]")
    }

    # adjust for trend by basis splines
    if (nof1$spline.trend) {
      for (l in 1:nof1$spline.df){
        code <- paste0(code, " + eta[", l, "] * spline.matrix[time.matrix[j, i], ", l,"]")
      }
    }
    code <- paste0(code, "\n")

    code <- paste0(code,
                   "\t\t}\n") # for (j in 1:nobs.ID[i])

    code <- paste0(code,
                   "\t}\n\n") # for (i in cumsum:cumsum)
  } # if (nof1$summ.nID.perTreat$n_ID_perNTreat[1] != 0) {

  # when there is only 1 treatment on all participant, do not append code
  if (nrow(nof1$summ.nID.perTreat) >= 2) {

    for (n.Treat.ID.i in 2:nrow(nof1$summ.nID.perTreat)) {

      # only append code when there are participants has this number of treatments
      if (nof1$summ.nID.perTreat$n_ID_perNTreat[n.Treat.ID.i] != 0) {

        code <- paste0(code,
                       "\tfor (i in ", cumsum(nof1$summ.nID.perTreat$n_ID_perNTreat)[n.Treat.ID.i-1]+1, ":", cumsum(nof1$summ.nID.perTreat$n_ID_perNTreat)[n.Treat.ID.i], ") {\n")

        # random effects
        for (Treat.i in 2:n.Treat.ID.i) {
          code <- paste0(code,
                         "\t\tbeta_", Treat.i, "[i] ~ dnorm(d[uniq.Treat.matrix[", Treat.i, ", i]] - d[uniq.Treat.matrix[1, i]], prec_beta)\n")
        }

        # assign the actual eta cov
        if (!is.null(nof1$cov.matrix)) {

          if (nof1$model.intcpt == "fixed") {
            for (Treat.i in 2:n.Treat.ID.i) {
              for (cov.i in 1:nrow(nof1$cov.matrix)) {
                code <- paste0(code,
                               "\t\teta_cov_i[i, ", Treat.i, ", ", cov.i, "] <- eta_cov[uniq.Treat.matrix[", Treat.i, ", i], ", cov.i, "] - eta_cov[uniq.Treat.matrix[1, i], ", cov.i, "]\n")
              }
            }
          }
          # else if (nof1$model.intcpt == "random") {
          #   for (Treat.i in 1:n.Treat.ID.i) {
          #     for (cov.i in 1:nrow(nof1$cov.matrix)) {
          #       code <- paste0(code,
          #                      "\t\teta_cov_i[i, ", Treat.i, ", ", cov.i, "] <- eta_cov[uniq.Treat.matrix[", Treat.i, ", i], ", cov.i, "]\n")
          #     }
          #   }
          # } # else if (nof1$model.intcpt == "random") {

        } # if (!is.null(nof1$cov.matrix)) {

        # First level model
        code <- paste0(code,
                       "\t\tfor (j in 1:nobs.ID[i]) {\n")
        code <- paste0(code,
                       "\t\t\tY.matrix[j, i] ~ dpois(lambda[j, i])\n")

        if (nof1$model.intcpt == "fixed") {
          code <- paste0(code,
                         "\t\t\tlog(lambda[j, i]) <- alpha[i]")
        }
        for(Treat.i in 2:n.Treat.ID.i){
          code <- paste0(code,
                         " + beta_", Treat.i, "[i] * Treat.", Treat.i, "[j, i]")
        }

        # adjust for trend by basis splines
        if (nof1$spline.trend) {
          for (l in 1:nof1$spline.df){
            code <- paste0(code, " + eta[", l, "] * spline.matrix[time.matrix[j, i], ", l,"]")
          }
        }

        # adjust for level 2 covariates
        if (!is.null(nof1$cov.matrix)) {

          # # random intercept also first intercept
          # if (nof1$model.intcpt == "random") {
          #   for (cov.i in 1:nrow(nof1$cov.matrix)) {
          #     code <- paste0(code,
          #                    " + eta_cov_i[i, 1, ", cov.i, "] * cov.matrix[", cov.i, ", i] * Treat.1[j, i]")
          #   }
          # }

          # work for fixed intercept model only
          for (Treat.i in 2:n.Treat.ID.i) {
            for (cov.i in 1:nrow(nof1$cov.matrix)) {
              code <- paste0(code,
                             " + eta_cov_i[i, ", Treat.i, ", ", cov.i, "] * cov.matrix[", cov.i, ", i] * Treat.", Treat.i, "[j, i]")
            }
          }
          # eta_cov be a matrix of coefficients for the interaction between treatment and covariates
        } # if (!is.null(nof1$cov.matrix)) {
        code <- paste0(code, "\n")

        code <- paste0(code,
                       "\t\t}\n") # for (j in 1:nobs.ID[i])
        code <- paste0(code,
                       "\t}\n\n") # for (i in cumsum:cumsum)

      } # if (nof1$summ.nID.perTreat$n_ID_perNTreat[n.Treat.ID.i] != 0) {
    } # for (n.Treat.ID.i in 2:nrow(nof1$summ.nID.perTreat)) {
  }

  # Priors
  # alpha prior
  code <- paste0(code,
                 "\tfor (i in 1:", sum(nof1$summ.nID.perTreat$n_ID_perNTreat), ") {\n")
  code <- paste0(code,
                 "\t\talpha[i] ~ ", nof1$alpha.prior[[1]], "(", nof1$alpha.prior[[2]], ", ", nof1$alpha.prior[[3]], ")")
  # Truncated normal distribution for beta's
  if (length(nof1$alpha.prior) > 3) {

    if (!is.na(nof1$alpha.prior[[4]])) {
      code <- paste0(code,
                     " T(", nof1$alpha.prior[[4]], ", ")
    } else {
      code <- paste0(code,
                     " T(, ")
    }

    if(!is.na(nof1$alpha.prior[[5]])) {
      code <- paste0(code,
                     nof1$alpha.prior[[5]], ")")
    } else {
      code <- paste0(code,
                     ")")
    }
  } # if (length(nof1$alpha.prior) > 3) {
  code <- paste0(code, "\n")
  code <- paste0(code, "\t}\n\n") # for (i in 1:", n.ID, ") {"

  # prior for d
  code <- paste0(code,
                 "\td[1] <- 0\n")
  code <- paste0(code,
                 "\tfor (i in 2:", length(nof1$Treat.name), ") {\n")
  code <- paste0(code,
                 "\t\td[i] ~ ", nof1$beta.prior[[1]], "(", nof1$beta.prior[[2]], ", ", nof1$beta.prior[[3]], ")\n")
  code <- paste0(code, "\t}\n\n") # for (i in 1:", n.Treat, ") {"

  # prior for prec_beta
  code <- paste0(code,
                 "\tprec_beta <- pow(sd_beta, -2)\n")
  code <- paste0(code,
                 "\tsd_beta ~ ", nof1$hy.prior[[1]], "(", nof1$hy.prior[[2]], ", ", nof1$hy.prior[[3]], ")\n\n")

  # prior for trend coefficients - splines
  if (nof1$spline.trend) {
    code <- paste0(code,
                   "\tfor (l in 1:", nof1$spline.df, ") {\n")
    code <- paste0(code, "\t\teta[l] ~ ", nof1$eta.prior[[1]], "(", nof1$eta.prior[[2]], ", ", nof1$eta.prior[[3]], ")\n")
    code <- paste0(code,
                   "\t}\n\n")
  }

  # prior for coefficients for level 2 covariates
  if (!is.null(nof1$cov.matrix)) {

    code <- paste0(code,
                   "\tfor (j in 1:", nrow(nof1$cov.matrix), ") {\n")

    if (nof1$model.intcpt == "fixed") {
      code <- paste0(code,
                     "\t\teta_cov[1, j] <- 0\n")
      code <- paste0(code,
                     "\t\tfor (i in 2:", length(nof1$Treat.name), ") {\n")
    }
    # else if (nof1$model.intcpt == "random") {
    #   code <- paste0(code,
    #                  "\t\tfor (i in 1:", length(nof1$Treat.name), ") {\n")
    # }
    code <- paste0(code, "\t\t\teta_cov[i, j] ~ ", nof1$eta.prior[[1]], "(", nof1$eta.prior[[2]], ", ", nof1$eta.prior[[3]], ")\n")
    code <- paste0(code,
                   "\t\t}\n")
    code <- paste0(code,
                   "\t}\n\n")
  }

  code <- paste0(code,
                 "}") # model {

  # cat(code)
  return(code)
}

nof1.nma.binomial.rjags <- function(nof1) {

  code <- paste0("model{\n")

  if (nof1$summ.nID.perTreat$n_ID_perNTreat[1] != 0) {
    code <- paste0(code,
                   "\tfor (i in 1:", nof1$summ.nID.perTreat$n_ID_perNTreat[1], ") {\n")
    # First level model
    code <- paste0(code,
                   "\t\tfor (j in 1:nobs.ID[i]) {\n")

    code <- paste0(code,
                   "\t\t\tY.matrix[j, i] ~ dbern(p[j, i])\n")

    if (nof1$model.linkfunc == "log") {
      code <- paste0(code,
                     "\t\t\tp[j, i] <- exp(rlp[j, i])\n")
      code <- paste0(code,
                     "\t\t\trlp[j, i] <- min(0, lp[j, i])\n")

      if (nof1$model.intcpt == "fixed") {
        code <- paste0(code,
                       "\t\t\tlp[j, i] <- alpha[i]")
      }

    } else if (nof1$model.linkfunc == "logit") {

      if (nof1$model.intcpt == "fixed") {
        code <- paste0(code,
                       "\t\t\tlogit(p[j, i]) <- alpha[i]")
      }

    } # else if logit link

    # adjust for trend by basis splines
    if (nof1$spline.trend) {
      for (l in 1:nof1$spline.df){
        code <- paste0(code, " + eta[", l, "] * spline.matrix[time.matrix[j, i], ", l,"]")
      }
    }
    code <- paste0(code, "\n")

    code <- paste0(code,
                   "\t\t}\n") # for (j in 1:nobs.ID[i])

    code <- paste0(code,
                   "\t}\n\n") # for (i in cumsum:cumsum)

  }

  # when there is only 1 treatment on all participant, do not append code
  if (nrow(nof1$summ.nID.perTreat) >= 2) {

    for (n.Treat.ID.i in 2:nrow(nof1$summ.nID.perTreat)) {

      # only append code when there are participants has this number of treatments
      if (nof1$summ.nID.perTreat$n_ID_perNTreat[n.Treat.ID.i] != 0) {

        code <- paste0(code,
                       "\tfor (i in ", cumsum(nof1$summ.nID.perTreat$n_ID_perNTreat)[n.Treat.ID.i-1]+1, ":", cumsum(nof1$summ.nID.perTreat$n_ID_perNTreat)[n.Treat.ID.i], ") {\n")

        # random effects
        for (Treat.i in 2:n.Treat.ID.i) {
          ## need to fix here
          code <- paste0(code,
                         "\t\tbeta_", Treat.i, "[i] ~ dnorm(d[uniq.Treat.matrix[", Treat.i, ", i]] - d[uniq.Treat.matrix[1, i]], prec_beta)\n")
        }

        # assign the actual eta cov
        if (!is.null(nof1$cov.matrix)) {

          if (nof1$model.intcpt == "fixed") {
            for (Treat.i in 2:n.Treat.ID.i) {
              for (cov.i in 1:nrow(nof1$cov.matrix)) {
                code <- paste0(code,
                               "\t\teta_cov_i[i, ", Treat.i, ", ", cov.i, "] <- eta_cov[uniq.Treat.matrix[", Treat.i, ", i], ", cov.i, "] - eta_cov[uniq.Treat.matrix[1, i], ", cov.i, "]\n")
              }
            }
          }
          # else if (nof1$model.intcpt == "random") {
          #   for (Treat.i in 1:n.Treat.ID.i) {
          #     for (cov.i in 1:nrow(nof1$cov.matrix)) {
          #       code <- paste0(code,
          #                      "\t\teta_cov_i[i, ", Treat.i, ", ", cov.i, "] <- eta_cov[uniq.Treat.matrix[", Treat.i, ", i], ", cov.i, "]\n")
          #     }
          #   }
          # } # else if (nof1$model.intcpt == "random") {

        } # if (!is.null(nof1$cov.matrix)) {

        # First level model
        code <- paste0(code,
                       "\t\tfor (j in 1:nobs.ID[i]) {\n")

        code <- paste0(code,
                       "\t\t\tY.matrix[j, i] ~ dbern(p[j, i])\n")

        if (nof1$model.linkfunc == "log") {
          code <- paste0(code,
                         "\t\t\tp[j, i] <- exp(rlp[j, i])\n")
          code <- paste0(code,
                         "\t\t\trlp[j, i] <- min(0, lp[j, i])\n")

          if (nof1$model.intcpt == "fixed") {
            code <- paste0(code,
                           "\t\t\tlp[j, i] <- alpha[i]")
          }

        } else if (nof1$model.linkfunc == "logit") {

          if (nof1$model.intcpt == "fixed") {
            code <- paste0(code,
                           "\t\t\tlogit(p[j, i]) <- alpha[i]")
          }

        } # else if logit link

        for(Treat.i in 2:n.Treat.ID.i){
          code <- paste0(code,
                         " + beta_", Treat.i, "[i] * Treat.", Treat.i, "[j, i]")
        }

        # adjust for trend by basis splines
        if (nof1$spline.trend) {
          for (l in 1:nof1$spline.df){
            code <- paste0(code, " + eta[", l, "] * spline.matrix[time.matrix[j, i], ", l,"]")
          }
        }

        # adjust for level 2 covariates
        if (!is.null(nof1$cov.matrix)) {

          # # random intercept also first intercept
          # if (nof1$model.intcpt == "random") {
          #   for (cov.i in 1:nrow(nof1$cov.matrix)) {
          #     code <- paste0(code,
          #                    " + eta_cov_i[i, 1, ", cov.i, "] * cov.matrix[", cov.i, ", i] * Treat.1[j, i]")
          #   }
          # }

          # work for fixed intercept model only
          for (Treat.i in 2:n.Treat.ID.i) {
            for (cov.i in 1:nrow(nof1$cov.matrix)) {
              code <- paste0(code,
                             " + eta_cov_i[i, ", Treat.i, ", ", cov.i, "] * cov.matrix[", cov.i, ", i] * Treat.", Treat.i, "[j, i]")
            }
          }
          # eta_cov be a matrix of coefficients for the interaction between treatment and covariates
        } # if (!is.null(nof1$cov.matrix)) {
        code <- paste0(code, "\n")

        code <- paste0(code,
                       "\t\t}\n") # for (j in 1:nobs.ID[i])
        code <- paste0(code,
                       "\t}\n\n") # for (i in cumsum:cumsum)

      } # if (nof1$summ.nID.perTreat$n_ID_perNTreat[n.Treat.ID.i] != 0) {
    } # for (n.Treat.ID.i in 2:nrow(nof1$summ.nID.perTreat)) {
  } # if (nrow(nof1$summ.nID.perTreat) >= 2) {

  # Priors
  # alpha prior
  code <- paste0(code,
                 "\tfor (i in 1:", sum(nof1$summ.nID.perTreat$n_ID_perNTreat), ") {\n")
  code <- paste0(code,
                 "\t\talpha[i] ~ ", nof1$alpha.prior[[1]], "(", nof1$alpha.prior[[2]], ", ", nof1$alpha.prior[[3]], ")")
  # Truncated normal distribution for beta's
  if (length(nof1$alpha.prior) > 3) {

    if (!is.na(nof1$alpha.prior[[4]])) {
      code <- paste0(code,
                     " T(", nof1$alpha.prior[[4]], ", ")
    } else {
      code <- paste0(code,
                     " T(, ")
    }

    if(!is.na(nof1$alpha.prior[[5]])) {
      code <- paste0(code,
                     nof1$alpha.prior[[5]], ")")
    } else {
      code <- paste0(code,
                     ")")
    }
  } # if (length(nof1$alpha.prior) > 3) {
  code <- paste0(code, "\n")
  code <- paste0(code, "\t}\n\n") # for (i in 1:", n.ID, ") {"

  # prior for d
  code <- paste0(code,
                 "\td[1] <- 0\n")
  code <- paste0(code,
                 "\tfor (i in 2:", length(nof1$Treat.name), ") {\n")
  code <- paste0(code,
                 "\t\td[i] ~ ", nof1$beta.prior[[1]], "(", nof1$beta.prior[[2]], ", ", nof1$beta.prior[[3]], ")\n")
  code <- paste0(code, "\t}\n\n") # for (i in 1:", n.Treat, ") {"

  # prior for prec_beta
  code <- paste0(code,
                 "\tprec_beta <- pow(sd_beta, -2)\n")
  code <- paste0(code,
                 "\tsd_beta ~ ", nof1$hy.prior[[1]], "(", nof1$hy.prior[[2]], ", ", nof1$hy.prior[[3]], ")\n\n")

  # prior for trend coefficients - splines
  if (nof1$spline.trend) {
    code <- paste0(code,
                   "\tfor (l in 1:", nof1$spline.df, ") {\n")
    code <- paste0(code, "\t\teta[l] ~ ", nof1$eta.prior[[1]], "(", nof1$eta.prior[[2]], ", ", nof1$eta.prior[[3]], ")\n")
    code <- paste0(code,
                   "\t}\n\n")
  }

  # prior for coefficients for level 2 covariates
  if (!is.null(nof1$cov.matrix)) {

    code <- paste0(code,
                   "\tfor (j in 1:", nrow(nof1$cov.matrix), ") {\n")

    if (nof1$model.intcpt == "fixed") {
      code <- paste0(code,
                     "\t\teta_cov[1, j] <- 0\n")
      code <- paste0(code,
                     "\t\tfor (i in 2:", length(nof1$Treat.name), ") {\n")
    }
    # else if (nof1$model.intcpt == "random") {
    #   code <- paste0(code,
    #                  "\t\tfor (i in 1:", length(nof1$Treat.name), ") {\n")
    # }

    code <- paste0(code, "\t\t\teta_cov[i, j] ~ ", nof1$eta.prior[[1]], "(", nof1$eta.prior[[2]], ", ", nof1$eta.prior[[3]], ")\n")
    code <- paste0(code,
                   "\t\t}\n")
    code <- paste0(code,
                   "\t}\n\n")
  }

  code <- paste0(code,
                 "}") # model {

  # cat(code)
  return(code)
}
jiabei-yang/nof1ins documentation built on Sept. 7, 2021, 1:10 p.m.