model {
    for (i in 1:n) {
      y[i] ~ dnorm(mu[i], 1 / (s1s2s3[ x[ i,1] , x[i,2] , x[i,3] ]) ^ 2)
      mu[i] <- a0 + a1[x[i,1]] + a2[ x[i,2] ] + a3[x[i,3]] # Main effects
                  + a1a2[ x[i,1] , x[i,2] ] + a1a3[ x[i,1] , x[i,3] ] + a2a3[ x[i,2] , x[i,3] ] # Two-way effects
                  + a1a2a3[ x[ i,1] , x[i,2] , x[i,3] ] # Three-way effects
    }

    # Priors on sigma         
    for (j in 1:q.levels[1]) {
      for (k in 1:q.levels[2]) {
        for (l in 1:q.levels[3]) {
          sigma.frac[j,k,l] ~ dnorm(0.0, 1 / a1a2a3SD ^ 2)
          s1s2s3[j,k,l] <- max(sigma.frac[j,k,l], medianCellSD / 1000) # <- Prevent zero sigma.
        }
      }
    }     

    # Baseline
    a0 ~ dnorm(yMean, 1 / (ySD * 5) ^ 2)

    # Main effect (1)    
    for (k in 1:q.levels[1]) {
      a1[k] ~ dnorm(0.0, 1 / a1SD ^ 2)
    }
    a1SD ~ dgamma(aGammaShRa[1], aGammaShRa[2])

    # Main effect (2)    
    for (k in 1:q.levels[2]) {
      a2[k] ~ dnorm(0.0, 1 / a2SD ^ 2)
    }
    a2SD ~ dgamma(aGammaShRa[1], aGammaShRa[2])

    # Main effect (3)
    for (k in 1:q.levels[3]) {
      a3[k] ~ dnorm(0.0, 1 / a3SD ^ 2)
    }
    a3SD ~ dgamma(aGammaShRa[1], aGammaShRa[2])

    # Two-way effect (1x2)
    for (k in 1:q.levels[1]) {
      for (l in 1:q.levels[2]) {
        a1a2[k,l] ~ dnorm(0.0, 1 / a1a2SD ^ 2)
      }
    }
    a1a2SD ~ dgamma(aGammaShRa[1], aGammaShRa[2])

    # Two-way effect (1x3)
    for (k in 1:q.levels[1]) {
      for (l in 1:q.levels[3]) {
        a1a3[k,l] ~ dnorm(0.0, 1 / a1a3SD ^ 2)
      }
    }
    a1a3SD ~ dgamma(aGammaShRa[1], aGammaShRa[2])

    # Three-way effect (2x3)
    for (k in 1:q.levels[2]) {
      for (l in 1:q.levels[3]) {
        a2a3[k,l] ~ dnorm(0.0, 1 / a2a3SD ^ 2)
      }
    }
    a2a3SD ~ dgamma(aGammaShRa[1], aGammaShRa[2])

    # Three-way effect (1x2x3)
    for (k in 1:q.levels[1]) {
      for (l in 1:q.levels[2]) {
        for (m in 1:q.levels[3]) {
          a1a2a3[k,l,m] ~ dnorm(0.0, 1 / a1a2a3SD ^ 2)
        }
      }
    }
    a1a2a3SD ~ dgamma(aGammaShRa[1], aGammaShRa[2])

    # Means
    for (l in 1:q.levels[1]) {
      for (m in 1:q.levels[2]) {
        for (n in 1:q.levels[3]) {
          m1m2m3[l,m,n] <- a0 + a1[l] + a2[m] + a3[n] 
          + a1a2[l,m] + a1a3[l,n]  + a2a3[m,n] 
          + a1a2a3[l,m,n]
        }
      }
    }

    sigmaSh <- 1 + sigmaMode * sigmaRa
    sigmaRa <- (sigmaMode + sqrt(sigmaMode ^ 2 + 4 * sigmaSD ^ 2)) / (2 * sigmaSD ^ 2)
    sigmaMode ~ dgamma(sGammaShRa[1], sGammaShRa[2])
    sigmaSD ~ dgamma(sGammaShRa[1], sGammaShRa[2])
}