Estimating tree biomass and merchantable volume
Hunter Stanke, Jeffrey W. Doser
2021 (last updated February 7, 2025)
Source:vignettes/biomassVolume.Rmd
biomassVolume.Rmd
Introduction
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 and carbon, 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()
.
As of rFIA
v1.1.0, the biomass()
,
volume()
, and carbon()
functions now all
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, and importantly estimates
of carbon now leverage species-specific carbon fractions instead of the
previous generic assumption that tree carbon was equal to 50% of tree
biomass. 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 × 8
## YEAR BIO_ACRE CARB_ACRE BIO_ACRE_SE CARB_ACRE_SE nPlots_TREE nPlots_AREA
## <dbl> <dbl> <dbl> <dbl> <dbl> <int> <int>
## 1 2013 71.5 34.6 3.97 4.00 120 123
## 2 2014 72.6 35.1 3.99 4.01 121 123
## 3 2015 74.0 35.8 3.96 3.98 122 124
## 4 2016 75.8 36.6 3.80 3.82 124 125
## 5 2017 76.2 36.8 3.86 3.89 124 125
## 6 2018 75.7 36.6 3.87 3.90 126 127
## # ℹ 1 more variable: N <int>
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. Carbon is
estimated using species carbon fractions.
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: 11 × 9
## YEAR COMPONENT BIO_ACRE CARB_ACRE BIO_ACRE_SE CARB_ACRE_SE nPlots_TREE
## <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <int>
## 1 2018 BOLE 43.1 20.9 4.27 4.31 126
## 2 2018 BOLE_BARK 6.79 3.28 3.86 3.89 126
## 3 2018 BRANCH 19.0 9.19 4.42 4.43 126
## 4 2018 FOLIAGE 2.09 0 3.05 NaN 126
## 5 2018 ROOT 14.0 6.78 4.10 4.15 126
## 6 2018 SAWLOG 24.5 11.9 7.46 7.53 126
## 7 2018 SAWLOG_BARK 3.75 1.82 7.17 7.23 126
## 8 2018 STEM 48.9 23.6 3.90 3.94 126
## 9 2018 STEM_BARK 7.78 3.76 3.49 3.51 126
## 10 2018 STUMP 2.33 1.13 3.13 3.13 126
## 11 2018 STUMP_BARK 0.375 0.181 2.92 2.90 126
## # ℹ 2 more variables: nPlots_AREA <int>, N <int>
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 × 8
## YEAR BIO_ACRE CARB_ACRE BIO_ACRE_SE CARB_ACRE_SE nPlots_TREE nPlots_AREA
## <dbl> <dbl> <dbl> <dbl> <dbl> <int> <int>
## 1 2018 77.7 36.6 3.82 3.90 126 127
## # ℹ 1 more variable: N <int>
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 × 10
## 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
## # ℹ 4 more variables: SAW_MBF_ACRE_SE <dbl>, nPlots_TREE <int>,
## # nPlots_AREA <int>, N <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 × 10
## 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
## # ℹ 4 more variables: SAW_MBF_ACRE_SE <dbl>, nPlots_TREE <int>,
## # nPlots_AREA <int>, N <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 \(\geq\) 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.