R/vitalRatesHelper.R

Defines functions vitalRatesHelper vrHelper2 vrHelper1

vrHelper1 <- function(x, plts, db, grpBy, aGrpBy, byPlot){

  ## Selecting the plots for one county
  db$PLOT <- plts[[x]]
  ## Carrying out filter across all tables
  #db <- clipFIA(db, mostRecent = FALSE)

  # Only subplots from cond change matrix
  #db$SUBP_COND_CHNG_MTRX <- filter(db$SUBP_COND_CHNG_MTRX, SUBPTYP == 1)


  ## Which grpByNames are in which table? Helps us subset below
  grpP <- names(db$PLOT)[names(db$PLOT) %in% grpBy]
  grpC <- names(db$COND)[names(db$COND) %in% grpBy & names(db$COND) %in% grpP == FALSE]
  grpT <- names(db$TREE)[names(db$TREE) %in% grpBy & names(db$TREE) %in% c(grpP, grpC) == FALSE]

  ### Only joining tables necessary to produce plot level estimates, adjusted for non-response
  data <- select(db$PLOT, c('PLT_CN', 'STATECD', 'MACRO_BREAKPOINT_DIA', 'INVYR', 'MEASYEAR', 'PLOT_STATUS_CD', 'PREV_PLT_CN', 'REMPER', grpP, 'aD_p', 'sp')) %>%
    left_join(select(db$COND, c('PLT_CN', 'CONDPROP_UNADJ', 'PROP_BASIS', 'COND_STATUS_CD', 'CONDID', grpC, 'aD_c', 'landD')), by = c('PLT_CN')) %>%
    left_join(select(db$TREE, c('PLT_CN', 'CONDID', 'PREVCOND', 'TRE_CN', 'PREV_TRE_CN', 'SUBP', 'TREE', grpT, 'tD', 'typeD', 'DIA', 'DRYBIO_AG', 'VOLCFNET', 'VOLCSNET')), by = c('PLT_CN', 'CONDID')) %>%
    left_join(select(db$TREE_GRM_COMPONENT, c('TRE_CN', 'SUBPTYP_GRM', 'TPAGROW_UNADJ', 'TPAREMV_UNADJ', 'TPAMORT_UNADJ', 'COMPONENT')), by = c('TRE_CN')) %>%
    left_join(select(db$TREE_GRM_MIDPT, c('TRE_CN', 'DIA', 'VOLCFNET', 'VOLCSNET', 'DRYBIO_AG')), by = c('TRE_CN'), suffix = c('', '.mid')) %>%
    left_join(select(db$TREE_GRM_BEGIN, c('TRE_CN', 'DIA', 'VOLCFNET', 'VOLCSNET', 'DRYBIO_AG')), by = c('TRE_CN'), suffix = c('', '.beg')) %>%
    #left_join(select(db$SUBP_COND_CHNG_MTRX, SUBP:SUBPTYP_PROP_CHNG), by = c('PLT_CN', 'CONDID'), suffix = c('', '.subp')) %>%
    #left_join(select(db$COND, PLT_CN, CONDID, COND_STATUS_CD), by = c('PREV_PLT_CN.subp' = 'PLT_CN', 'PREVCOND.subp' = 'CONDID'), suffix = c('', '.chng')) %>%
    left_join(select(db$PLOT, c('PLT_CN', grpP, 'sp', 'aD_p')), by = c('PREV_PLT_CN' = 'PLT_CN'), suffix = c('', '.prev')) %>%
    left_join(select(db$COND, c('PLT_CN', 'CONDID', 'landD', 'aD_c', grpC, 'COND_STATUS_CD')), by = c('PREV_PLT_CN' = 'PLT_CN', 'PREVCOND' = 'CONDID'), suffix = c('', '.prev')) %>%
    left_join(select(db$TREE, c('TRE_CN', grpT, 'typeD', 'tD', 'DIA',  'DRYBIO_AG', 'VOLCFNET', 'VOLCSNET')), by = c('PREV_TRE_CN' = 'TRE_CN'), suffix = c('', '.prev')) %>%
    mutate_if(is.factor,
              as.character) %>%
    mutate(aChng = ifelse(COND_STATUS_CD.prev == 1 & COND_STATUS_CD == 1 & !is.null(CONDPROP_UNADJ), 1, 0),
           tChng = ifelse(COND_STATUS_CD.prev == 1 & COND_STATUS_CD == 1, 1, 0))

  #If previous attributes are unavailable for trees, default to current (otherwise we get NAs for early inventories)
  data$tD.prev <- ifelse(is.na(data$tD.prev), data$tD, data$tD.prev)
  data$typeD.prev <- ifelse(is.na(data$typeD.prev), data$typeD, data$typeD.prev)
  data$landD.prev <- ifelse(data$landD == 1 & data$landD.prev == 1, 1, 0)
    #ifelse(is.na(data$landD.prev), data$landD, data$landD.prev)
  data$aD_p.prev <- ifelse(is.na(data$aD_p.prev), data$aD_p, data$aD_p.prev)
  data$aD_c.prev <- ifelse(is.na(data$aD_c.prev), data$aD_c, data$aD_c.prev)
  data$sp.prev <- ifelse(is.na(data$sp.prev), data$sp, data$sp.prev)

  ## Comprehensive indicator function
  data$aDI <- data$landD.prev * data$aD_p * data$aD_c * data$sp * data$aChng
  data$tDI <- data$landD.prev * data$aD_p.prev * data$aD_c.prev * data$tD.prev * data$typeD.prev * data$sp.prev * data$tChng


  ## Modify  attributes depending on component (mortality uses midpoint)
  data <- data %>%
    mutate(DIA2 = vrAttHelper(DIA, DIA.prev, DIA.mid, DIA.beg, COMPONENT, REMPER, 2) * tDI,
           DIA1 = vrAttHelper(DIA, DIA.prev, DIA.mid, DIA.beg, COMPONENT, REMPER, 1) * tDI,
           BA2 = vrAttHelper(basalArea(DIA), basalArea(DIA.prev), basalArea(DIA.mid), basalArea(DIA.beg), COMPONENT, REMPER, 2) * tDI,
           BA1 = vrAttHelper(basalArea(DIA), basalArea(DIA.prev), basalArea(DIA.mid), basalArea(DIA.beg), COMPONENT, REMPER, 1) * tDI,
           VOLCFNET2 = vrAttHelper(VOLCFNET, VOLCFNET.prev, VOLCFNET.mid, VOLCFNET.beg, COMPONENT, REMPER, 2) * tDI,
           VOLCFNET1 = vrAttHelper(VOLCFNET, VOLCFNET.prev, VOLCFNET.mid, VOLCFNET.beg, COMPONENT, REMPER, 1) * tDI,
           DRYBIO_AG2 = vrAttHelper(DRYBIO_AG, DRYBIO_AG.prev, DRYBIO_AG.mid, DRYBIO_AG.beg, COMPONENT, REMPER, 2) * tDI,
           DRYBIO_AG1 = vrAttHelper(DRYBIO_AG, DRYBIO_AG.prev, DRYBIO_AG.mid, DRYBIO_AG.beg, COMPONENT, REMPER, 1) * tDI) %>%
    # ## Omitting columns where either time is an NA
    # mutate(DIA2 = case_when(is.na(DIA1) ~ NA_real_, TRUE ~ DIA2),
    #        DIA1 = case_when(is.na(DIA2) ~ NA_real_, TRUE ~ DIA1),
    #        BA2 = case_when(is.na(BA1) ~ NA_real_, TRUE ~ BA2),
    #        BA1 = case_when(is.na(BA2) ~ NA_real_, TRUE ~ BA1),
    #        VOLCFNET2 = case_when(is.na(VOLCFNET1) ~ NA_real_, TRUE ~ VOLCFNET2),
    #        VOLCFNET1 = case_when(is.na(VOLCFNET2) ~ NA_real_, TRUE ~ VOLCFNET1),
    #        DRYBIO_AG2 = case_when(is.na(DRYBIO_AG1) ~ NA_real_, TRUE ~ DRYBIO_AG2),
    #        DRYBIO_AG1 = case_when(is.na(DRYBIO_AG2) ~ NA_real_, TRUE ~ DRYBIO_AG1)) %>%
    select(-c(DIA.mid, VOLCFNET.mid, VOLCSNET.mid, DRYBIO_AG.mid,
              DIA.prev, VOLCFNET.prev, VOLCSNET.prev, DRYBIO_AG.prev,
              DIA.beg, VOLCFNET.beg, VOLCSNET.beg, DRYBIO_AG.beg,
              DIA, VOLCFNET, VOLCSNET, DRYBIO_AG))

  ## Just what we need
  data <- data %>%
    select(PLT_CN, TRE_CN, SUBP, CONDID, TREE, tDI,
           grpP, grpC, grpT, TPAGROW_UNADJ, PROP_BASIS, SUBPTYP_GRM, PLOT_STATUS_CD,
           DIA2, DIA1, BA2, BA1, DRYBIO_AG2, DRYBIO_AG1, VOLCFNET2, VOLCFNET1, MEASYEAR) %>%
    ## Dropping NA columns
    #drop_na(SUBPTYP_PROP_CHNG) %>%
    ## Rearrange previous values as observations
    pivot_longer(cols = DIA2:VOLCFNET1,
                 names_to = c(".value", 'ONEORTWO'),
                 names_sep = -1)

  ### DOING AREA SEPARATELY NOW FOR GROWTH ACCOUNTING PLOTS
  aData <- select(db$PLOT,c('PLT_CN', 'STATECD', 'MACRO_BREAKPOINT_DIA', 'INVYR', 'MEASYEAR', 'PLOT_STATUS_CD', 'PREV_PLT_CN', 'REMPER', grpP, 'aD_p', 'sp')) %>%
    left_join(select(db$SUBP_COND_CHNG_MTRX, PLT_CN, PREV_PLT_CN, SUBPTYP, SUBPTYP_PROP_CHNG, PREVCOND, CONDID), by = c('PLT_CN', 'PREV_PLT_CN')) %>%
    left_join(select(db$COND, c('PLT_CN', 'CONDPROP_UNADJ', 'PROP_BASIS', 'COND_STATUS_CD', 'CONDID', grpC, 'aD_c', 'landD')), by = c('PLT_CN', 'CONDID')) %>%
    left_join(select(db$COND, c('PLT_CN', 'PROP_BASIS', 'COND_STATUS_CD', 'CONDID', grpC, 'aD_c', 'landD')), by = c('PREV_PLT_CN' = 'PLT_CN', 'PREVCOND' = 'CONDID'), suffix = c('', '.prev')) %>%
    #left_join(select(db$POP_PLOT_STRATUM_ASSGN, by = 'PLT_CN')) %>%
    #left_join(select(db$POP_STRATUM, by = c('STRATUM_CN' = 'CN'))) %>%
    mutate(aChng = if_else(COND_STATUS_CD == 1 &
                             COND_STATUS_CD.prev == 1 &
                             !is.null(CONDPROP_UNADJ) &
                             SUBPTYP == 1,
                           1, 0),
           SUBPTYP_PROP_CHNG = SUBPTYP_PROP_CHNG * .25)

  aData$aDI <- aData$landD * aData$landD.prev * aData$aD_p * aData$aD_c * aData$sp * aData$aChng


  if (byPlot){
    grpBy <- c('YEAR', grpBy, 'PLOT_STATUS_CD')
    t <- data %>%
      mutate(YEAR = MEASYEAR) %>%
      distinct(PLT_CN, SUBP, TREE, ONEORTWO, .keep_all = TRUE) %>%
      group_by(.dots = grpBy[grpBy %in% c('SUBP', 'TREE') == FALSE], PLT_CN, SUBP, TREE) %>%
      summarize(d = sum(DIA * tDI, na.rm = TRUE),
                ba = sum(BA * tDI, na.rm = TRUE),
                baa = sum(TPAGROW_UNADJ * BA * tDI, na.rm = TRUE),
                vol = sum(VOLCFNET * tDI, na.rm = TRUE),
                volA = sum(TPAGROW_UNADJ * VOLCFNET * tDI, na.rm = TRUE),
                bio = sum(DRYBIO_AG * tDI, na.rm = TRUE),
                bioA = sum(TPAGROW_UNADJ * DRYBIO_AG * tDI, na.rm = TRUE)) %>%
      # Compute estimates at plot level
      group_by(.dots = grpBy, PLT_CN) %>%
      summarize(DIA_GROW = mean(d, na.rm = TRUE),
                BA_GROW = mean(ba, na.rm = TRUE),
                BAA_GROW = sum(baa, na.rm = TRUE),
                NETVOL_GROW = mean(vol, na.rm = TRUE),
                NETVOL_GROW_AC = sum(volA, na.rm = TRUE),
                BIO_GROW = mean(vol, na.rm = TRUE),
                BIO_GROW_AC = sum(volA, na.rm = TRUE),
                nStems = length(which(!is.na(d))))

    a = NULL

  } else {
    ### Plot-level estimates -- growth accounting
    a <- aData %>%
      #filter(SUBPTYP_GRM == 1) %>%
      ## Adding PROP_BASIS so we can handle adjustment factors at strata level
      group_by(PLT_CN, PROP_BASIS, .dots = aGrpBy) %>%
      summarize(fa = sum(SUBPTYP_PROP_CHNG * aDI, na.rm = TRUE),
                plotIn = ifelse(sum(aDI >  0, na.rm = TRUE), 1,0))
    # ### Plot-level estimates
    # a <- data %>%
    #   ## Will be lots of trees here, so CONDPROP listed multiple times
    #   ## Adding PROP_BASIS so we can handle adjustment factors at strata level
    #   distinct(PLT_CN, CONDID, .keep_all = TRUE) %>%
    #   group_by(PLT_CN, PROP_BASIS, .dots = aGrpBy) %>%
    #   summarize(fa = sum(CONDPROP_UNADJ * aDI, na.rm = TRUE),
    #             plotIn = ifelse(sum(aDI >  0, na.rm = TRUE), 1,0)) %>%
    #   left_join(select(a_ga, PLT_CN, PROP_BASIS, aGrpBy, fa_ga, plotIn_ga), by = c('PLT_CN', 'PROP_BASIS', aGrpBy))

    t <- data %>%
      distinct(PLT_CN, SUBP, TREE, ONEORTWO, .keep_all = TRUE) %>%
      group_by(.dots = grpBy, PLT_CN, SUBPTYP_GRM) %>%
      summarize(tPlot = sum(TPAGROW_UNADJ  * tDI, na.rm = TRUE),
                dPlot = sum(DIA  * tDI, na.rm = TRUE),
                bPlot = sum(BA  * tDI, na.rm = TRUE),
                baaPlot = sum(TPAGROW_UNADJ * BA  * tDI, na.rm = TRUE),
                gPlot = sum(VOLCFNET  * tDI, na.rm = TRUE),
                gaPlot = sum(TPAGROW_UNADJ *VOLCFNET  * tDI, na.rm = TRUE),
                bioPlot = sum(DRYBIO_AG * tDI / 2000, na.rm = TRUE),
                bioAPlot = sum(TPAGROW_UNADJ * DRYBIO_AG * tDI / 2000, na.rm = TRUE),
                plotIn_t = ifelse(sum(tDI, na.rm = TRUE) > 0, 1,0))
  }




  pltOut <- list(a = a, t = t)
  return(pltOut)

}



vrHelper2 <- function(x, popState, a, t, grpBy, aGrpBy, method){

  ## DOES NOT MODIFY OUTSIDE ENVIRONMENT
  if (str_to_upper(method) %in% c("SMA", 'EMA', 'LMA', 'ANNUAL')) {
    grpBy <- c(grpBy, 'INVYR')
    aGrpBy <- c(aGrpBy, 'INVYR')
    popState[[x]]$P2POINTCNT <- popState[[x]]$P2POINTCNT_INVYR
    popState[[x]]$p2eu <- popState[[x]]$p2eu_INVYR

  }

  ## Strata level estimates
  aStrat <- a %>%
    ## Rejoin with population tables
    right_join(select(popState[[x]], -c(STATECD)), by = 'PLT_CN') %>%
    filter(EVAL_TYP %in% c('EXPGROW')) %>%
    #filter(EVAL_TYP %in% c('EXPCURR')) %>%
    mutate(
      ## AREA
      aAdj = case_when(
        ## When NA, stay NA
        is.na(PROP_BASIS) ~ NA_real_,
        ## If the proportion was measured for a macroplot,
        ## use the macroplot value
        PROP_BASIS == 'MACR' ~ as.numeric(ADJ_FACTOR_MACR),
        ## Otherwise, use the subpplot value
        PROP_BASIS == 'SUBP' ~ ADJ_FACTOR_SUBP),
      fa = fa * aAdj) %>%
    group_by(ESTN_UNIT_CN, ESTN_METHOD, STRATUM_CN, .dots = aGrpBy) %>%
    summarize(a_t = length(unique(PLT_CN)) / first(P2POINTCNT),
              aStrat = mean(fa * a_t, na.rm = TRUE),
              plotIn_AREA = sum(plotIn, na.rm = TRUE),
              n = n(),
              ## We don't want a vector of these values, since they are repeated
              nh = first(P2POINTCNT),
              a = first(AREA_USED),
              w = first(P1POINTCNT) / first(P1PNTCNT_EU),
              p2eu = first(p2eu),
              ndif = nh - n,
              ## Strata level variances
              av = stratVar(ESTN_METHOD, fa, aStrat, ndif, a, nh))
  ## Estimation unit
  aEst <- aStrat %>%
    group_by(ESTN_UNIT_CN, .dots = aGrpBy) %>%
    summarize(aEst = unitMean(ESTN_METHOD, a, nh,  w, aStrat),
              aVar = unitVarNew(method = 'var', ESTN_METHOD, a, nh, first(p2eu), w, av, aStrat, aEst),
              plotIn_AREA = sum(plotIn_AREA, na.rm = TRUE))

  ######## ------------------ TREE ESTIMATES + CV

  ## Strata level estimates
  tEst <- t %>%
    ## Rejoin with population tables
    right_join(select(popState[[x]], -c(STATECD)), by = 'PLT_CN') %>%
    filter(EVAL_TYP %in% c('EXPGROW')) %>%
    ## Need this for covariance later on
    left_join(select(a, fa, PLT_CN, PROP_BASIS, aGrpBy[aGrpBy %in% c('YEAR', 'INVYR') == FALSE]), by = c('PLT_CN', aGrpBy[aGrpBy %in% c('YEAR', 'INVYR') == FALSE])) %>%
    #Add adjustment factors
    mutate(tAdj = case_when(
      ## When NA, stay NA
      is.na(SUBPTYP_GRM) ~ NA_real_,
      ## If the proportion was measured for a macroplot,
      ## use the macroplot value
      SUBPTYP_GRM == 0 ~ 0,
      SUBPTYP_GRM == 1 ~ as.numeric(ADJ_FACTOR_SUBP),
      SUBPTYP_GRM == 2 ~ as.numeric(ADJ_FACTOR_MICR),
      SUBPTYP_GRM == 3 ~ as.numeric(ADJ_FACTOR_MACR)),
      ## AREA
      aAdj = case_when(
        ## When NA, stay NA
        is.na(PROP_BASIS) ~ NA_real_,
        ## If the proportion was measured for a macroplot,
        ## use the macroplot value
        PROP_BASIS == 'MACR' ~ as.numeric(ADJ_FACTOR_MACR),
        ## Otherwise, use the subpplot value
        PROP_BASIS == 'SUBP' ~ ADJ_FACTOR_SUBP),
      fa = fa * aAdj,
      tPlot = tPlot * tAdj,
      dPlot = dPlot * tAdj,
      bPlot = bPlot * tAdj,
      baaPlot = baaPlot * tAdj,
      gPlot = gPlot * tAdj,
      gaPlot = gaPlot * tAdj,
      bioPlot = bioPlot * tAdj,
      bioAPlot = bioAPlot * tAdj) %>%
    ## Extra step for variance issues
    group_by(ESTN_UNIT_CN, ESTN_METHOD, STRATUM_CN, PLT_CN, .dots = grpBy) %>%
    summarize(tPlot = sum(tPlot, na.rm = TRUE),
              dPlot = sum(dPlot, na.rm = TRUE),
              bPlot = sum(bPlot, na.rm = TRUE),
              baaPlot = sum(baaPlot, na.rm = TRUE),
              gPlot = sum(gPlot, na.rm = TRUE),
              gaPlot = sum(gaPlot, na.rm = TRUE),
              bioPlot = sum(bioPlot, na.rm = TRUE),
              bioAPlot = sum(bioAPlot, na.rm = TRUE),
              fa = first(fa),
              plotIn_TREE = ifelse(sum(plotIn_t >  0, na.rm = TRUE), 1,0),
              nh = first(P2POINTCNT),
              p2eu = first(p2eu),
              a = first(AREA_USED),
              w = first(P1POINTCNT) / first(P1PNTCNT_EU)) %>%
    ## Joining area data so we can compute ratio variances
    left_join(select(aStrat, aStrat, av, ESTN_UNIT_CN, STRATUM_CN, ESTN_METHOD, aGrpBy), by = c('ESTN_UNIT_CN', 'ESTN_METHOD', 'STRATUM_CN', aGrpBy)) %>%
    ## Strata level
    group_by(ESTN_UNIT_CN, ESTN_METHOD, STRATUM_CN, .dots = grpBy) %>%
    summarize(r_t = length(unique(PLT_CN)) / first(nh),
              tStrat = mean(tPlot * r_t, na.rm = TRUE),
              dStrat = mean(dPlot * r_t, na.rm = TRUE),
              bStrat = mean(bPlot * r_t, na.rm = TRUE),
              baaStrat = mean(baaPlot * r_t, na.rm = TRUE),
              gStrat = mean(gPlot * r_t, na.rm = TRUE),
              gaStrat = mean(gaPlot * r_t, na.rm = TRUE),
              bioStrat = mean(bioPlot * r_t, na.rm = TRUE),
              bioAStrat = mean(bioAPlot * r_t, na.rm = TRUE),
              aStrat = first(aStrat),
              plotIn_TREE = sum(plotIn_TREE, na.rm = TRUE),
              n = n(),
              ## We don't want a vector of these values, since they are repeated
              nh = first(nh),
              a = first(a),
              w = first(w),
              p2eu = first(p2eu),
              ndif = nh - n,
              # ## Strata level variances
              tv = stratVar(ESTN_METHOD, tPlot, tStrat, ndif, a, nh),
              dv = stratVar(ESTN_METHOD, dPlot, dStrat, ndif, a, nh),
              bv = stratVar(ESTN_METHOD, bPlot, bStrat, ndif, a, nh),
              baav = stratVar(ESTN_METHOD, baaPlot, baaStrat, ndif, a, nh),
              gv = stratVar(ESTN_METHOD, gPlot, gStrat, ndif, a, nh),
              gav = stratVar(ESTN_METHOD, gaPlot, gaStrat, ndif, a, nh),
              biov = stratVar(ESTN_METHOD, bioPlot, bioStrat, ndif, a, nh),
              bioAv = stratVar(ESTN_METHOD, bioAPlot, bioAStrat, ndif, a, nh),
              # Strata level covariances
              cvStrat_d = stratVar(ESTN_METHOD, dPlot, dStrat, ndif, a, nh, tPlot, tStrat),
              cvStrat_b = stratVar(ESTN_METHOD, bPlot, bStrat, ndif, a, nh, tPlot, tStrat),
              cvStrat_baa = stratVar(ESTN_METHOD, baaPlot, baaStrat, ndif, a, nh, fa, aStrat),
              cvStrat_g = stratVar(ESTN_METHOD, gPlot, gStrat, ndif, a, nh, tPlot, tStrat),
              cvStrat_ga = stratVar(ESTN_METHOD, gaPlot, gaStrat, ndif, a, nh, fa, aStrat),
              cvStrat_bio = stratVar(ESTN_METHOD, bioPlot, bioStrat, ndif, a, nh, tPlot, tStrat),
              cvStrat_bioA = stratVar(ESTN_METHOD, bioAPlot, bioAStrat, ndif, a, nh, fa, aStrat)

    ) %>%

    ## Estimation unit
    left_join(select(aEst, ESTN_UNIT_CN, aEst, aVar, aGrpBy), by = c('ESTN_UNIT_CN', aGrpBy)) %>%
    group_by(ESTN_UNIT_CN, .dots = grpBy) %>%
    summarize(tEst = unitMean(ESTN_METHOD, a, nh, w, tStrat),
              dEst = unitMean(ESTN_METHOD, a, nh, w, dStrat),
              bEst = unitMean(ESTN_METHOD, a, nh, w, bStrat),
              baaEst = unitMean(ESTN_METHOD, a, nh, w, baaStrat),
              gEst = unitMean(ESTN_METHOD, a, nh, w, gStrat),
              gaEst = unitMean(ESTN_METHOD, a, nh, w, gaStrat),
              bioEst = unitMean(ESTN_METHOD, a, nh, w, bioStrat),
              bioAEst = unitMean(ESTN_METHOD, a, nh, w, bioAStrat),

              N = first(p2eu),
              #aEst = first(aEst),
              # Estimation of unit variance
              tVar = unitVarNew(method = 'var', ESTN_METHOD, a, nh, first(p2eu), w, tv, tStrat, tEst),
              dVar = unitVarNew(method = 'var', ESTN_METHOD, a, nh, first(p2eu), w, dv, dStrat, dEst),
              bVar = unitVarNew(method = 'var', ESTN_METHOD, a, nh, first(p2eu), w, bv, bStrat, bEst),
              baaVar = unitVarNew(method = 'var', ESTN_METHOD, a, nh, first(p2eu), w, baav, baaStrat, baaEst),
              gVar = unitVarNew(method = 'var', ESTN_METHOD, a, nh, first(p2eu), w, gv, gStrat, gEst),
              gaVar = unitVarNew(method = 'var', ESTN_METHOD, a, nh, first(p2eu), w, gav, gaStrat, gaEst),
              bioVar = unitVarNew(method = 'var', ESTN_METHOD, a, nh, first(p2eu), w, biov, bioStrat, bioEst),
              bioAVar = unitVarNew(method = 'var', ESTN_METHOD, a, nh, first(p2eu), w, bioAv, bioAStrat, bioAEst),

              cvEst_d = unitVarNew(method = 'cov', ESTN_METHOD, a, nh, first(p2eu), w, cvStrat_d, dStrat, dEst, tStrat, tEst),
              cvEst_b = unitVarNew(method = 'cov', ESTN_METHOD, a, nh, first(p2eu), w, cvStrat_b, bStrat, bEst, tStrat, tEst),
              cvEst_g = unitVarNew(method = 'cov', ESTN_METHOD, a, nh, first(p2eu), w, cvStrat_g, gStrat, gEst, tStrat, tEst),
              cvEst_bio = unitVarNew(method = 'cov', ESTN_METHOD, a, nh, first(p2eu), w, cvStrat_bio, bioStrat, bioEst, tStrat, tEst),
              cvEst_baa = unitVarNew(method = 'cov', ESTN_METHOD, a, nh, first(p2eu), w, cvStrat_baa, baaStrat, baaEst, aStrat, aEst),
              cvEst_ga = unitVarNew(method = 'cov', ESTN_METHOD, a, nh, first(p2eu), w, cvStrat_ga, gaStrat, gaEst, aStrat, aEst),
              cvEst_bioA = unitVarNew(method = 'cov', ESTN_METHOD, a, nh, first(p2eu), w, cvStrat_bioA, bioAStrat, bioAEst, aStrat, aEst),
              plotIn_TREE = sum(plotIn_TREE, na.rm = TRUE))

  out <- list(tEst = tEst, aEst = aEst)

  return(out)
}


























vitalRatesHelper <- function(x, combos, data, grpBy, aGrpBy, totals, SE, chngAdj){
  # Update domain indicator for each each column speficed in grpBy
  td = 1 # Start both at 1, update as we iterate through
  ad = 1
  for (n in 1:ncol(combos[[x]])){
    # Tree domain indicator for each column in
    tObs <- as.character(combos[[x]][[grpBy[n]]]) == as.character(data[[grpBy[n]]])
    if (length(which(is.na(tObs))) == length(tObs)) tObs <- 1
    td <-  tObs * td * data$tDI
    # Area domain indicator for each column in
    if(grpBy[n] %in% aGrpBy){
      aObs <- as.character(combos[[x]][[aGrpBy[n]]]) == as.character(data[[aGrpBy[n]]])
      if (length(which(is.na(aObs))) == length(aObs)) aObs <- 1
      aObs[is.na(aObs)] <- 0
      ad <- data$aDI * aObs * ad
    }
  }



  if(SE){
    data$tDI <- td
    data$tDI[is.na(data$tDI)] <- 0
    data$aDI <- ad
    data$aDI[is.na(data$aDI)] <- 0
    ## We produce an intermediate object in this chain as it is needed to compute the ratio of means variance
    ## Numerator and denominator are in different domains of interest, and may be grouped by different variables
    ## see covariance estimation below
    ### Compute total TREES in domain of interest

    tInt <- data %>%
      distinct(ESTN_UNIT_CN, STRATUM_CN, PLT_CN, TRE_CN, ONEORTWO, .keep_all = TRUE) %>%
      ## Plot level estimates
      # ## Omitting columns where either time is an NA
      group_by(ESTN_UNIT_CN, ESTN_METHOD, STRATUM_CN, PLT_CN) %>%
      summarize(tPlot = sum(TPAGROW_UNADJ * tAdj * tDI, na.rm = TRUE),
                dPlot = sum(DIA * tAdj * tDI, na.rm = TRUE),
                bPlot = sum(BA * tAdj * tDI, na.rm = TRUE),
                baaPlot = sum(TPAGROW_UNADJ * BA * tAdj * tDI, na.rm = TRUE),
                gPlot = sum(VOLCFNET * tAdj * tDI, na.rm = TRUE),
                gaPlot = sum(TPAGROW_UNADJ *VOLCFNET * tAdj * tDI, na.rm = TRUE),
                bioPlot = sum(DRYBIO_AG* tAdj * tDI / 2000, na.rm = TRUE),
                bioAPlot = sum(TPAGROW_UNADJ * DRYBIO_AG* tAdj * tDI / 2000, na.rm = TRUE),
                plotIn_t = ifelse(sum(tDI, na.rm = TRUE) > 0, 1,0),
                a = first(AREA_USED),
                p1EU = first(P1PNTCNT_EU),
                p1 = first(P1POINTCNT),
                p2 = first(P2POINTCNT))

    ### Compute total AREA in the domain of interest
    aInt <- data %>%
      distinct(ESTN_UNIT_CN, STRATUM_CN, PLT_CN, SUBP, CONDID, .keep_all = TRUE) %>%
      group_by(ESTN_UNIT_CN, ESTN_METHOD, STRATUM_CN, PLT_CN) %>%
      summarize(fa = sum(SUBPTYP_PROP_CHNG * chngAdj * aDI * aAdj, na.rm = TRUE),
                plotIn_a = ifelse(sum(aDI, na.rm = TRUE) >  0, 1,0),
                a = first(AREA_USED),
                p1EU = first(P1PNTCNT_EU),
                p1 = first(P1POINTCNT),
                p2 = first(P2POINTCNT))

    ## Compute COVARIANCE between numerator and denominator (for ratio estimates of variance)
    t <- tInt %>%
      #inner_join(aInt, by = c('PLT_CN', 'ESTN_UNIT_CN', 'ESTN_METHOD', 'STRATUM_CN'), suffix = c('_t', '_a')) %>%
      left_join(aInt, by = c('ESTN_UNIT_CN', 'ESTN_METHOD', 'STRATUM_CN', 'PLT_CN'), suffix = c('_t', '_a'))  %>%
      group_by(ESTN_UNIT_CN, ESTN_METHOD, STRATUM_CN) %>%
      summarize(tStrat = mean(tPlot, na.rm = TRUE),
                dStrat = mean(dPlot, na.rm = TRUE),
                bStrat = mean(bPlot, na.rm = TRUE),
                baaStrat = mean(baaPlot, na.rm = TRUE),
                #htStrat = mean(htPlot, na.rm = TRUE),
                gStrat = mean(gPlot, na.rm = TRUE),
                gaStrat = mean(gaPlot, na.rm = TRUE),
                #sStrat = mean(sPlot, na.rm = TRUE),
                #saStrat = mean(saPlot, na.rm = TRUE),
                bioStrat = mean(bioPlot, na.rm = TRUE),
                bioaStrat = mean(bioAPlot, na.rm = TRUE),
                #carbStrat = mean(carbPlot, na.rm = TRUE),
                #carbaStrat = mean(carbAPlot, na.rm = TRUE),
                aStrat = mean(fa, na.rm = TRUE),
                a = first(a_t),
                w = first(p1_t) / first(p1EU_a), # Stratum weight
                nh = first(p2_t), # Number plots in stratum
                nPlots_TREE = sum(plotIn_t, na.rm = TRUE),
                nPlots_AREA = sum(plotIn_a, na.rm = TRUE),
                # Strata level variances
                tv = ifelse(first(ESTN_METHOD == 'simple'),
                            var(tPlot * first(a) / nh),
                            (sum(tPlot^2) - sum(nh * tStrat^2)) / (nh * (nh-1))), # Stratified and double cases
                dv = ifelse(first(ESTN_METHOD == 'simple'),
                            var(dPlot * first(a) / nh),
                            (sum(dPlot^2) - sum(nh * dStrat^2)) / (nh * (nh-1))),
                bv = ifelse(first(ESTN_METHOD == 'simple'),
                            var(bPlot * first(a) / nh),
                            (sum(bPlot^2) - sum(nh * bStrat^2)) / (nh * (nh-1))),
                baav = ifelse(first(ESTN_METHOD == 'simple'),
                              var(baaPlot * first(a) / nh),
                              (sum(baaPlot^2) - sum(nh * baaStrat^2)) / (nh * (nh-1))),
                # htv = ifelse(first(ESTN_METHOD == 'simple'),
                #              var(htPlot * first(a) / nh),
                #              (sum(htPlot^2) - sum(nh * htStrat^2)) / (nh * (nh-1))),
                gv = ifelse(first(ESTN_METHOD == 'simple'),
                            var(gPlot * first(a) / nh),
                            (sum(gPlot^2) - sum(nh * gStrat^2)) / (nh * (nh-1))),
                gav = ifelse(first(ESTN_METHOD == 'simple'),
                             var(gaPlot * first(a) / nh),
                             (sum(gaPlot^2) - sum(nh * gaStrat^2)) / (nh * (nh-1))),
                # sv = ifelse(first(ESTN_METHOD == 'simple'),
                #             var(sPlot * first(a) / nh),
                #             (sum(sPlot^2) - sum(nh * sStrat^2)) / (nh * (nh-1))),
                # sav = ifelse(first(ESTN_METHOD == 'simple'),
                #              var(saPlot * first(a) / nh),
                #              (sum(saPlot^2) - sum(nh * saStrat^2)) / (nh * (nh-1))),
                biov = ifelse(first(ESTN_METHOD == 'simple'),
                              var(bioPlot * first(a) / nh),
                              (sum(bioPlot^2) - sum(nh * bioStrat^2)) / (nh * (nh-1))),
                bioav = ifelse(first(ESTN_METHOD == 'simple'),
                               var(bioAPlot * first(a) / nh),
                               (sum(bioAPlot^2) - sum(nh * bioaStrat^2)) / (nh * (nh-1))),
                # carbv = ifelse(first(ESTN_METHOD == 'simple'),
                #             var(carbPlot * first(a) / nh),
                #             (sum(carbPlot^2) - sum(nh * carbStrat^2)) / (nh * (nh-1))),
                # carbav = ifelse(first(ESTN_METHOD == 'simple'),
                #              var(carbAPlot * first(a) / nh),
                #              (sum(carbAPlot^2) - sum(nh * carbaStrat^2)) / (nh * (nh-1))),
                av = ifelse(first(ESTN_METHOD == 'simple'),
                            var(fa * first(a) / nh),
                            (sum(fa^2) - sum(nh * aStrat^2)) / (nh * (nh-1))),
                # Strata level covariances
                cvStrat_d = ifelse(first(ESTN_METHOD == 'simple'),
                                   cov(tPlot,dPlot),
                                   (sum(tPlot*dPlot) - sum(nh * tStrat *dStrat)) / (nh * (nh-1))), # Stratified and double casesc
                cvStrat_b = ifelse(first(ESTN_METHOD == 'simple'),
                                   cov(tPlot,bPlot),
                                   (sum(tPlot*bPlot) - sum(nh * tStrat *bStrat)) / (nh * (nh-1))), # Stratified and double cases
                cvStrat_baa = ifelse(first(ESTN_METHOD == 'simple'),
                                     cov(fa,baaPlot),
                                     (sum(fa*baaPlot) - sum(nh * aStrat *baaStrat)) / (nh * (nh-1))),
                # cvStrat_ht = ifelse(first(ESTN_METHOD == 'simple'),
                #                     cov(tPlot,htPlot),
                #                     (sum(tPlot*htPlot) - sum(nh * tStrat *htStrat)) / (nh * (nh-1))), # Stratified and double case
                cvStrat_g = ifelse(first(ESTN_METHOD == 'simple'),
                                   cov(tPlot,gPlot),
                                   (sum(tPlot*gPlot) - sum(nh * tStrat *gStrat)) / (nh * (nh-1))),
                cvStrat_ga = ifelse(first(ESTN_METHOD == 'simple'),
                                    cov(fa,gaPlot),
                                    (sum(fa*gaPlot) - sum(nh * aStrat *gaStrat)) / (nh * (nh-1))),
                # cvStrat_s = ifelse(first(ESTN_METHOD == 'simple'),
                #                    cov(tPlot,sPlot),
                #                    (sum(tPlot*sPlot) - sum(nh * tStrat *sStrat)) / (nh * (nh-1))),
                # cvStrat_sa = ifelse(first(ESTN_METHOD == 'simple'),
                #                     cov(fa,saPlot),
                #                     (sum(fa*saPlot) - sum(nh * aStrat *saStrat)) / (nh * (nh-1))),
                cvStrat_bio = ifelse(first(ESTN_METHOD == 'simple'),
                                     cov(tPlot,bioPlot),
                                     (sum(tPlot*bioPlot) - sum(nh * tStrat *bioStrat)) / (nh * (nh-1))),
                cvStrat_bioa = ifelse(first(ESTN_METHOD == 'simple'),
                                      cov(fa,bioAPlot),
                                      (sum(fa*bioAPlot) - sum(nh * aStrat *bioaStrat)) / (nh * (nh-1))),
                # cvStrat_carb = ifelse(first(ESTN_METHOD == 'simple'),
                #                    cov(tPlot,carbPlot),
                #                    (sum(tPlot*carbPlot) - sum(nh * tStrat *carbStrat)) / (nh * (nh-1))),
                # cvStrat_carba = ifelse(first(ESTN_METHOD == 'simple'),
                #                     cov(fa,carbAPlot),
                #                     (sum(fa*carbAPlot) - sum(nh * aStrat *carbaStrat)) / (nh * (nh-1)))
      ) %>%
      # Estimation Unit
      group_by(ESTN_UNIT_CN) %>%
      summarize(## Totals
                tEst = unitMean(ESTN_METHOD, a, nh, w, tStrat),
                dEst = unitMean(ESTN_METHOD, a, nh, w, dStrat),
                bEst = unitMean(ESTN_METHOD, a, nh, w, bStrat),
                baaEst = unitMean(ESTN_METHOD, a, nh, w, baaStrat),
                gEst = unitMean(ESTN_METHOD, a, nh, w, gStrat),
                gaEst = unitMean(ESTN_METHOD, a, nh, w, gaStrat),
                bioEst = unitMean(ESTN_METHOD, a, nh, w, bioStrat),
                bioaEst = unitMean(ESTN_METHOD, a, nh, w, bioaStrat),
                aEst = unitMean(ESTN_METHOD, a, nh, w, aStrat),
                nPlots_TREE = sum(nPlots_TREE, na.rm = TRUE),
                nPlots_AREA = sum(nPlots_AREA, na.rm = TRUE),
                ## Variance estimates -- totals
                tVar = unitVar(method = 'var', ESTN_METHOD, a, nh, w, tv, tStrat, tEst),
                dVar = unitVar(method = 'var', ESTN_METHOD, a, nh, w, dv, dStrat, dEst),
                bVar = unitVar(method = 'var', ESTN_METHOD, a, nh, w, bv, bStrat, bEst),
                baaVar = unitVar(method = 'var', ESTN_METHOD, a, nh, w, baav, baaStrat, baaEst),
                gVar = unitVar(method = 'var', ESTN_METHOD, a, nh, w, gv, gStrat, gEst),
                gaVar = unitVar(method = 'var', ESTN_METHOD, a, nh, w, gav, gaStrat, gaEst),
                bioVar = unitVar(method = 'var', ESTN_METHOD, a, nh, w, biov, bioStrat, bioEst),
                bioaVar = unitVar(method = 'var', ESTN_METHOD, a, nh, w, bioav, bioaStrat, bioaEst),
                aVar = unitVar(method = 'var', ESTN_METHOD, a, nh, w, av, aStrat, aEst),
                ## Covariance estimates -- ratios
                cvEst_d = unitVar(method = 'cov', ESTN_METHOD, a, nh, w, cvStrat_d, dStrat, dEst, tStrat, tEst),
                cvEst_b = unitVar(method = 'cov', ESTN_METHOD, a, nh, w, cvStrat_b, bStrat, bEst, tStrat, tEst),
                cvEst_baa = unitVar(method = 'cov', ESTN_METHOD, a, nh, w, cvStrat_baa, baaStrat, baaEst, aStrat, aEst),
                cvEst_g = unitVar(method = 'cov', ESTN_METHOD, a, nh, w, cvStrat_g, gStrat, gEst, tStrat, tEst),
                cvEst_ga = unitVar(method = 'cov', ESTN_METHOD, a, nh, w, cvStrat_ga, gaStrat, gaEst, aStrat, aEst),
                cvEst_bio = unitVar(method = 'cov', ESTN_METHOD, a, nh, w, cvStrat_bio, bioStrat, bioEst, tStrat, tEst),
                cvEst_bioa = unitVar(method = 'cov', ESTN_METHOD, a, nh, w, cvStrat_bioa, bioaStrat, bioaEst, aStrat, aEst)
      ) %>%
      ## Full region
      summarize(TREE_TOTAL = sum(tEst, na.rm = TRUE),
                DIA_TOTAL = sum(dEst, na.rm = TRUE),
                BA_TOTAL = sum(bEst, na.rm = TRUE),
                BAA_TOTAL = sum(baaEst, na.rm = TRUE),
                NETVOL_TOTAL = sum(gEst, na.rm = TRUE),
                NETVOL_AC_TOT = sum(gaEst, na.rm = TRUE),
                BIO_TOTAL = sum(bioEst, na.rm = TRUE),
                BIO_AC_TOT = sum(bioaEst, na.rm = TRUE),
                AREA_TOTAL = sum(aEst, na.rm = TRUE),
                DIA_GROW = DIA_TOTAL / TREE_TOTAL,
                BA_GROW = BA_TOTAL / TREE_TOTAL,
                BAA_GROW = BAA_TOTAL / AREA_TOTAL,
                NETVOL_GROW = NETVOL_TOTAL / TREE_TOTAL,
                NETVOL_GROW_AC = NETVOL_AC_TOT / AREA_TOTAL,
                BIO_GROW = BIO_TOTAL / TREE_TOTAL,
                BIO_GROW_AC = BIO_AC_TOT / AREA_TOTAL,
                # Variance/covariance
                treeVar = sum(tVar, na.rm = TRUE),
                dVar = sum(dVar, na.rm = TRUE),
                bVar = sum(bVar, na.rm = TRUE),
                baaVar = sum(baaVar, na.rm = TRUE),
                gVar = sum(gVar, na.rm = TRUE),
                gaVar = sum(gaVar, na.rm = TRUE),
                bioVar = sum(bioVar, na.rm = TRUE),
                bioaVar = sum(bioaVar, na.rm = TRUE),
                aVar = sum(aVar, na.rm = TRUE),
                cvD = sum(cvEst_d, na.rm = TRUE),
                cvB = sum(cvEst_b, na.rm = TRUE),
                cvBAA = sum(cvEst_baa, na.rm = TRUE),
                cvG = sum(cvEst_g, na.rm = TRUE),
                cvGA = sum(cvEst_ga, na.rm = TRUE),
                cvBIO = sum(cvEst_bio, na.rm = TRUE),
                cvBIOA = sum(cvEst_bioa, na.rm = TRUE),
                dgVar = (1/TREE_TOTAL^2) * (dVar + (DIA_GROW^2 * treeVar) - 2 * DIA_GROW * cvD),
                bgVar = (1/TREE_TOTAL^2) * (bVar + (BA_GROW^2 * treeVar) - 2 * BA_GROW * cvB),
                baagVar = (1/AREA_TOTAL^2) * (baaVar + (BAA_GROW^2 * aVar) - 2 * DIA_GROW * cvBAA),
                ggVar = (1/TREE_TOTAL^2) * (gVar + (NETVOL_GROW^2 * treeVar) - 2 * NETVOL_GROW * cvG),
                gagVar = (1/AREA_TOTAL^2) * (gaVar + (NETVOL_GROW_AC^2 * aVar) - 2 * NETVOL_GROW_AC * cvGA),
                biogVar = (1/TREE_TOTAL^2) * (bioVar + (BIO_GROW^2 * treeVar) - 2 * BIO_GROW * cvBIO),
                bioagVar = (1/AREA_TOTAL^2) * (bioaVar + (BIO_GROW_AC^2 * aVar) - 2 * BIO_GROW_AC * cvBIOA),
                # Sampling Errors
                TREE_TOTAL_SE = sqrt(treeVar) / TREE_TOTAL * 100,
                DIA_TOTAL_SE = sqrt(dVar) / abs(DIA_TOTAL) * 100,
                BA_TOTAL_SE = sqrt(bVar) / abs(BA_TOTAL) * 100,
                BAA_TOTAL_SE = sqrt(baaVar) / abs(BA_TOTAL) * 100,
                # HT_TOTAL_SE = sqrt(htVar) / HT_TOTAL * 100,
                NETVOL_TOTAL_SE = sqrt(gVar) / abs(NETVOL_TOTAL) * 100,
                NETVOL_AC_TOT_SE = sqrt(gaVar) / abs(NETVOL_AC_TOT) * 100,
                AREA_TOTAL_SE = sqrt(aVar) / AREA_TOTAL * 100,
                DIA_GROW_SE = sqrt(dgVar) / abs(DIA_GROW) * 100,
                BA_GROW_SE = sqrt(bgVar) / abs(BA_GROW) * 100,
                BAA_GROW_SE = sqrt(baagVar) / abs(BAA_GROW) * 100,
                # HT_GROW_SE = sqrt(htgVar) / HT_GROW * 100,
                NETVOL_GROW_SE = sqrt(ggVar) / abs(NETVOL_GROW) * 100,
                NETVOL_GROW_AC_SE = sqrt(gagVar) / abs(NETVOL_GROW_AC) * 100,
                # SAWVOL_GROW_SE = sqrt(sgVar) / SAWVOL_GROW * 100,
                # SAWVOL_GROW_AC_SE = sqrt(sagVar) / SAWVOL_GROW_AC * 100,
                BIO_GROW_SE = sqrt(biogVar) / abs(BIO_GROW) * 100,
                BIO_GROW_AC_SE = sqrt(bioagVar) / abs(BIO_GROW_AC) * 100,
                # CARB_GROW_SE = sqrt(carbgVar) / CARB_GROW * 100,
                # CARB_GROW_AC_SE = sqrt(carbagVar) / CARB_GROW_AC * 100,
                # Non-zero plots
                nPlots_TREE = sum(nPlots_TREE, na.rm = TRUE),
                nPlots_AREA = sum(nPlots_AREA, na.rm = TRUE))

    # Make some columns go away
    if (totals) {
      t <- t %>%
        select(DIA_GROW, BA_GROW, BAA_GROW, NETVOL_GROW, NETVOL_GROW_AC,
               BIO_GROW, BIO_GROW_AC,
               TREE_TOTAL, DIA_TOTAL, BA_TOTAL, BAA_TOTAL, NETVOL_TOTAL,
               NETVOL_AC_TOT, BIO_TOTAL, BIO_AC_TOT, AREA_TOTAL, DIA_GROW_SE, BA_GROW_SE, BAA_GROW_SE, NETVOL_GROW_SE,
               NETVOL_GROW_AC_SE, BIO_GROW_SE, BIO_GROW_AC_SE,
               nPlots_TREE, nPlots_AREA)
    } else {
      t <- t %>%
        select(DIA_GROW, BA_GROW, BAA_GROW, NETVOL_GROW, NETVOL_GROW_AC,
               BIO_GROW, BIO_GROW_AC,
               DIA_GROW_SE, BA_GROW_SE, BAA_GROW_SE, NETVOL_GROW_SE,
               BIO_GROW_SE, BIO_GROW_AC_SE,
               NETVOL_GROW_AC_SE, nPlots_TREE, nPlots_AREA)
    }
    # Rejoin with some grpBy Names
    t <- data.frame(combos[[x]], t)

  } else { # No sampling errors
    ### BELOW DOES NOT PRODUCE SAMPLING ERRORS, use EXPNS instead (much quicker)
    ### Compute total TREES in domain of interest
    tInt <- data %>%
      distinct(ESTN_UNIT_CN, STRATUM_CN, PLT_CN, TRE_CN, ONEORTWO, .keep_all = TRUE) %>%
      #filter(EVALID %in% tID) %>%
      # Compute estimates at plot level
      group_by(.dots = grpBy, ESTN_UNIT_CN, ESTN_METHOD, STRATUM_CN, PLT_CN) %>%
      summarize(tPlot = sum(TPAGROW_UNADJ * tAdj * tDI * EXPNS, na.rm = TRUE),
                dPlot = sum(DIA * tAdj * tDI * EXPNS, na.rm = TRUE),
                bPlot = sum(BA * tAdj * tDI * EXPNS, na.rm = TRUE),
                baaPlot = sum(TPAGROW_UNADJ * BA * tAdj * tDI * EXPNS, na.rm = TRUE),
                gPlot = sum(VOLCFNET * tAdj * tDI * EXPNS, na.rm = TRUE),
                gaPlot = sum(TPAGROW_UNADJ *VOLCFNET * tAdj * tDI * EXPNS, na.rm = TRUE),
                bioPlot = sum(DRYBIO_AG* tAdj * tDI  * EXPNS/ 2000, na.rm = TRUE),
                bioAPlot = sum(TPAGROW_UNADJ * DRYBIO_AG* tAdj * tDI * EXPNS / 2000, na.rm = TRUE),
                plotIn_t = ifelse(sum(tDI, na.rm = TRUE) > 0, 1,0))
    ### Compute total AREA in the domain of interest
    aInt <- data %>%
      distinct(ESTN_UNIT_CN, STRATUM_CN, PLT_CN, SUBP, CONDID, .keep_all = TRUE) %>%
      group_by(.dots = grpBy, ESTN_UNIT_CN, ESTN_METHOD, STRATUM_CN, PLT_CN) %>%
      summarize(fa = sum(SUBPTYP_PROP_CHNG * chngAdj * aDI * aAdj * EXPNS, na.rm = TRUE),
                plotIn_a = ifelse(sum(aDI >  0, na.rm = TRUE), 1,0))

    suppressMessages({
      t <- tInt %>%
        inner_join(aInt) %>%
        ## Full region
        group_by(.dots = grpBy) %>%
        summarize(TREE_TOTAL = sum(tPlot, na.rm = TRUE),
                  DIA_TOTAL = sum(dPlot, na.rm = TRUE),
                  BA_TOTAL = sum(bPlot, na.rm = TRUE),
                  BAA_TOTAL = sum(baaPlot, na.rm = TRUE),
                  NETVOL_TOTAL = sum(gPlot, na.rm = TRUE),
                  NETVOL_AC_TOT = sum(gaPlot, na.rm = TRUE),
                  BIO_TOTAL = sum(bioPlot, na.rm = TRUE),
                  BIO_AC_TOT = sum(bioAPlot, na.rm = TRUE),
                  AREA_TOTAL = sum(fa, na.rm = TRUE),
                  DIA_GROW = DIA_TOTAL / TREE_TOTAL,
                  BA_GROW = BA_TOTAL / TREE_TOTAL,
                  BAA_GROW = BAA_TOTAL / AREA_TOTAL,
                  NETVOL_GROW = NETVOL_TOTAL / TREE_TOTAL,
                  NETVOL_GROW_AC = NETVOL_AC_TOT / AREA_TOTAL,
                  BIO_GROW = BIO_TOTAL / TREE_TOTAL,
                  BIO_GROW_AC = BIO_TOTAL / AREA_TOTAL,
                  # Non-zero plots
                  nPlots_TREE = sum(plotIn_t, na.rm = TRUE),
                  nPlots_AREA = sum(plotIn_a, na.rm = TRUE)) %>%
        ungroup()
    })

    # Make some columns go away
    if (totals) {
      t <- t %>%
        select(grpBy, DIA_GROW, BA_GROW, BAA_GROW, NETVOL_GROW, NETVOL_GROW_AC,
               BIO_GROW, BIO_GROW_AC,
               TREE_TOTAL, DIA_TOTAL, BA_TOTAL, BAA_TOTAL, NETVOL_TOTAL,
               NETVOL_AC_TOT, BIO_TOTAL, BIO_AC_TOT, AREA_TOTAL,
               nPlots_TREE, nPlots_AREA)
    } else {
      t <- t %>%
        select(grpBy, DIA_GROW, BA_GROW, BAA_GROW, NETVOL_GROW, NETVOL_GROW_AC,
               BIO_GROW, BIO_GROW_AC, nPlots_TREE, nPlots_AREA)
    }

  } # End SE Conditional

  # Some cleanup
  #gc()

  # Return t
  t
}
hunter-stanke/rFIA_TX documentation built on Jan. 1, 2021, 3:22 a.m.