dendrometry r packageThe r package dendrometry is an implementation in R
language of forests estimations methods such as dendrometric parameters
of trees and structural parameters of tree populations. The objective is
to provide an user-friendly R package for researchers, ecologists,
foresters, statisticians, loggers and others persons who deal with
forest inventory data. Useful conversion of angle value from degree to
radian, conversion from angle to slope (in percentage) and their
reciprocals as well as principal angle determination are also included.
Position and dispersion parameters usually found in forest studies are
implemented. The package contains Fibonacci series, its extensions and
the Golden Number computation.
Please cite this package in publication or anywhere it comes to be
useful for you. Using citation R function is a simple way
to get this package references on R interface. The function also
provides a BibTeX entry for La-TeX users.
citation("dendrometry")Before use the package, load it first.
library(dendrometry)Tree
dataLet consider the package built-in Tree data.
data("Tree")
head(Tree)
#>   circum dist   up  down  fut
#> 1  345.0   17 47.2 -16.8 33.9
#> 2  241.3   15 41.9 -14.4 30.0
#> 3  255.1   13 47.3  -1.7 38.7
#> 4  227.8   15 44.2 -12.2 36.6
#> 5  283.4   15 52.0  -4.9 27.2
#> 6  155.0   15 30.6  -6.4 25.5To see Treedata description, use
help("Tree")Use dbh function to estimate trees diameters (DBH).Type
?dbh for help.
Tree$DBH <- dbh(Tree$circum)
head(Tree)#>   circum dist   up  down  fut       DBH
#> 1  345.0   17 47.2 -16.8 33.9 109.81691
#> 2  241.3   15 41.9 -14.4 30.0  76.80818
#> 3  255.1   13 47.3  -1.7 38.7  81.20085
#> 4  227.8   15 44.2 -12.2 36.6  72.51099
#> 5  283.4   15 52.0  -4.9 27.2  90.20902
#> 6  155.0   15 30.6  -6.4 25.5  49.33803Use height function to estimate tree height.Type
?height for help.
Tree$upHeight <- height(
  distance = Tree$dist, top = Tree$up, bottom = Tree$down,
  type = "angle", angleUnit = "deg"
)
Tree$futHeight <- height(
  distance = Tree$dist, top = Tree$fut, bottom = Tree$down,
  type = "angle", angleUnit = "deg"
)
head(Tree)#>   circum dist   up  down  fut       DBH upHeight futHeight
#> 1  345.0   17 47.2 -16.8 33.9 109.81691 23.49093 16.556129
#> 2  241.3   15 41.9 -14.4 30.0  76.80818 17.31008 12.511599
#> 3  255.1   13 47.3  -1.7 38.7  81.20085 14.47380 10.800795
#> 4  227.8   15 44.2 -12.2 36.6  72.51099 17.82998 14.383098
#> 5  283.4   15 52.0  -4.9 27.2  90.20902 20.48508  8.994906
#> 6  155.0   15 30.6  -6.4 25.5  49.33803 10.55349  8.837153Tree$DBH <- round(Tree$DBH, 2)
Tree$upHeight <- round(Tree$upHeight, 2)
Tree$futHeight <- round(Tree$futHeight, 2)
Tree#>    circum dist   up  down  fut    DBH upHeight futHeight
#> 1   345.0   17 47.2 -16.8 33.9 109.82    23.49     16.56
#> 2   241.3   15 41.9 -14.4 30.0  76.81    17.31     12.51
#> 3   255.1   13 47.3  -1.7 38.7  81.20    14.47     10.80
#> 4   227.8   15 44.2 -12.2 36.6  72.51    17.83     14.38
#> 5   283.4   15 52.0  -4.9 27.2  90.21    20.49      8.99
#> 6   155.0   15 30.6  -6.4 25.5  49.34    10.55      8.84
#> 7   247.0   14 52.4 -14.0 34.9  78.62    21.67     13.26
#> 8   313.9   13 46.8 -10.6 32.0  99.92    16.28     10.56
#> 9   337.5   17 39.6 -11.2 23.1 107.43    17.43     10.62
#> 10  312.1   17 51.7 -18.2 38.1  99.34    27.12     18.92Ones could need converting angle values to slope. The
angle2slope function does it easily. The reciprocal of this
function is slope2angle.
Tree$up.slope <- angle2slope(Tree$up)
Tree$up.slope <- round(Tree$up.slope)
Tree#>    circum dist   up  down  fut    DBH upHeight futHeight up.slope
#> 1   345.0   17 47.2 -16.8 33.9 109.82    23.49     16.56      108
#> 2   241.3   15 41.9 -14.4 30.0  76.81    17.31     12.51       90
#> 3   255.1   13 47.3  -1.7 38.7  81.20    14.47     10.80      108
#> 4   227.8   15 44.2 -12.2 36.6  72.51    17.83     14.38       97
#> 5   283.4   15 52.0  -4.9 27.2  90.21    20.49      8.99      128
#> 6   155.0   15 30.6  -6.4 25.5  49.34    10.55      8.84       59
#> 7   247.0   14 52.4 -14.0 34.9  78.62    21.67     13.26      130
#> 8   313.9   13 46.8 -10.6 32.0  99.92    16.28     10.56      106
#> 9   337.5   17 39.6 -11.2 23.1 107.43    17.43     10.62       83
#> 10  312.1   17 51.7 -18.2 38.1  99.34    27.12     18.92      127The basal area of each tree is computed with basal_i
function.
Tree$basal <- basal_i(dbh = Tree$DBH / 100)
Tree$basal <- round(Tree$basal, 4)
Tree#>    circum dist   up  down  fut    DBH upHeight futHeight up.slope  basal
#> 1   345.0   17 47.2 -16.8 33.9 109.82    23.49     16.56      108 0.9472
#> 2   241.3   15 41.9 -14.4 30.0  76.81    17.31     12.51       90 0.4634
#> 3   255.1   13 47.3  -1.7 38.7  81.20    14.47     10.80      108 0.5178
#> 4   227.8   15 44.2 -12.2 36.6  72.51    17.83     14.38       97 0.4129
#> 5   283.4   15 52.0  -4.9 27.2  90.21    20.49      8.99      128 0.6391
#> 6   155.0   15 30.6  -6.4 25.5  49.34    10.55      8.84       59 0.1912
#> 7   247.0   14 52.4 -14.0 34.9  78.62    21.67     13.26      130 0.4855
#> 8   313.9   13 46.8 -10.6 32.0  99.92    16.28     10.56      106 0.7841
#> 9   337.5   17 39.6 -11.2 23.1 107.43    17.43     10.62       83 0.9064
#> 10  312.1   17 51.7 -18.2 38.1  99.34    27.12     18.92      127 0.7751DBH is divided by 100 in order to convert DBH to meter (m). This conversion is optional and depends on the study methodology.
The Lorey’s mean height is computed via loreyHeight
function.
Lorey <- loreyHeight(basal = Tree$basal, height = Tree$upHeight)
Lorey#> [1] 19.65526Note: Simple mean of height is different from Lorey’s mean height.
#> Mean of Height(m)   Lorey height(m) 
#>          18.66400          19.65526The mean diameter is computed with diameterMean
function.
Dm <- diameterMean(Tree$DBH)
Dm#> [1] 88.29404Note: Simple mean of diameter is different from mean diameter (Dm).
#> Simple mean of Diameter(cm)           Mean diameter(cm) 
#>                    86.52000                    88.29404This section is illustrated with the Logging data
set.
Logging datasetThe Logging data are in a data frame with twenty five
observations and eight variables assumed collected on trees and/or logs.
Type ?Logging for details.
data("Logging")
summary(Logging)#>      tree              hauteur      diametreMedian  perimetreMedian
#>  Length:24          Min.   :12.10   Min.   :38.80   Min.   :122.0  
#>  Class :character   1st Qu.:13.60   1st Qu.:62.15   1st Qu.:195.3  
#>  Mode  :character   Median :14.30   Median :72.15   Median :226.5  
#>                     Mean   :14.33   Mean   :71.49   Mean   :224.6  
#>                     3rd Qu.:15.30   3rd Qu.:83.90   3rd Qu.:263.6  
#>                     Max.   :15.70   Max.   :94.20   Max.   :296.0  
#>  perimetreSection diametreSection perimetreBase    diametreBase   
#>  Min.   : 97.6    Min.   :31.10   Min.   :158.6   Min.   : 50.50  
#>  1st Qu.:156.3    1st Qu.:49.73   1st Qu.:253.9   1st Qu.: 80.80  
#>  Median :181.2    Median :57.70   Median :294.5   Median : 93.75  
#>  Mean   :179.7    Mean   :57.19   Mean   :292.0   Mean   : 92.94  
#>  3rd Qu.:210.9    3rd Qu.:67.12   3rd Qu.:342.7   3rd Qu.:109.08  
#>  Max.   :236.8    Max.   :75.40   Max.   :384.8   Max.   :122.50factorize a datasetThe variable tree is considered as character
rather than factor. To overcome that and make easier
manipulation one changes character variables to factor
variables. To do that for whole dataset, use function
factorize. Type ?factorize for help.
class(Logging$tree)#> [1] "character"Logging <- factorize(data = Logging)
class(Logging$tree)#> [1] "factor"summary(Logging)#>           tree      hauteur      diametreMedian  perimetreMedian
#>  Afzelia    :2   Min.   :12.10   Min.   :38.80   Min.   :122.0  
#>  Danielia   :4   1st Qu.:13.60   1st Qu.:62.15   1st Qu.:195.3  
#>  Eucalyptus :2   Median :14.30   Median :72.15   Median :226.5  
#>  Isoberlinia:5   Mean   :14.33   Mean   :71.49   Mean   :224.6  
#>  Khaya      :6   3rd Qu.:15.30   3rd Qu.:83.90   3rd Qu.:263.6  
#>  Pterocarpus:5   Max.   :15.70   Max.   :94.20   Max.   :296.0  
#>  perimetreSection diametreSection perimetreBase    diametreBase   
#>  Min.   : 97.6    Min.   :31.10   Min.   :158.6   Min.   : 50.50  
#>  1st Qu.:156.3    1st Qu.:49.73   1st Qu.:253.9   1st Qu.: 80.80  
#>  Median :181.2    Median :57.70   Median :294.5   Median : 93.75  
#>  Mean   :179.7    Mean   :57.19   Mean   :292.0   Mean   : 92.94  
#>  3rd Qu.:210.9    3rd Qu.:67.12   3rd Qu.:342.7   3rd Qu.:109.08  
#>  Max.   :236.8    Max.   :75.40   Max.   :384.8   Max.   :122.50head(Logging, 4)#>          tree hauteur diametreMedian perimetreMedian perimetreSection
#> 1    Danielia    13.9           94.2           296.0            236.8
#> 2    Danielia    13.9           92.3           289.9            231.9
#> 3 Pterocarpus    14.7           90.4           284.0            227.2
#> 4       Khaya    13.6           90.1           283.1            226.5
#>   diametreSection perimetreBase diametreBase
#> 1            75.4         384.8        122.5
#> 2            73.8         376.8        119.9
#> 3            72.3         369.2        117.5
#> 4            72.1         368.1        117.2attach(Logging)This coefficient expresses the ratio between the diameter (or
circumference) at mid-height of the bole and the diameter (or
circumference) measured at breast height. The decrease
function is used to compute this coefficient. Type
?decrease for help.
Decrease <- decrease(middle = diametreMedian, breast = diametreBase)
Decrease#>  [1] 0.7689796 0.7698082 0.7693617 0.7687713 0.7696381 0.7690941 0.7692308
#>  [8] 0.7693069 0.7691542 0.7698492 0.7687564 0.7693943 0.7698073 0.7689732
#> [15] 0.7694038 0.7691415 0.7688679 0.7692308 0.7690323 0.7689189 0.7685590
#> [22] 0.7692308 0.7694656 0.7683168The reduction coefficient is the ratio between the difference in size
at breast height and mid-height on the one hand, and the size at breast
height on the other. It is thus the complement to 1 of the coefficient
of decrease. The reducecoef function is used to compute the
reduction coefficient. Type ?reducecoef for help.
Reduce <- reducecoef(middle = diametreMedian, breast = diametreBase)
Reduce#>  [1] 0.2310204 0.2301918 0.2306383 0.2312287 0.2303619 0.2309059 0.2307692
#>  [8] 0.2306931 0.2308458 0.2301508 0.2312436 0.2306057 0.2301927 0.2310268
#> [15] 0.2305962 0.2308585 0.2311321 0.2307692 0.2309677 0.2310811 0.2314410
#> [22] 0.2307692 0.2305344 0.2316832The average metric decay expresses the difference, in centimeters per
meter, between the diameter (or circumference) at breast height and its
diameter at mid-height of a stem related to the difference between the
height at mid-height and that at breast height. The average metric decay
is computed using decreaseMetric function.Type
?decreaseMetric for help.
DecMetric <- decreaseMetric(
  dmh = diametreMedian, dbh = diametreBase,
  mh = hauteur / 2
)
DecMetric#>  [1] 5.008850 4.884956 4.479339 4.927273 4.314050 3.969466 3.921260 4.905263
#>  [9] 4.884211 3.606299 4.090909 3.312977 3.909091 3.763636 3.388430 3.618182
#> [17] 2.992366 3.345133 2.732824 2.826446 2.814159 2.528926 2.745455 1.786260In case of DBH considered at other height than 1.3 m, the breast
height is set via bh argument of
decreaseMetric function.
DecMetric1.5 <- decreaseMetric(
  dmh = diametreMedian, dbh = diametreBase,
  mh = hauteur / 2, bh = 1.5
)
DecMetric1.5#>  [1] 5.192661 5.064220 4.632479 5.113208 4.461538 4.094488 4.048780 5.120879
#>  [9] 5.098901 3.723577 4.245283 3.417323 4.056604 3.905660 3.504274 3.754717
#> [17] 3.086614 3.467890 2.818898 2.923077 2.917431 2.615385 2.849057 1.842520The wood volume of logs and trees is computed withe
volume function. Type ?volume for help. The
Huber, Smalian, Cone and
Newton methods are implemented. When
successive is set TRUE, the selected method is
implemented on all log belonging to the same tree. The sum of logs
volume is returned per tree. Type ?volume for details.
# HUBER
VolHub <- volume(height = hauteur, dm = diametreMedian, method = "huber")
# SMALIAN
VolSmal <- volume(
  height = hauteur, do = diametreBase, ds = diametreSection,
  method = "smalian"
)
# CONE
VolCone <- volume(
  height = hauteur, do = diametreBase, ds = diametreSection,
  method = "cone"
)
# NEWTON
VolNew <- volume(
  height = hauteur, do = diametreBase, dm = diametreMedian,
  ds = diametreSection, method = "newton"
)Make a data frame of tree volumes per method.
TreeVol <- data.frame(tree, VolHub, VolSmal, VolCone, VolNew)
head(TreeVol)#>          tree   VolHub  VolSmal   VolCone    VolNew
#> 1    Danielia 96873.83 112944.4 108908.01 102230.70
#> 2    Danielia 93005.38 108201.2 104334.35  98070.65
#> 3 Pterocarpus 94350.47 109874.5 105943.20  99525.14
#> 4       Khaya 86711.83 101122.3  97501.27  91515.32
#> 5 Pterocarpus 87789.02 102147.4  98489.52  92575.14
#> 6 Isoberlinia 92475.21 107778.5 103925.34  97576.30Now, let consider the variable tree as the tree to which
belong the log; such that each observation of the data set stands for
characteristics of a log. It’s like trees are cut in many logs. Then
those logs are measured. All logs from the same tree have the same value
for variable tree. Then let compute trees volume with sum
of all logs obtained from each tree. The successive
argument should then be set to TRUE.
# HUBER
VolHubSuc <- volume(
  height = hauteur, dm = diametreMedian, method = "huber",
  successive = TRUE, log = tree
)
# SMALIAN
VolSmalSuc <- volume(
  height = hauteur, do = diametreBase, ds = diametreSection,
  method = "smalian", successive = TRUE, log = tree
)
# CONE
VolConSuc <- volume(
  height = hauteur, do = diametreBase, ds = diametreSection,
  method = "cone", successive = TRUE, log = tree
)
# NEWTON
VolNewSuc <- volume(
  height = hauteur, do = diametreBase, dm = diametreMedian,
  ds = diametreSection, method = "newton", successive = TRUE,
  log = tree
)
VolNewSuc#> [1] 278131.9 320197.0 344495.6 286902.0 161669.8 120418.5volume(
  height = hauteur, do = diametreBase, dm = diametreMedian,
  ds = diametreSection, method = "newton", successive = TRUE, log = tree
)#> [1] 278131.9 320197.0 344495.6 286902.0 161669.8 120418.5Make a data frame of tree volumes per method.
TreeVolSuc <- data.frame(tree = unique(tree), VolHubSuc, VolSmalSuc, VolConSuc, VolNewSuc)
TreeVolSuc#>          tree VolHubSuc VolSmalSuc VolConSuc VolNewSuc
#> 1    Danielia  263643.9   307108.0  296121.6  278131.9
#> 2 Pterocarpus  303563.9   353463.3  340809.3  320197.0
#> 3       Khaya  326485.1   380516.5  366911.6  344495.6
#> 4 Isoberlinia  271892.6   316921.0  305592.1  286902.0
#> 5  Eucalyptus  153290.4   178428.7  172041.6  161669.8
#> 6     Afzelia  114159.4   132936.7  128167.8  120418.5The shape coefficient of the tree is the ratio of the actual volume of the tree to the volume of a cylinder having as base the surface of the section at 1.3 m (or a given breast height) and as length, the height of the tree.
Shape <- shape(volume = VolNewSuc, height = hauteur, dbh = perimetreMedian)
Shape#>  [1] 0.2907788 0.3489926 0.3699472 0.3351391 0.1866542 0.1318036 0.3402940
#>  [8] 0.5659296 0.6149093 0.4127833 0.2738388 0.1890187 0.5111624 0.6389570
#> [15] 0.6461058 0.6190508 0.3122882 0.2813572 0.6422766 0.8675112 1.1465321
#> [22] 0.9682809 0.6047658 0.6561210