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 rates

The 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 rates

The 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