The forestexplorR package contains two functions for calculating annual growth rates of trees in a tree census dataset. growth_summary()
uses the earliest and most recent measurements of each tree to calculate average annual growth over the entire period. detailed_growth()
calculates average annual growth between each pair of consecutive measurements of each tree, thereby detecting any changes in growth rate of a single tree over time.
growth_summary()
: Calculate overall growth ratesThe growth_summary()
function takes a tree census dataset and extracts, for each tree in that dataset, the earliest and most recent measurement records. Using these extracted data, average annual growth rate for each tree is calculated as: \[\frac{(final.size - begin.size)}{(last.record - first.record)}\] NA values are returned for trees with only a single measurement record. A warning message indicating the number of trees with negative annual growth rates is also returned (a common occurrence due to measurement error, particularly for slow-growing tree species).
For trees that have a non-negative annual growth rate, a size-corrected annual growth rate is also calculated as: \[\sqrt\frac{annual.growth}{begin.size}\] This transformed growth rate tends to have a more linear relationship with tree size, potentially enabling linear tree growth modeling approaches.
growth <- growth_summary(tree)
#> [1] "Warning: 139 trees exhibited negative annual growth"
growth %>%
select(tree_id, stand_id, species, begin_size, annual_growth, annual_bai,
size_corr_growth)
#> # A tibble: 9,155 x 7
#> tree_id stand_id species begin_size annual_growth annual_bai size_corr_growth
#> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
#> 1 AB08000100001 AB08 TSHE 48.2 0.0615 4.78 0.0357
#> 2 AB08000100002 AB08 TSHE 76.3 0.136 16.9 0.0422
#> 3 AB08000100003 AB08 TSHE 15.7 0.115 3.25 0.0857
#> 4 AB08000100004 AB08 TSHE 50.5 0.0897 7.37 0.0422
#> # ... with 9,151 more rows
detailed_growth()
: Calculate between-census growth ratesThe detailed_growth()
function works similarly to growth_summary()
in that it takes a tree census dataset and calculates average annual growth. The difference is that detailed_growth()
calculates a separate growth rate between each pair of consecutive measurements for each tree as: \[\frac{size_2 - size_1}{year_2 - year_1}\] It is expected that many more cases of negative growth rates will occur when calculating growth rate between each pair of consecutive censuses and this is the main motivation for instead calculating a single average annual growth rate for each tree using growth_summary()
.
bt_census_growth <- detailed_growth(tree)
#> [1] "Warning: 2913 cases of negative annual growth"
bt_census_growth %>%
select(tree_id, stand_id, species, start_year, end_year, annual_growth,
annual_bai)
#> # A tibble: 50,959 x 7
#> # Groups: tree_id [8,721]
#> tree_id stand_id species start_year end_year annual_growth annual_bai
#> <chr> <chr> <chr> <int> <int> <dbl> <dbl>
#> 1 AB08000100001 AB08 TSHE 1978 1984 0 0
#> 2 AB08000100001 AB08 TSHE 1984 1990 0.0667 5.07
#> 3 AB08000100001 AB08 TSHE 1990 1995 0.0800 6.13
#> 4 AB08000100001 AB08 TSHE 1995 2002 0.0857 6.64
#> # ... with 50,955 more rows