model {
    for (i in 1:Ncell) {
      y[i] ~ dpois(lambda[i])
      lambda[i] <- exp(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
    }

    a0 ~ dnorm(yLogMean, 1 / (yLogSD * 2) ^ 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]
        }
      }
    }
    
    # Compute predicted count and proportions:
    for (o in 1:q.levels[1]) {
      for (p in 1:q.levels[2]) {
        for (r in 1:q.levels[3]) {
          o1o2o3[o , p , r] <- exp(m1m2m3[o , p , r])
          o1o2o3p[o , p , r] <- ( o1o2o3[o , p , r] / sum(o1o2o3[1:q.levels[1] , 1:q.levels[2] , 1:q.levels[3]]) ) * 100
        }
      }
    }
        
    #Compute expected count 
    for (r in 1:q.levels[1]) {
      for (s in 1:q.levels[2]) {
        for (t in 1:q.levels[3]) {
          e1e2e3[r , s , t] <- ( sum( o1o2o3[ r , 1:q.levels[2] , t ] ) *  sum ( o1o2o3[ 1:q.levels[1] , s , t ] ) ) / sum( o1o2o3[ 1:q.levels[1] , 1:q.levels[2] , t ] )
          e1e2e3p[r , s , t] <- ( e1e2e3[r , s , t] / sum( o1o2o3[ 1:q.levels[1] , 1:q.levels[2] ,  1:q.levels[3] ] ) ) * 100
        }
      }
    }
    
} 