Nothing
      ################################################################################
###
### TITLE:              pop_reconstruction_functions.R
###
### AUTHOR:             Mark Wheldon
###
### DESC:               Functions to do population reconstruction developed for
###                     "Reconstructing Past Populations with Uncertainty from
###                     Fragmentary Data" submitted to Journal of the American
###                     Statistical Assocation".
###
###-----------------------------------------------------------------------------
################################################################################
### ------------------------ CCMPP FUNCTION- ---------------------- ###
### --------------------------------------------------------------- ###
popRecon.ccmp.female <-
    function(pop, surv, fert, srb = 1.05, mig
             ,proj.steps, age.int = 5
             ,label.dims = FALSE, base.year = "1960"
             )
    #-- Based on Preston et al. (2001), Ch. 6 --#
    #
    #   pop     :  population count at baseline
    #   fert    :  matrix of age specific fertility rates NOT yet
    #                mulitplied by age.int
    #   srb     :  sex ratio at birth matrix
    #   surv    :  Survivorship probabilities: the probability of
    #                reaching the age at the start of the interval.
    #              The first row should be nL0/(n*l0).
    #              The last row is survival for age.int years in the open
    #                interval
    #   mig     :  Net number of migrants as a
    #                 _proportion_ of prev time period's population
    #   proj.steps
    #           :  number of time periods to project forward
    #                if missing, set to ncol(fert)
    #   age.int :  needed for correct interpretation of survival
    #                and fertility rates
    #   label.dims
    #           :  should output have dimnames set?
    #   base.year
    #           :  start year for projections (aesthetic)
{
    #-- Checks --#
    # If proj.steps is greater than the number of columns in surv,
    #   reduce or recycle fert, surv matrices
    #-- Constants --#
    n.age.grps <- length(pop)
    n.surv <- nrow(surv)
    #-- Derive proj.steps from ncol(fert) --#
    if(missing(proj.steps)) proj.steps <- ncol(fert)
    #-- Make SRB into matrix if not already --#
    if(is.null(dim(srb))) srb <- matrix(rep(srb, proj.steps))
    #-- Loop over number of required time periods --#
    #...............................................#
    #-- Initialise pop.matrix --#
    pop.mat <- matrix(0, nrow = n.age.grps, ncol = 1 + proj.steps)
    pop.mat[,1] <- pop
    #-- Initialize leslie matrix --#
    lesM <- matrix(0, nrow = n.age.grps, ncol = n.age.grps)
    #-- Project --#
    #.............#
    for(i in 1:proj.steps)
    {
        #-- Make the leslie matrix --#
        #............................#
        #-- Rows 2:(n.age.grps) = survival ratios --#
        lesM[2:n.age.grps,1:(n.age.grps-1)] <-
            diag(surv[-c(1,n.surv),i])
        lesM[n.age.grps,n.age.grps] <- surv[(n.surv),i]
        #-- First row = fert and survival ratios --#
        k <- 1/(1+srb[i]) * surv[1,i] * 0.5
        dbl.fert <- age.int*fert[,i] + c(age.int*fert[-1,i], 0) *
            surv[-1,i]
        lesM[1,] <- k * dbl.fert
        #-- Migrants --#
       net.numb.mig <- mig[,i] * pop.mat[,i]
        #-- Project --#
        #.............#
        pop.mat[,i+1] <-
            lesM %*% (pop.mat[,i] + 0.5 * net.numb.mig) +
                0.5 * net.numb.mig
    }
    #-- Add dim names --#
    #...................#
    if(label.dims) {
        ages <- seq(from = 0
                    ,to = age.int*(nrow(as.matrix(pop))-1)
                    ,by = age.int)
        yrs <- (0:proj.steps) * age.int + as.numeric(base.year)
        dimnames(pop.mat) <- list(ages, yrs)
    }
    #-- Output --#
    #............#
    return(pop.mat)
}
### -------------------- SUMMARIZATION FUNCTIONS------------------- ###
### --------------------------------------------------------------- ###
life.expectancy.stationary <- function(z)
{
    x <- c(head(z, -1), tail(z,1) / (1-tail(z,1)))
    5 * sum(cumprod(x))
}
make.leslie.matrix <-
    function(pop, surv, fert, srb = 1.05, age.int = 5, label.dims = FALSE)
    ##-- Make the leslie matrix for CCMPP --##
    ##
    ##   pop     :  population count at baseline
    ##   fert    :  matrix of age specific fertility rates NOT yet
    ##                mulitplied by age.int
    ##   srb     :  sex ratio at birth matrix
    ##   surv    :  Survivorship probabilities: the probability of
    ##                reaching the age at the start of the interval.
    ##              The first row should be nL0/(n*l0).
    ##              The last row is survival for age.int years in the open
    ##                interval
    ##   proj.steps
    ##   age.int :  needed for correct interpretation of survival
    ##                and fertility rates
    ##   label.dims
    ##           :  should output have dimnames set?
{
    ## Constants
    n.age.grps <- length(pop)
    n.surv <- length(surv)
    ## Make Leslie matrix
    lesM <- matrix(0, nrow = n.age.grps, ncol = n.age.grps)
    ## first row = fert and birth survival
    k <- 1/(1+srb) * surv[1] * 0.5
    dbl.fert <- age.int*fert + c(age.int*fert[-1], 0) * surv[-1]
    lesM[1,] <- k * dbl.fert
    ## rows 2:(n.age.grps) = survival ratios
    lesM[2:n.age.grps,1:(n.age.grps-1)] <- diag(surv[-c(1,n.surv)])
    lesM[n.age.grps,n.age.grps] <- surv[n.surv]
    if(label.dims) {
        age.labs <- seq(from = 0, by = 5, length = n.age.grps)
        dimnames(lesM) <- list(age.labs, age.labs)
    }
    ## return
    return(lesM)
}
net.number.migrants <- function(n1, n2, L)
{
    ##-- Find net number of migrants in a CCMPP projection --##
    ##
    ## ARGUMENTS
    ##
    ##   n1      :  Population count vector at time t
    ##   n2      :  Population count vector at time t + delta
    ##   L       :  Leslie matrix used to get population at t + delta
    ##
    ##
    ## METHOD
    ##
    ## Invert n2 = L(n1 + 0.5 mig) + (0.5)*mig
    ## Can get proportions by pre-multiplying output by 'solve(diag(n1))'
    ## Make sure inputs are of correct form
    n1 <- as.numeric(n1)
    n2 <- as.numeric(n2)
    L <- as.matrix(L)
    return(2 * solve(L + diag(nrow(L))) %*% (n2 - L %*% n1))
}
### ----------------------- HELPER FUNCTIONS ---------------------- ###
### --------------------------------------------------------------- ###
## ........... Misc Functions .......... ##
## ..................................... ##
estMod.logit.mar29 <- function(p) log(p / (1 - p))
estMod.invlogit.mar29 <- function(x)
{
    if(any(is.infinite(exp(x)))) {
        y <- x
        y[is.infinite(exp(x))] <- 1
        y[!is.infinite(exp(x))] <-
            estMod.invlogit.mar29(y[!is.infinite(exp(x))])
        return(y)
    }
    else return(exp(x) / (1 + exp(x)))
}
##--- Generates random draws from inverse gamma ---##
estMod.rinvGamma.mar29 <- function(n, shape, scale)
{
    return(1/rgamma(n, shape = shape, rate = scale))
}
##--- Returns value of inverse gamma pdf ---##
estMod.dinvGamma.mar29 <- function(x, shape, scale, log = FALSE)
{
    if(log) d <-
        shape * log(scale) - lgamma(shape) - (shape + 1) * log(x) - scale / x
    else d <- scale^shape / gamma(shape) * (1/x)^(shape + 1) * exp(-scale/x)
    return(d)
}
##--- Creates column names for mcmc objects ---##
estMod.makeColNames.mar29 <- function(m)
{
    ## m:    matrix of input values
    e <- expand.grid(rownames(m), colnames(m))
    apply(e, 1, FUN = function(z) paste(z[2], z[1], sep = "."))
}
## .... Projection for census years .... ##
## ..................................... ##
proj.cen.yrs <-
    function(full.proj, bline.yr, vr.yrs, cen.yrs, proj.yrs
             ,labels = FALSE)
{
    bline.yr <- as.numeric(bline.yr)
    vr.yrs <- as.numeric(vr.yrs)
    cen.yrs <- as.numeric(cen.yrs)
    proj.yrs <- as.numeric(proj.yrs)
    interp.counts <- matrix(NA, nrow = nrow(full.proj), ncol = length(cen.yrs))
    if(labels) {
        if(!is.null(rownames(full.proj))) {
            rownames(interp.counts) <- rownames(full.proj)
        } else {
            rownames(intper.counts) <- seq(from = 0, by = 5
                                       ,length.out = nrow(full.proj)
                                       )
        }
        colnames(interp.counts) <- cen.yrs
    }
    cen.in.proj <- cen.yrs %in% proj.yrs
    cen.notin.proj <- !cen.in.proj
    proj.in.cen <- proj.yrs %in% cen.yrs
    ## Check to see if interpolation necessary
    if(all(cen.in.proj)) {
        interp.counts <- full.proj[,proj.in.cen]
    } else {
        ## Growth rates
        ## (Does this for all, including those not needing interpolation)
        ratio.mat <- matrix(NA,
                            ,nrow = nrow(full.proj)
                            ,ncol = ncol(full.proj) - 1)
        for(j in 1:ncol(ratio.mat)) {
            ratio.mat[,j] <- full.proj[,(j+1)] / full.proj[,j]
        }
        yr.diffs <- diff(proj.yrs)
        ## if(any(is.nan(log(ratio.mat)))) {
        ##     cat("\nratio.mat=\n");  print(ratio.mat)
        ##     stop()
        ## }
        r.mat <- log(ratio.mat) / yr.diffs
        ## Duplicate last column of r.mat so that "interpolation"
        ## can be done for years beyond the end of proj.yrs,
        ## assuming that the growth rate remains constant
        ## (although don't know why we'd do this)
        r.mat <- cbind(r.mat, r.mat[,ncol(r.mat)])
        ## Interpolate
        for(j in which(cen.notin.proj)) {
            base.yr.ind <-
                max(which(proj.yrs <= cen.yrs[j]))
            time.gap <- cen.yrs[j] - proj.yrs[base.yr.ind]
            growth <- r.mat[,base.yr.ind]
            interp.counts[,j] <-
                full.proj[,base.yr.ind] * exp(growth * time.gap)
        }
        interp.counts[,cen.in.proj] <- full.proj[,proj.in.cen]
    }
    return(interp.counts)
}
## ............. Likelihood ............ ##
## ..................................... ##
log.lhood.mar29 <-
    function(log.n.census, log.n.hat, ll.var)
{
    ##.. log.n.census and log.n.hat should already be logged
    ##.. log.n.hat should be log projected counts for census years
    ##   interpolated if necessary
    ##-- value of log likelihoods --##
    density <- dnorm(log.n.census,
                     mean = log.n.hat,
                     sd = sqrt(ll.var),
                     log = TRUE
                     )
    ##-- joint log likelihood --##
    return(sum(density))
}
## .............. Posterior ............ ##
## ..................................... ##
log.post.mar29 <- function(## estimated vitals
                           f, s, g, baseline.n
                           ## fixed prior means on vitals
                           ,prior.mean.f, prior.mean.s
                           ,prior.mean.g, prior.mean.b
                           ## fixed prior parameters on variance distns
                           ,alpha.f, beta.f, alpha.s, beta.s
                           ,alpha.g, beta.g
                           ,alpha.n, beta.n
                           ## updated variances on prior distns
                           ,sigmasq.f, sigmasq.s, sigmasq.g, sigmasq.n
                           ## value of the log likelihood
                           ,log.like
                           ## non zero rows of fertility matrix
                           ,non.zero.fert
                           )
{
    ##-- Values of prior densities for vitals --##
    ##.. Note that log densities are calculated for numerical stability.
    ##     f, baseline.n, prior.mean.f, prior.mean.b are logged coming
    ##     in, s, prior.mean.s is logit transformed coming in, g and
    ##     prior.mean.g are not transformed coming in.
    log.f.prior <- dnorm(as.vector(f[non.zero.fert,])
                         ,mean = as.vector(prior.mean.f[non.zero.fert,])
                         ,sd = sqrt(sigmasq.f)
                         ,log = TRUE)
    log.s.prior <- dnorm(s, mean = prior.mean.s, sd = sqrt(sigmasq.s)
                         ,log = TRUE)
    log.g.prior <- dnorm(g, mean = prior.mean.g
                         ,sd = sqrt(sigmasq.g)
                         ,log = TRUE)
    log.b.prior <- dnorm(baseline.n, mean = prior.mean.b
                         ,sd = sqrt(sigmasq.n)
                         ,log = TRUE)
    ##-- Values of prior densities for variances --##
    log.sigmasq.f.prior <-
        log(estMod.dinvGamma.mar29(sigmasq.f, alpha.f, beta.f))
    log.sigmasq.s.prior <-
        log(estMod.dinvGamma.mar29(sigmasq.s, alpha.s, beta.s))
    log.sigmasq.g.prior <-
        log(estMod.dinvGamma.mar29(sigmasq.g, alpha.g, beta.g))
    log.sigmasq.n.prior <-
        log(estMod.dinvGamma.mar29(sigmasq.n, alpha.n, beta.n))
    ##-- The log posterior is the SUM of these with the log.like --##
    return(sum(log.f.prior, log.s.prior, log.g.prior, log.b.prior
               ,log.sigmasq.f.prior
               ,log.sigmasq.s.prior
               ,log.sigmasq.g.prior
               ,log.sigmasq.n.prior
               ,log.like))
}
## ......... Acceptance Ratio .......... ##
## ..................................... ##
acc.ra.mar29 <- function(log.prop, log.current)
{
    min(1, exp(log.prop - log.current))
}
acc.ra.var.mar29 <-
    function(log.prop.post, log.curr.post, log.prop.var, log.curr.var)
{
    min(1, exp(log.curr.var + log.prop.post - log.prop.var - log.curr.post
               ))
}
### --------------------------- SAMPLER --------------------------- ###
### --------------------------------------------------------------- ###
popRecon.sampler <-
    function(#.. number of iterations and burn-in (not saved)
             n.iter, burn.in = 0, thin.by = 1
             #.. fixed variance hyper-parameters
             ,al.f = 1, be.f = 0.0109, al.s = 1, be.s = 0.0109
             , al.g = 1, be.g = 0.0436, al.n = 1, be.n = 0.0109
             #.. fixed prior means
             ,mean.f, mean.s, mean.g, mean.b
             #.. inital values for vitals and variances
             #   *vitals not transformed coming in*
             ,start.f = mean.f, start.s = mean.s, start.g = mean.g, start.b = mean.b
             ,start.sigmasq.f = 5, start.sigmasq.s = 5, start.sigmasq.g = 5
             ,start.sigmasq.n = 5
             #.. census data
             #   *not transformed coming in*
             ,pop.data
             #.. **variances** for proposal distributions used in M-H
             #   steps which update vital rates.
             ,prop.vars
             #.. ccmp function
             ,ccmp.function = popRecon.ccmp.female
             #.. number of periods to project forward over (e.g.,
             #     number of five-year steps)
             ,proj.periods = ncol(mean.f)
             #.. age group width
             ,age.size = 5
             #.. print algorithm progress
             ,verb = FALSE
             #.. tolerance defining allowable survival probabilities
             ,s.tol = 10^(-10)
             )
{
    ## .............. Sampler .............. ##
    ## ..................................... ##
    ## -------- Begin timing ------- ##
    ptm <- proc.time()
    ## ------ Match functions ------ ##
    ## ------- Check input dimensions ------- ##
    input.dims <- sapply(list(start.s = start.s[1:(nrow(start.s)-1),]
                              , start.g = start.g
             ,mean.f = mean.f, mean.s = mean.s[1:(nrow(mean.s)-1),]
             ,mean.g = mean.g
             )
           ,"dim")
    mismatch.dims <- apply(input.dims, 2, "identical", dim(start.f))
    if(!all(mismatch.dims))
        stop("Dims of these inputs do not match 'dim(start.f)'", "\n"
             ,paste(names(mismatch.dims)[!mismatch.dims], collapse = "  "))
    ## ------- Check Years --------- ##
    all.vr.years <-
        list(start.s = colnames(start.s), start.g = colnames(start.g)
             ,mean.f = colnames(mean.f), mean.s = colnames(mean.s)
             ,mean.g = colnames(mean.g)
             )
    mismatch.yrs <- sapply(all.vr.years, "identical", colnames(start.f))
    if(!all(mismatch.dims))
        stop("Years of these inputs do not match years of 'start.f'", "\n"
             ,paste(names(mismatch.yrs)[!mismatch.yrs], collapse = "  "))
    all.vr.years.eq <-
        sapply(all.vr.years, FUN = function(z) all.equal(colnames(start.f), z))
    if(!all(all.vr.years.eq)) {
        stop(paste("colnames(", names(all.vr.years)[min(which(!all.vr.years.eq))], ")"
                   ," != colnames(start.f). There may be more...", sep = "")
             )
    }
    proj.years <-
        seq(from = as.numeric(colnames(start.f)[1]), by = age.size
            ,length = proj.periods + 1)
    if(!all.equal(proj.years[1:ncol(start.f)], as.numeric(colnames(start.f))))
        stop("colnames(start.f) !=  seq(from = as.numeric(colnames(start.f)[1]), by = age.size, length = ncol(start.f))")
    vr.years <- as.numeric(colnames(start.f))
    baseline.year <- as.numeric(colnames(start.b))
    census.years <- as.numeric(colnames(pop.data))
    ## ------- Determine fert.rows --------- ##
    zero.elements <- mean.f == 0
    fert.rows <- as.logical(apply(zero.elements, 1, function(z) !all(z)))
    ## ------- Type of migration data ------- ##
    ## No reason for this anymore; remove later
    mig.string <- "prop"
    ## ---------- Storage ---------- ##
    #.. MCMC objects for posterior samples
    # Samples are stored as 2D arrays for compatibility with coda's
    # mcmc format with iterations as rows, year*age.group as columns.
    # Age.group cycles fastest across columns, e.g.,
    # _____________________________________________________
    #   1960  | 1960  | 1960  | ... | 1965  | 1965  | ...
    #   15.19 | 20.24 | 25.29 | ... | 15.19 | 20.24 | ...
    # 1  --   |  --   |  --   | ... |  --   |  --   | ...
    # 2  --   |  --   |  --   | ... |  --   |  --   | ...
    #   etc.
    # _____________________________________________________
    ## How many stored?
    n.stored <- ceiling(n.iter / thin.by)
      # Fertility
      fert.rate.mcmc <-
          mcmc(matrix(nrow = n.stored
                      ,ncol = sum(fert.rows) * ncol(start.f))
               ,start = burn.in + 1
               ,thin = thin.by
               )
      colnames(fert.rate.mcmc) <-
          estMod.makeColNames.mar29(start.f[fert.rows,])
      # Survival proportions
      surv.prop.mcmc <-
          mcmc(matrix(nrow = n.stored
                      ,ncol = nrow(start.s) * ncol(start.s))
               ,start = burn.in + 1
               ,thin = thin.by
               )
      colnames(surv.prop.mcmc) <-
          estMod.makeColNames.mar29(start.s)
      # lx
      lx.mcmc <-
          mcmc(matrix(nrow = n.stored
                      ,ncol = nrow(start.b) * (proj.periods))
               ,start = burn.in + 1
               ,thin = thin.by
               )
      colnames(lx.mcmc) <-
          estMod.makeColNames.mar29(matrix(0, nrow = nrow(start.b)
                                 ,ncol = proj.periods
          ,dimnames = list(rownames(start.b)
           ,seq(from = as.numeric(colnames(start.b)[1]) +
           age.size, by = age.size, length = proj.periods))
                                 )
                          )
      # migration proportions
      mig.mcmc <-
          mcmc(matrix(nrow = n.stored
                      ,ncol = nrow(start.g) * ncol(start.g))
               ,start = burn.in + 1
               ,thin = thin.by)
      colnames(mig.mcmc) <-
          estMod.makeColNames.mar29(start.g)
      # baseline counts
      baseline.count.mcmc <-
          mcmc(matrix(nrow = n.stored, ncol = nrow(start.b))
               ,start = burn.in + 1
               ,thin = thin.by)
      colnames(baseline.count.mcmc) <- estMod.makeColNames.mar29(start.b)
      # variances
      variances.mcmc <-
          mcmc(matrix(nrow = n.stored, ncol = 4)
               ,start = burn.in + 1
               ,thin = thin.by)
      colnames(variances.mcmc) <-
          c("fert.rate.var", "surv.prop.var", "mig.var"
            ,"population.count.var")
    #.. Record acceptance rate
    acc.count <-
        list(fert.rate = matrix(0, nrow = nrow(mean.f[fert.rows,])
             ,ncol = ncol(mean.f[fert.rows,])
             ,dimnames = dimnames(mean.f[fert.rows,])
             )
             ,surv.prop = matrix(0, nrow = nrow(mean.s)
              ,ncol = ncol(mean.s)
              ,dimnames = dimnames(mean.s)
              )
             ,mig = matrix(0, nrow = nrow(mean.g), ncol = ncol(mean.g)
              ,dimnames = dimnames(mean.g)
              )
             ,baseline.count = matrix(0, nrow = nrow(mean.b)
              ,dimnames = dimnames(mean.b)
              )
             ,sigmasq.f = 0
             ,sigmasq.s = 0
             ,sigmasq.g = 0
             ,sigmasq.n = 0
             )
    #.. Count how often acceptance ratio missing or na
    ar.na <- acc.count
    #.. Count how often projection gives negative population
    pop.negative <-
        list(fert.rate = matrix(0, nrow = nrow(mean.f[fert.rows,])
             ,ncol = ncol(mean.f[fert.rows,])
             ,dimnames = dimnames(mean.f[fert.rows,])
             )
             ,surv.prop = matrix(0, nrow = nrow(mean.s)
              ,ncol = ncol(mean.s)
              ,dimnames = dimnames(mean.s)
              )
             ,mig = matrix(0, nrow = nrow(mean.g), ncol = ncol(mean.g)
              ,dimnames = dimnames(mean.g)
              )
             ,baseline.count = matrix(0, nrow = nrow(mean.b)
              ,dimnames = dimnames(mean.b)
              )
             )
    #.. Count how often surv probs are outside tolerance
    s.out.tol <- matrix(0, nrow = nrow(mean.s), ncol = ncol(mean.s)
                        ,dimnames = dimnames(mean.s))
    ## -------- Initialize -------- ##
    #.. Set current vitals and variances to inital values
    #   Take logs/logits here where required
    log.curr.f <- log(start.f) #<-- log(0) stored as "-Inf". Gets
    log.prop.f <- log(start.f) #    converted to 0 under exponentiation
    logit.curr.s <- estMod.logit.mar29(start.s)
    curr.g <- start.g
    log.curr.b <- log(start.b)
    curr.sigmasq.f <- start.sigmasq.f
    curr.sigmasq.s <- start.sigmasq.s
    curr.sigmasq.g <- start.sigmasq.g
    curr.sigmasq.n <- start.sigmasq.n
    #.. Fixed means for vitals and baseline
    #   Set these to inputs, take logs where required.
    log.mean.f <- log(mean.f)
    logit.mean.s <- estMod.logit.mar29(mean.s)
    mean.g <- mean.g
    log.mean.b <- log(mean.b)
    #.. Fixed census data
    #   Take logs here
    log.census.mat <- log(pop.data)
    #.. Set current projection: base on initial values
    log.curr.proj <-
        log(proj.cen.yrs(full.proj =
                         ccmp.function(pop = exp(log.curr.b),
                                       surv = estMod.invlogit.mar29(logit.curr.s),
                                       fert = exp(log.curr.f),
                                       mig = curr.g,
                                       proj.steps = proj.periods,
                                       age.int = age.size)
                         ,bline.yr = baseline.year
                         ,vr.yrs = vr.years
                         ,cen.yrs = census.years, proj.yrs = proj.years
                         ))
    #.. Current log posterior
    log.curr.posterior <-
        log.post.mar29(f = log.curr.f
                       ,s = logit.curr.s
                       ,g = curr.g
                       ,baseline.n = log.curr.b
                       ,prior.mean.f = log.mean.f
                       ,prior.mean.s = logit.mean.s
                       ,prior.mean.g = mean.g
                       ,prior.mean.b = log.mean.b
                       ,alpha.f = al.f, beta.f = be.f
                       ,alpha.s = al.s, beta.s = be.s
                       ,alpha.g = al.g, beta.g = be.g
                       ,alpha.n = al.n, beta.n = be.n
                       ,sigmasq.f = curr.sigmasq.f
                       ,sigmasq.s = curr.sigmasq.s
                       ,sigmasq.g = curr.sigmasq.g
                       ,sigmasq.n = curr.sigmasq.n
                       ,log.like = log.lhood.mar29(
                        log.n.census = log.census.mat
                        ,log.n.hat = log.curr.proj
                        ,ll.var = curr.sigmasq.n)
                       ,non.zero.fert = fert.rows
                       )
    ## -------- Begin loop ------- ##
    #...............................#
    if(verb) {
        cat("\n\ntotal iterations = ", n.iter+burn.in
            ,"\nburn in = ", burn.in
            ,"\nthin = ", thin.by
            ,",\nnumber stored = ", n.stored, sep = "")
        cat("\n\nfert.rows = ", which(fert.rows)
            ,"\ncensus years = ", census.years
            ,"\nvital rate years = ", vr.years
            ,"\nprojection years = ", proj.years
            )
        cat("\n\n"
            ,"iter ", " quantity\n", "---- ", " --------"
            ,sep = "")
          }
    for(i in 1:(n.iter + burn.in)) {
      # k is the index into the storage objects
      k <- (i - burn.in - 1) / thin.by + 1
      ## -------- Vital Rate M-H Steps ------- ##
      ##...... Fertility .....##
      if(verb && identical(i%%1000, 0)) cat("\n", i, " Fertility")
      # - Proposal
      #.. cycle through components
      for(j in 1:length(log.curr.f[fert.rows,])) {
        #.. make a matrix conformable w fertility rate matrix
        log.prop.f.mat <-
            matrix(0, nrow = nrow(log.curr.f), ncol = ncol(log.curr.f))
        log.prop.f.mat[fert.rows,][j] <-
            rnorm(1, 0, sqrt(prop.vars$fert.rate[j]))
        #.. make proposal
        log.prop.f <- log.curr.f + log.prop.f.mat
        # - Run CCMP (project on the original scale)
        #   ** Don't allow negative population
        full.proj <- ccmp.function(pop = exp(log.curr.b),
                            fert = exp(log.prop.f), #<-- use proposal
                            surv = estMod.invlogit.mar29(logit.curr.s),
                            mig = curr.g,
                            proj.steps = proj.periods,
                                   age.int = age.size)
        if(sum(full.proj < 0) > 0 || is.na(sum(full.proj))
           || is.nan(sum(full.proj))) {
            if(i > burn.in) {
                pop.negative$fert.rate[j] <-
                    pop.negative$fert.rate[j] + 1/n.iter
            }
        } else {
            prop.proj <-
                proj.cen.yrs(full.proj = full.proj
                             ,bline.yr = baseline.year
                             ,vr.yrs = vr.years
                             ,cen.yrs = census.years, proj.yrs = proj.years
                             )
            log.prop.proj <- log(prop.proj)
          # - Calculate log posterior of proposed vital under projection
          log.prop.posterior <-
              log.post.mar29(f = log.prop.f #<-- use proposal
                             ,s = logit.curr.s
                             ,g = curr.g
                             ,baseline.n = log.curr.b
                             ,prior.mean.f = log.mean.f
                             ,prior.mean.s = logit.mean.s
                             ,prior.mean.g = mean.g
                             ,prior.mean.b = log.mean.b
                             ,alpha.f = al.f, beta.f = be.f
                             ,alpha.s = al.s, beta.s = be.s
                             ,alpha.g = al.g, beta.g = be.g
                             ,alpha.n = al.n, beta.n = be.n
                             ,sigmasq.f = curr.sigmasq.f
                             ,sigmasq.s = curr.sigmasq.s
                             ,sigmasq.g = curr.sigmasq.g
                             ,sigmasq.n = curr.sigmasq.n
                             ,log.like = log.lhood.mar29(
                              log.n.census = log.census.mat
                              ,log.n.hat = log.prop.proj #<-- use proposal
                              ,ll.var = curr.sigmasq.n)
                             ,non.zero.fert = fert.rows
                             )
          #- Acceptance ratio
          ar <- acc.ra.mar29(log.prop = log.prop.posterior,
                             log.current = log.curr.posterior)
          # - Move or stay
          #.. stay if acceptance ratio 0, missing, infinity, etc.
          if(is.na(ar) || is.nan(ar) || ar < 0) {
            if(i > burn.in) ar.na$fert.rate[j] <-
                ar.na$fert.rate[j] + 1/n.iter
          } else {
            #.. if accept, update current fert rates, store proposed
            #   rate, update current projection and count acceptance
            if(runif(1) <= ar) {
              if(i > burn.in) acc.count$fert.rate[j] <-
                  acc.count$fert.rate[j] + 1/n.iter
              log.curr.f <- log.prop.f
              log.curr.proj <- log.prop.proj
              log.curr.posterior <- log.prop.posterior
            }
            #.. if reject, leave current fert rates and projections
            #   alone
          } # close else after checking for ar=0, missing, inf
        } # close else after checking neg or zero population
      } # close loop over all age-spec fertility rates
      #.. Store proposed fertility rate matrix
      if(k %% 1 == 0 && k > 0) fert.rate.mcmc[k,] <-
          as.vector(exp(log.curr.f[fert.rows,]))
      ##...... Survival ......##
      if(verb && identical(i%%1000, 0)) cat("\n", i, " Survival")
      # - Proposal
      #.. cycle through components
      for(j in 1:length(logit.curr.s)) {
        #.. make a matrix conformable w rate matrix
        logit.prop.s.mat <-
            matrix(0, nrow = nrow(logit.curr.s)
                   ,ncol = ncol(logit.curr.s))
        logit.prop.s.mat[j] <- rnorm(1, 0, sqrt(prop.vars$surv.prop[j]))
        #.. make proposal
        logit.prop.s <- logit.curr.s + logit.prop.s.mat
        #.. If proposal resulted in back-transformed s = 0 or 1, do
        #   nothing
        if(estMod.invlogit.mar29(logit.prop.s[j]) > 1 - s.tol ||
           estMod.invlogit.mar29(logit.prop.s[j]) < s.tol) {
          #.. leave current surv rates and projections
          #   alone (simply do not propose
          #   extreme survival probabilities)
          s.out.tol[j] <- s.out.tol[j] + 1/n.iter
        } else {
          # - Run CCMP (project on the original scale)
          #   ** Don't allow negative population; again, simply treat
          #      this as if the proposal were never made
            full.proj <- ccmp.function(pop = exp(log.curr.b),
                                       fert = exp(log.curr.f),
                                       surv = estMod.invlogit.mar29(logit.prop.s), #<-- use prop
                                       mig = curr.g,
                                       proj.steps = proj.periods,
                                       age.int = age.size)
            if(sum(full.proj < 0) > 0 || is.na(sum(full.proj))
               || is.nan(sum(full.proj))) {
                if(i > burn.in) {
                    pop.negative$surv.prop[j] <-
                        pop.negative$surv.prop[j] + 1/n.iter
                }
            } else {
                prop.proj <-
                    proj.cen.yrs(full.proj = full.proj
                                 ,bline.yr = baseline.year
                                 ,vr.yrs = vr.years
                                 ,cen.yrs = census.years, proj.yrs = proj.years
                                 )
            log.prop.proj <- log(prop.proj)
            # - Calculate log posterior of proposed vital under projection
            log.prop.posterior <-
              log.post.mar29(f = log.curr.f
                             ,s = logit.prop.s #<-- use proposal
                             ,g = curr.g
                             ,baseline.n = log.curr.b
                             ,prior.mean.f = log.mean.f
                             ,prior.mean.s = logit.mean.s
                             ,prior.mean.g = mean.g
                             ,prior.mean.b = log.mean.b
                             ,alpha.f = al.f, beta.f = be.f
                             ,alpha.s = al.s, beta.s = be.s
                             ,alpha.g = al.g, beta.g = be.g
                             ,alpha.n = al.n, beta.n = be.n
                             ,sigmasq.f = curr.sigmasq.f
                             ,sigmasq.s = curr.sigmasq.s
                             ,sigmasq.g = curr.sigmasq.g
                             ,sigmasq.n = curr.sigmasq.n
                             ,log.like = log.lhood.mar29(
                              log.n.census = log.census.mat
                              ,log.n.hat = log.prop.proj #<-- use proposal
                              ,ll.var = curr.sigmasq.n)
                             ,non.zero.fert = fert.rows
                             )
            #- Acceptance ratio
            ar <- acc.ra.mar29(log.prop = log.prop.posterior,
                               log.current = log.curr.posterior)
            # - Move or stay
            #.. stay if acceptance ratio 0, missing, infinity, etc.
            if(is.na(ar) || is.nan(ar) || ar < 0) {
              if(i > burn.in) ar.na$surv.prop[j] <-
                  ar.na$surv.prop[j] + 1/n.iter
            } else {
              #.. if accept, update current surv rates,
              #   update current projection and count acceptance
              if(runif(1) <= ar) {
                if(i > burn.in) acc.count$surv.prop[j] <-
                    acc.count$surv.prop[j] + 1/n.iter
                logit.curr.s <- logit.prop.s
                log.curr.proj <- log.prop.proj
                log.curr.posterior <- log.prop.posterior
              } #.. if reject, leave current surv rates and projections
                #   alone
            } # close else{ after checking for undefined ar
          } # close else{ after checking for negative pop
        } # close else{ after checking for s outside tol
      } # close loop over all age-spec survival probabilities
      #.. Store proposed survival probability matrix
      if(k %% 1 == 0 && k > 0) surv.prop.mcmc[k,] <-
        as.vector(estMod.invlogit.mar29(logit.curr.s))
      ##...... Migration ......##
      if(verb && identical(i%%1000, 0)) cat("\n", i, " Migration")
      # - Proposal
      #.. cycle through components
      for(j in 1:length(curr.g)) {
        #.. make a matrix conformable w rate matrix
        prop.g.mat <-
            matrix(0, nrow = nrow(curr.g), ncol = ncol(curr.g))
        prop.g.mat[j] <- rnorm(1, 0, sqrt(prop.vars$mig[j]))
        #.. make proposal
        prop.g <- curr.g + prop.g.mat
      # - Run CCMP (project on the original scale)
      #   ** Don't allow negative population
        full.proj <- ccmp.function(pop = exp(log.curr.b),
                              fert = exp(log.curr.f),
                              surv = estMod.invlogit.mar29(logit.curr.s),
                              mig = prop.g, #<-- use proposal
                              proj.steps = proj.periods,
                              age.int = age.size)
      if(sum(full.proj < 0) > 0 || is.na(sum(full.proj))
         || is.nan(sum(full.proj))) {
        if(i > burn.in) {
          pop.negative$mig[j] <-
              pop.negative$mig[j] + 1/n.iter
        }
      } else {
        prop.proj <-
            proj.cen.yrs(full.proj = full.proj
                     ,bline.yr = baseline.year
                     ,vr.yrs = vr.years
                     ,cen.yrs = census.years, proj.yrs = proj.years
                     )
        log.prop.proj <- log(prop.proj)
        # - Calculate log posterior of proposed vital under projection
        log.prop.posterior <-
              log.post.mar29(f = log.curr.f
                             ,s = logit.curr.s
                             ,g = prop.g #<-- use proposal
                             ,baseline.n = log.curr.b
                             ,prior.mean.f = log.mean.f
                             ,prior.mean.s = logit.mean.s
                             ,prior.mean.g = mean.g
                             ,prior.mean.b = log.mean.b
                             ,alpha.f = al.f, beta.f = be.f
                             ,alpha.s = al.s, beta.s = be.s
                             ,alpha.g = al.g, beta.g = be.g
                             ,alpha.n = al.n, beta.n = be.n
                             ,sigmasq.f = curr.sigmasq.f
                             ,sigmasq.s = curr.sigmasq.s
                             ,sigmasq.g = curr.sigmasq.g
                             ,sigmasq.n = curr.sigmasq.n
                             ,log.like = log.lhood.mar29(
                              log.n.census = log.census.mat
                              ,log.n.hat = log.prop.proj #<-- use proposal
                              ,ll.var = curr.sigmasq.n)
                             ,non.zero.fert = fert.rows
                             )
        #- Acceptance ratio
        ar <- acc.ra.mar29(log.prop = log.prop.posterior,
                           log.current = log.curr.posterior)
        # - Move or stay
        #.. stay if acceptance ratio 0, missing, infinity, etc.
        if(is.na(ar) || is.nan(ar) || ar < 0) {
            if(i > burn.in) ar.na$mig[j] <-
                ar.na$mig[j] + 1/n.iter
        } else {
            #.. if accept, update current vital rates, store proposed
            #   rate, update current projection and count acceptance
            if(runif(1) <= ar) {
                if(i > burn.in) acc.count$mig[j] <-
                    acc.count$mig[j] + 1/n.iter
                curr.g <- prop.g
                log.curr.proj <- log.prop.proj
                log.curr.posterior <- log.prop.posterior
            } #.. if reject, leave current fert rates and projections
            #   alone, store current rate
        } # close else after checking for ar=na, nan, zero
    } # close else after checking for negative population
    } # close loop over all age-specific migration proportions
      #.. Store proposed migration proportion matrix
      if(k %% 1 == 0 && k > 0) mig.mcmc[k,] <- as.vector(curr.g)
      ##...... Baseline population ......##
      if(verb && identical(i%%1000, 0)) cat("\n", i, " Baseline")
      # - Proposal
      #.. cycle through components (never update last
      #   value as this affects years beyond the estimation period)
      for(j in 1:length(log.curr.b)) {
      #.. make a matrix conformable w rate matrix
      log.prop.b.mat <- matrix(0, nrow = nrow(log.curr.b), ncol = 1)
      log.prop.b.mat[j] <- rnorm(1, 0, sqrt(prop.vars$baseline.pop.count[j]))
      #.. make proposal
      log.prop.b <- log.curr.b + log.prop.b.mat
      # - Run CCMP (project on the original scale)
      #   ** Don't allow negative population
      full.proj <- ccmp.function(pop = exp(log.prop.b), #<-- use proposal
                            fert = exp(log.curr.f),
                            surv = estMod.invlogit.mar29(logit.curr.s),
                            mig = curr.g,
                            proj.steps = proj.periods,
                            age.int = age.size)
      if(sum(full.proj < 0) > 0 || is.na(sum(full.proj))
         || is.nan(sum(full.proj))) {
        if(i > burn.in) {
          pop.negative$baseline.count[j] <-
              pop.negative$baseline.count[j] + 1/n.iter
        }
      } else {
      prop.proj <-
          proj.cen.yrs(full.proj = full.proj
                     ,bline.yr = baseline.year
                     ,vr.yrs = vr.years
                     ,cen.yrs = census.years, proj.yrs = proj.years
                     )
        log.prop.proj <- log(prop.proj)
        # - Calculate log posterior of proposed vital under projection
        log.prop.posterior <-
              log.post.mar29(f = log.curr.f
                             ,s = logit.curr.s
                             ,g = curr.g
                             ,baseline.n = log.prop.b #<-- use proposal
                             ,prior.mean.f = log.mean.f
                             ,prior.mean.s = logit.mean.s
                             ,prior.mean.g = mean.g
                             ,prior.mean.b = log.mean.b
                             ,alpha.f = al.f, beta.f = be.f
                             ,alpha.s = al.s, beta.s = be.s
                             ,alpha.g = al.g, beta.g = be.g
                             ,alpha.n = al.n, beta.n = be.n
                             ,sigmasq.f = curr.sigmasq.f
                             ,sigmasq.s = curr.sigmasq.s
                             ,sigmasq.g = curr.sigmasq.g
                             ,sigmasq.n = curr.sigmasq.n
                             ,log.like = log.lhood.mar29(
                              log.n.census = log.census.mat
                              ,log.n.hat = log.prop.proj #<-- use proposal
                              ,ll.var = curr.sigmasq.n)
                             ,non.zero.fert = fert.rows
                             )
        #- Acceptance ratio
        ar <- acc.ra.mar29(log.prop = log.prop.posterior,
                           log.current = log.curr.posterior)
        # - Move or stay
        #.. stay if acceptance ratio 0, missing, infinity, etc.
        if(is.na(ar) || is.nan(ar) || ar < 0) {
            if(i > burn.in) ar.na$baseline.count[j] <-
                ar.na$baseline.count[j] + 1/n.iter
        } else {
            #.. if accept, update current mig rates, store proposed
            #   rate, update current projection and count acceptance
            if(runif(1) <= ar) {
                if(i > burn.in) acc.count$baseline.count[j] <-
                    acc.count$baseline.count[j] + 1/n.iter
                log.curr.b <- log.prop.b
                log.curr.proj <- log.prop.proj
                log.curr.posterior <- log.prop.posterior
            } #.. if reject, leave current fert rates and projections
            #   alone, store current rate
        } # close else after checking for ar=na, nan, zero
    } # close else after checking for negative population
  } # close loop over all age-specific baseline counts
      #.. Store proposed baseline count matrix
      if(k %% 1 == 0 && k > 0) baseline.count.mcmc[k,] <-
          as.vector(exp(log.curr.b))
      ## ------- Variance Updates ------- ##
      if(verb && identical(i%%1000, 0)) cat("\n", i, " Variances")
      ##...... Fertility rate ......##
      prop.sigmasq.f <-
        estMod.rinvGamma.mar29(1, al.f +
                         length(mean.f[fert.rows,])/2,
                  be.f + 0.5*sum((log.curr.f[fert.rows,] -
                                  log.mean.f[fert.rows,])^2)
                  )
        # - Calculate log posterior of proposed vital under projection
        log.prop.posterior <-
              log.post.mar29(f = log.curr.f
                             ,s = logit.curr.s
                             ,g = curr.g
                             ,baseline.n = log.curr.b
                             ,prior.mean.f = log.mean.f
                             ,prior.mean.s = logit.mean.s
                             ,prior.mean.g = mean.g
                             ,prior.mean.b = log.mean.b
                             ,alpha.f = al.f, beta.f = be.f
                             ,alpha.s = al.s, beta.s = be.s
                             ,alpha.g = al.g, beta.g = be.g
                             ,alpha.n = al.n, beta.n = be.n
                             ,sigmasq.f = prop.sigmasq.f #<-- use proposal
                             ,sigmasq.s = curr.sigmasq.s
                             ,sigmasq.g = curr.sigmasq.g
                             ,sigmasq.n = curr.sigmasq.n
                             ,log.like = log.lhood.mar29(
                              log.n.census = log.census.mat
                              ,log.n.hat = log.curr.proj
                              ,ll.var = curr.sigmasq.n #<-- use current
                              )
                             ,non.zero.fert = fert.rows
                             )
      #- Acceptance ratio
      ar <- acc.ra.var.mar29(log.prop.post = log.prop.posterior
                             ,log.curr.post = log.curr.posterior
                             ,log.prop.var = estMod.dinvGamma.mar29(prop.sigmasq.f
                              ,al.f + length(mean.f[fert.rows,])/2
                              ,be.f + 0.5*sum((log.curr.f[fert.rows,] -
                                               log.mean.f[fert.rows,])^2)
                              ,log = TRUE)
                             ,log.curr.var = estMod.dinvGamma.mar29(curr.sigmasq.f
                              ,al.f + length(mean.f[fert.rows,])/2
                              ,be.f + 0.5*sum((log.curr.f[fert.rows,] -
                                               log.mean.f[fert.rows,])^2)
                              ,log = TRUE)
                             )
        # - Move or stay
        #.. stay if acceptance ratio 0, missing, infinity, etc.
        if(is.na(ar) || is.nan(ar) || ar < 0) {
            if(i > burn.in) ar.na$sigmasq.f <-
                ar.na$sigmasq.f + 1/n.iter
        } else {
            #.. if accept, update current, store proposed
            #   and count acceptance
            if(runif(1) <= ar) {
                if(i > burn.in) acc.count$sigmasq.f <-
                    acc.count$sigmasq.f + 1/n.iter
                curr.sigmasq.f <- prop.sigmasq.f
                log.curr.posterior <- log.prop.posterior
            } #.. if reject, leave current and posterior
        } # close else after checking for ar=na, nan, zero
      if(k %% 1 == 0 && k > 0) variances.mcmc[k,"fert.rate.var"] <- curr.sigmasq.f
      ##...... Survival Proportion ......##
      prop.sigmasq.s <-
        estMod.rinvGamma.mar29(1, al.s + length(mean.s)/2,
                  be.s +
                    0.5*sum((logit.curr.s - logit.mean.s)^2))
        # - Calculate log posterior of proposed vital under projection
        log.prop.posterior <-
              log.post.mar29(f = log.curr.f
                             ,s = logit.curr.s
                             ,g = curr.g
                             ,baseline.n = log.curr.b
                             ,prior.mean.f = log.mean.f
                             ,prior.mean.s = logit.mean.s
                             ,prior.mean.g = mean.g
                             ,prior.mean.b = log.mean.b
                             ,alpha.f = al.f, beta.f = be.f
                             ,alpha.s = al.s, beta.s = be.s
                             ,alpha.g = al.g, beta.g = be.g
                             ,alpha.n = al.n, beta.n = be.n
                             ,sigmasq.f = curr.sigmasq.f
                             ,sigmasq.s = prop.sigmasq.s  #<-- use proposal
                             ,sigmasq.g = curr.sigmasq.g
                             ,sigmasq.n = curr.sigmasq.n
                             ,log.like = log.lhood.mar29(
                              log.n.census = log.census.mat
                              ,log.n.hat = log.curr.proj
                              ,ll.var = curr.sigmasq.n #<-- use current
                              )
                             ,non.zero.fert = fert.rows
                             )
      #- Acceptance ratio
      ar <- acc.ra.var.mar29(log.prop.post = log.prop.posterior
                             ,log.curr.post = log.curr.posterior
                             ,log.prop.var = estMod.dinvGamma.mar29(prop.sigmasq.s
                              ,al.s + length(mean.s)/2
                              ,be.s + 0.5*sum((logit.curr.s -
                                               logit.mean.s)^2)
                              ,log = TRUE)
                             ,log.curr.var = estMod.dinvGamma.mar29(curr.sigmasq.s
                              ,al.s + length(mean.s)/2
                              ,be.s + 0.5*sum((logit.curr.s -
                                               logit.mean.s)^2)
                              ,log = TRUE)
                             )
        # - Move or stay
        #.. stay if acceptance ratio 0, missing, infinity, etc.
        if(is.na(ar) || is.nan(ar) || ar < 0) {
            if(i > burn.in) ar.na$sigmasq.s <-
                ar.na$sigmasq.s + 1/n.iter
        } else {
            #.. if accept, update current, store proposed
            #   and count acceptance
            if(runif(1) <= ar) {
                if(i > burn.in) acc.count$sigmasq.s <-
                    acc.count$sigmasq.s + 1/n.iter
                curr.sigmasq.s <- prop.sigmasq.s
                log.curr.posterior <- log.prop.posterior
            } #.. if reject, leave current and posterior
        } # close else after checking for ar=na, nan, zero
      if(k %% 1 == 0 && k > 0) variances.mcmc[k,"surv.prop.var"] <- curr.sigmasq.s
      ##...... Migration Proportion ......##
      prop.sigmasq.g <-
        estMod.rinvGamma.mar29(1, al.g + length(mean.g)/2,
                  be.g +
                    0.5*sum((curr.g - mean.g)^2))
        # - Calculate log posterior of proposed vital under projection
        log.prop.posterior <-
              log.post.mar29(f = log.curr.f
                             ,s = logit.curr.s
                             ,g = curr.g
                             ,baseline.n = log.curr.b
                             ,prior.mean.f = log.mean.f
                             ,prior.mean.s = logit.mean.s
                             ,prior.mean.g = mean.g
                             ,prior.mean.b = log.mean.b
                             ,alpha.f = al.f, beta.f = be.f
                             ,alpha.s = al.s, beta.s = be.s
                             ,alpha.g = al.g, beta.g = be.g
                             ,alpha.n = al.n, beta.n = be.n
                             ,sigmasq.f = curr.sigmasq.f
                             ,sigmasq.s = curr.sigmasq.s
                             ,sigmasq.g = prop.sigmasq.g #<-- use proposal
                             ,sigmasq.n = curr.sigmasq.n
                             ,log.like = log.lhood.mar29(
                              log.n.census = log.census.mat
                              ,log.n.hat = log.curr.proj
                              ,ll.var = curr.sigmasq.n #<-- use current
                              )
                             ,non.zero.fert = fert.rows
                             )
      #- Acceptance ratio
      ar <- acc.ra.var.mar29(log.prop.post = log.prop.posterior
                             ,log.curr.post = log.curr.posterior
                             ,log.prop.var = estMod.dinvGamma.mar29(prop.sigmasq.g
                              ,al.g + length(mean.g)/2
                              ,be.g + 0.5*sum((curr.g -
                                               mean.g)^2)
                              ,log = TRUE)
                             ,log.curr.var = estMod.dinvGamma.mar29(curr.sigmasq.g
                              ,al.g + length(mean.g)/2
                              ,be.g + 0.5*sum((curr.g -
                                               mean.g)^2)
                              ,log = TRUE)
                             )
        # - Move or stay
        #.. stay if acceptance ratio 0, missing, infinity, etc.
        if(is.na(ar) || is.nan(ar) || ar < 0) {
            if(i > burn.in) ar.na$sigmasq.g <-
                ar.na$sigmasq.g + 1/n.iter
        } else {
            #.. if accept, update current, store proposed
            #   and count acceptance
            if(runif(1) <= ar) {
                if(i > burn.in) acc.count$sigmasq.g <-
                    acc.count$sigmasq.g + 1/n.iter
                curr.sigmasq.g <- prop.sigmasq.g
                log.curr.posterior <- log.prop.posterior
            } #.. if reject, leave current and posterior
        } # close else after checking for ar=na, nan, zero
      if(k %% 1 == 0 && k > 0) variances.mcmc[k,"mig.var"] <- curr.sigmasq.g
      ##...... Population Count ......##
      prop.sigmasq.n <-
        estMod.rinvGamma.mar29(1, al.n + (length(mean.b) +
                                    length(log.census.mat))/2,
                be.n + 0.5 * (
                  sum((log.curr.b - log.mean.b)^2) +
                  sum((log.census.mat - log.curr.proj)^2)
                  )
                         )
        # - Calculate log posterior of proposed vital under projection
        log.prop.posterior <-
              log.post.mar29(f = log.curr.f
                             ,s = logit.curr.s
                             ,g = curr.g
                             ,baseline.n = log.curr.b
                             ,prior.mean.f = log.mean.f
                             ,prior.mean.s = logit.mean.s
                             ,prior.mean.g = mean.g
                             ,prior.mean.b = log.mean.b
                             ,alpha.f = al.f, beta.f = be.f
                             ,alpha.s = al.s, beta.s = be.s
                             ,alpha.g = al.g, beta.g = be.g
                             ,alpha.n = al.n, beta.n = be.n
                             ,sigmasq.f = curr.sigmasq.f
                             ,sigmasq.s = curr.sigmasq.s
                             ,sigmasq.g = curr.sigmasq.g
                             ,sigmasq.n = prop.sigmasq.n #<-- use proposal
                             ,log.like = log.lhood.mar29(
                              log.n.census = log.census.mat
                              ,log.n.hat = log.curr.proj
                              ,ll.var = prop.sigmasq.n #<-- use proposal
                              )
                             ,non.zero.fert = fert.rows
                             )
      #- Acceptance ratio
      ar <- acc.ra.var.mar29(log.prop.post = log.prop.posterior
                             ,log.curr.post = log.curr.posterior
                             ,log.prop.var = estMod.dinvGamma.mar29(prop.sigmasq.n
                              ,al.n + (length(mean.b) +
                                       length(log.census.mat))/2
                              ,be.n + 0.5 * (sum((log.curr.b - log.mean.b)^2) + sum((log.census.mat - log.curr.proj)^2))
                              ,log = TRUE)
                             ,log.curr.var = estMod.dinvGamma.mar29(curr.sigmasq.n
                              ,al.n + (length(mean.b) +
                                       length(log.census.mat))/2
                              ,be.n + 0.5 * (sum((log.curr.b - log.mean.b)^2) + sum((log.census.mat - log.curr.proj)^2))
                              ,log = TRUE)
                             )
        # - Move or stay
        #.. stay if acceptance ratio 0, missing, infinity, etc.
        if(is.na(ar) || is.nan(ar) || ar < 0) {
            if(i > burn.in) ar.na$sigmasq.n <-
                ar.na$sigmasq.n + 1/n.iter
        } else {
            #.. if accept, update current, store proposed
            #   and count acceptance
            if(runif(1) <= ar) {
                if(i > burn.in) acc.count$sigmasq.n <-
                    acc.count$sigmasq.n + 1/n.iter
                curr.sigmasq.n <- prop.sigmasq.n
                log.curr.posterior <- log.prop.posterior
            } #.. if reject, leave current and posterior
        } # close else after checking for ar=na, nan, zero
      if(k %% 1 == 0 && k > 0) {
        variances.mcmc[k,"population.count.var"] <- curr.sigmasq.n
      }
      ## ------- Store current population ------- ##
      lx.mcmc[k,] <-
          as.vector(ccmp.function(pop = exp(log.curr.b),
                                  surv = estMod.invlogit.mar29(logit.curr.s),
                                  fert = exp(log.curr.f),
                                  mig = curr.g,
                                  proj.steps = proj.periods,
                                  age.int = age.size
                                  )[-(1:ncol(baseline.count.mcmc))]
                    )
      if(verb && identical(i%%1000, 0)) cat("\n\n")
  } # Ends outer-most loop
    ## ......... End Loop ........ ##
    #...............................#
    ## ---------- Output --------- ##
    #cat("inital values", "\n\n")
    #.. initial values
    start.vals <- list(fert.rate = start.f
                      ,surv.prop = start.s
                      ,mig.XXX = start.g
                      ,baseline.count = start.b
                      ,start.sigmasq.f = start.sigmasq.f
                      ,start.sigmasq.s = start.sigmasq.s
                      ,start.sigmasq.g = start.sigmasq.g
                      ,start.sigmasq.n = start.sigmasq.n
                      ,pop.data = pop.data
                      )
    #.. fixed parameters
    fixed.params <- list(alpha.fert.rate = al.f
                         ,beta.fert.rate = be.f
                         ,alpha.surv.prop = al.s
                         ,beta.surv.prop = be.s
                         ,alpha.mig.XXX = al.g
                         ,beta.mig.XXX = be.g
                         ,alpha.population.count = al.n
                         ,beta.population.count = be.n
                         ,mean.fert.rate = mean.f
                         ,mean.surv.prop = mean.s
                         ,mean.mig.XXX = mean.g
                         ,mean.baseline.count = mean.b
                         ,mean.pop.data = pop.data
                         )
    #.. migration type
    new.names <-
        lapply(list(start.vals, fixed.params), FUN = function(z) {
        sub("XXX", mig.string, names(z))
    })
    names(start.vals) <- new.names[[1]]
    names(fixed.params) <- new.names[[2]]
    #cat("algorithm statistics", "\n\n")
    #.. algorithm statistics
    alg.stats <-
        list(acceptance.proportions = acc.count
             ,pop.went.neg = pop.negative
             ,acc.prop.adj4neg = mapply(FUN = function(a, b, n) {
                 (a * n) / (n - b)
             },
              acc.count[1:4], pop.negative, MoreArgs = list(n = n.iter)
              )
             ,acc.rat.na = ar.na
             ,surv.outside.tol = s.out.tol
             ,run.time = proc.time() - ptm
             )
    #cat("algorithm parameters", "\n\n")
    #.. algorithm parameters
    alg.params <- list(prop.vars = prop.vars
                       ,vital.transformations = list(fert.rate = "log"
                        ,surv.prob = "logit", mig.XXX = "I"
                        ,baseline.count = "log"
                        ,population.count = "log")
                       ,projection.periods = proj.periods
                       ,age.gp.size = age.size
                       ,non.zero.fert.rows = fert.rows
                       ,surv.tolerance = s.tol
                       ,burn.in = burn.in
                       ,iters = n.iter
                       ,years = list(vital.rate.years = vr.years
                        ,baseline.year = baseline.year
                        ,census.years = census.years
                        ,projection.years = proj.years
                        )
                       )
    names(alg.params) <- sub("XXX", mig.string, names(alg.params))
    #.. results
    ret.list <- list(fert.rate.mcmc = fert.rate.mcmc
                  ,surv.prop.mcmc = surv.prop.mcmc
                  ,mig.XXX.mcmc = mig.mcmc
                  ,baseline.count.mcmc = baseline.count.mcmc
                  ,lx.mcmc = lx.mcmc
                  ,variances.mcmc = variances.mcmc
                  ,alg.stats = alg.stats
                  ,fixed.params = fixed.params
                  ,start.vals = start.vals
                  ,alg.params = alg.params
                  )
    names(ret.list) <- sub("XXX", mig.string, names(ret.list))
    return(ret.list)
  }
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.