Estimating tree biomass and merchantable volume
Hunter Stanke, Jeffrey W. Doser
2021 (last updated February 7, 2025)
Source:vignettes/biomassVolume.Rmd
biomassVolume.RmdIntroduction
Prior to rFIA v0.3.1, the biomass()
function provided estimates of volume, biomass, and carbon stocks of
standing trees. This is what is described in the introductory
rFIA manuscript (Stanke et
al. 2020.
rFIA v0.3.1 introduced breaking changes to the
biomass() function and how rFIA handles
volume, carbon, and biomass estimation. Specifically, the
biomass() function was overhauled to focus solely on
estimation of tree biomass, providing enhanced flexibility in the
estimation of biomass components (e.g., bole, limbs, coarse
roots, etc.). In addition, v0.3.1 gave rise to the volume()
function, which supersedes and expands upon the previous merchantable
volume estimators implemented in biomass(). Carbon
estimation now lives entirely in the dedicated carbon()
function, which estimates carbon stocks across the full suite of forest
ecosystem carbon pools (e.g., live and dead trees, understory
vegetation, down dead wood, litter, soil organic matter), not just
standing trees; see ?carbon for details.
As of rFIA v1.1.0, the biomass() and
volume() functions now leverage FIA’s new National Scale
Volume and Biomass Estimators (NSVB), which provides a more consistent
and accurate accounting of structural components of trees. As with
previous versions of biomass(), estimates can be returned
by tree component using the byComponent method, although we
note the specific components available have changged given underlying
changes in FIADB and the NSVB approach. The NSVB represents a
substantial advancement in national scale volume and biomass equations.
Below we provide some basic examples of biomass() and
volume().
Estimating tree biomass components
Let’s see how the biomass() function can be used to
estimate tree biomass components! As always, you can check out our
documentation with ?biomass:
# Load data from the rFIA package
library(rFIA)
data(fiaRI)
# Total live tree aboveground biomass, excluding foliage (default)
biomass(fiaRI)## # A tibble: 6 × 5
## YEAR BIO_ACRE BIO_ACRE_SE nPlots_TREE nPlots_AREA
## <dbl> <dbl> <dbl> <int> <int>
## 1 2013 71.5 3.97 120 123
## 2 2014 72.6 3.99 121 123
## 3 2015 74.0 3.96 122 124
## 4 2016 75.8 3.80 124 125
## 5 2017 76.2 3.86 124 125
## 6 2018 75.7 3.87 126 127
By default, biomass estimates total aboveground live
tree biomass for all reporting years available in the
FIA.Database (treeType = "live",
component = "AG"). Here aboveground tree biomass is a
simple summation of wood biomass in the total stem from ground line to
the tree tip, stem bark biomass, and branch wood and bark.
But what if we’re interested in estimating biomass within different
tree components separately, e.g., we want an individual estimate for
bole, foliage, stump, and others? Simply set the new
byComponent argument to TRUE:
## # A tibble: 5 × 6
## YEAR COMPONENT BIO_ACRE BIO_ACRE_SE nPlots_TREE nPlots_AREA
## <dbl> <chr> <dbl> <dbl> <int> <int>
## 1 2018 BRANCH 19.0 4.42 126 127
## 2 2018 FOLIAGE 2.09 3.05 126 127
## 3 2018 ROOT 14.0 4.10 126 127
## 4 2018 STEM 48.9 3.90 126 127
## 5 2018 STEM_BARK 7.78 3.49 126 127
Note that the sum of the provided components is NOT equal to total
tree biomass. In other words, the components are not mutually exclusive
(e.g., BOLE biomass is part of STEM biomass).
Aboveground tree biomass is equal to the sum of STEM,
STEM_BARK, and BRANCH. The Estimation
Details section of the help page for biomass()
provides all this information and more.
Awesome, but what if we want to estimate biomass for some combination
of these components, e.g., bole plus stump? The new
component argument has our backs. Users can specify any
combination of components seen in the output above. For example, say we
want to estimate abovegound biomass ("AG") plus foliage
("FOLIAGE"):
## # A tibble: 1 × 5
## YEAR BIO_ACRE BIO_ACRE_SE nPlots_TREE nPlots_AREA
## <dbl> <dbl> <dbl> <int> <int>
## 1 2018 77.7 3.82 126 127
Estimating merchantable tree volume
Previously, biomass() included support for estimation of
net merchantable volume and net sawlog volume in units of cubic feet.
Since rFIA v0.3.1, the volume() function
expands on this previous capacity in two key ways: (1) allowing use of
alternative volume definitions used by the FIA program (i.e., net,
sound, and gross volume), and (2) offering estimates of sawlog volume in
units of cubic feet (CF) and thousand board feet (MBF; International 1/4
inch rule).
By default, volume() will estimate net volume of live
trees (volType = "NET" and
treeType = "live"):
volume(db = fiaRI)## # A tibble: 6 × 9
## YEAR BOLE_CF_ACRE SAW_CF_ACRE SAW_MBF_ACRE BOLE_CF_ACRE_SE SAW_CF_ACRE_SE
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2013 2305. 1366. 7.02 5.11 8.49
## 2 2014 2356. 1402. 7.17 5.10 8.41
## 3 2015 2409. 1445. 7.38 5.00 8.32
## 4 2016 2475. 1493. 7.58 4.91 8.16
## 5 2017 2480. 1497. 7.63 4.97 8.26
## 6 2018 2470. 1493. 7.63 4.99 8.26
## # ℹ 3 more variables: SAW_MBF_ACRE_SE <dbl>, nPlots_TREE <int>,
## # nPlots_AREA <int>
Here, BOLE_CF_ACRE gives us merchantable bole volume per
acre, SAW_CF_ACRE gives us sawlog volume in cubic feet per
acre, and SAW_MBF_ACRE gives us sawlog volume in thousand
board feet per acre (International 1/4 inch rule).
We can change our volume definition using the volType
argument. Let’s try gross volume instead:
volume(db = fiaRI, volType = 'gross')## # A tibble: 6 × 9
## YEAR BOLE_CF_ACRE SAW_CF_ACRE SAW_MBF_ACRE BOLE_CF_ACRE_SE SAW_CF_ACRE_SE
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2013 2680. 1551. 7.95 4.97 8.41
## 2 2014 2741. 1592. 8.13 4.94 8.33
## 3 2015 2804. 1642. 8.38 4.84 8.26
## 4 2016 2885. 1695. 8.60 4.72 8.10
## 5 2017 2902. 1703. 8.67 4.76 8.19
## 6 2018 2888. 1700. 8.69 4.77 8.19
## # ℹ 3 more variables: SAW_MBF_ACRE_SE <dbl>, nPlots_TREE <int>,
## # nPlots_AREA <int>
So what do these different definitions mean? FIA defines net volume
(volType="NET") as: “The net volume of wood in the central
stem of timber species (trees where diameter is measured at breast
height
5.0 inches d.b.h., from a 1-foot stump to a minimum 4-inch top diameter,
or to where the central stem breaks into limbs all of which are <4.0
inches in diameter…. Does not include rotten, missing, and form cull
(volume loss due to rotten, missing, and form cull defect has been
deducted).” In volum(), we could also choose from two
alternative definitions: sound volume (volType = 'SOUND')
or gross volume (volType = 'GROSS'). Sound volume is
identical to net volume except that sound includes volume from portions
of the stem that are be considered “form cull” under the net volume
definition (e.g., sweep). In contrast, gross volume is identical to the
net volume definition except that gross includes volume from portions of
the stem that are rotten, missing, and considered form cull.