Learn R Programming

woodValuationDE: Wood Valuation Germany

Monetary valuation of wood in German forests (stumpage values), including estimations of harvest quantities, wood revenues, and harvest costs. The functions are sensitive to tree species, mean diameter of the harvested trees, stand quality, and logging method. The functions include estimations for the consequences of disturbances on revenues and costs.

The underlying assortment tables are taken from Offer and Staupendahl (2018) with corresponding functions for salable and skidded volume derived in Fuchs et al. (2023). Wood revenue and harvest cost functions were taken from v. Bodelschwingh (2018). The consequences of disturbances refer to Dieter (2001), Möllmann and Möhring (2017), and Fuchs et al. (2022a, 2022b). For the full references see documentation of the functions, package README, and Fuchs et al. (2023). Apart from Dieter (2001) and Möllmann and Möhring (2017), all functions and factors are based on data from HessenForst, the forest administration of the Federal State of Hesse in Germany.

The current stable release of the R package woodValuationDE is available at CRAN. We have also published a simplified version with the main functions as an EXCEL file at Zenodo.

  1. Introduction
  2. Package structure
  3. Functions
    • vol_salable()
    • vol_skidded()
    • vol_assortment()
    • wood_revenues()
    • harvest_costs()
    • wood_valuation()
    • wood_net_revenues()
    • get_species_codes()
  4. Tutorial with yield tables
  5. Recommended citation
  6. Funding
  7. References

When assessing the multiple ecosystem services provided by German forests, economic indicators for productive ecosystem services are relevant but are not always easily estimable. Their calculation requires either quantitative information or many assumptions on them and is time consuming. The net wood revenues, as a basis for several indicators related to income from wood production, depend, a.o., on tree species, diameter, and stand quality. Additionally, disturbance events may affect the net revenues, as wood quality is reduced due to mechanical damage, market prices are reduced due to increasing wood supply, and harvest costs might increase (Fuchs et al. 2022b).

Here, woodValuationDE contributes with a comprehensive wood valuation framework considering the various influences on harvest quantities, harvest costs, and wood revenues. It simplifies the estimation of realistic monetary wood values for a broad field of applications in bioeconomic modeling. A particular strength of woodValuationDE is the consistency of the data underlying the various models, including a set of disturbance scenarios.

woodValuationDE comprises data and models obtained from several studies. It makes previously published models available for future studies by creating a consistent valuation framework since all1,2 submodels are based on operational harvest and sale data from HessenForst, the public forest service of the Federal State of Hesse in Germany. The underlying assortment tables are taken from Offer and Staupendahl (2018) with corresponding functions for the harvest quantities derived in Fuchs et al. (2023). Wood revenue and harvest cost functions were taken from v. Bodelschwingh (2018). The consequences of disturbances refer to Dieter (2001)1, Möllmann and Möhring (2017)2, Fuchs et al. (2022a), and Fuchs et al. (2022b).

The assortment tables as well as the other models in woodValuationDE represent average conditions in Hesse. The estimations usually represent a strong simplification, since the variability of these values is very large in practice. Furthermore, the assortment tables assume the harvest of entire stands, which must be considered when revenues for harvests of smaller parts of stands are estimated.


Fuchs et al. (2023)


1The assumed factor according to Dieter (2001) is an exception since it is based on wood prices in southern Germany. However, we included it since it has often been applied in bioeconomic simulations for Germany.

2The assumed factors according to Möllmann and Möhring (2017) are an exception since they are based on surveys of forest owners and managers in the entirety of Germany. However, we included them, since they provide estimates distinguishing between the disturbance agents.

The wood valuation implemented in woodValuationDE is a three-stage approach, deriving (i) the relevant harvest quantities, (ii) the revenues and costs per volume unit, and (iii) the net revenues (see Fig. 1).

woodValuationDE allows for the estimation of wood values referring to the volume over bark of the standing trees to be harvested (German unit: Vfm m.R.) as usually provided by yield tables and single-tree simulation models. Volume losses due to harvest cuts and residues (in German: X-Holz and NVD-Holz), e.g., due to fixed assortment length, are considered via the harvest quantity functions: vol_salable() provides the share of salable volume relative to the volume over bark. It represents the volume that is utilized and taken out of the forest stand. It is the relevant volume unit for the revenues. It includes all pulpwood, sawlogs, and private fuel wood. vol_skidded() provides the share of skidded volume relative to the volume over bark. This volume share is delivered to the forest road and represents the relevant volume unit for remuneration for the logging (harvesting and skidding), i.e. the harvest costs. The salable volume is higher than the skidded volume since it also includes the private fuel wood, which is not delivered to the forest road by the forest enterprise.

Accordingly, wood_revenues() estimates the revenues per cubic meter of salable wood [EUR m-3] and harvest_costs() the harvest costs per cubic meter of skidded wood [EUR m-3]. Both models depend on the tree species and quadratic mean diameter3 of the harvested trees. Further function arguments are the stand quality, the logging method, and the accessibility of the stand for logging operations. In addition, current market situations can be considered via updated prices for the German reference assortments.

The functions wood_valuation() and wood_net_revenues() provide wrappers for easy application of the wood valuation procedure implemented in woodValuationDE. Both functions call the previously described ones and combine them to derive the net wood revenues. While wood_valuation() returns a tibble with the entire calculations, wood_net_revenues() can be used to directly get the total net revenues [EUR].

In the next section, we describe the functions' input arguments and output values as well as the underlying models and data with their references in more detail. The parameters for all models are stored as internal object params.wood.value. Users interested in the detailed parameters can call them via:

woodValuationDE:::params.wood.value

3The mean diameter is calculated as the diameter corresponding to the mean single-tree basal area (at breast height) of the harvested trees, often referred to as QMD, Dq, or Dg (see e.g. Curtis and Mashall (2000)). In German: Durchmesser des Grundflächenmittelstamms.

The function estimates the salable share in the volume over bark of the standing trees that are to be harvested. This includes pulpwood, sawlogs, but also private fuel wood. It represents the entire share of wood which is taken out of the forest for usage. The share of salable wood is required to derive the wood revenues per unit volume over bark. The function is based on the assortment tables from Offer and Staupendahl (2018) and its derivation is described in Fuchs et al. (2023). The underlying assortment tables are based on data from HessenForst, the public forest service of the Federal State of Hesse in Germany.

The assortment tables from Offer and Staupendahl (2018) provide conversion factors from the volume over bark (in German: Vfm m.R.) to the harvested volume under bark (in German: Efm o.R.). In addition, they provide the share of non-utilized wood, e.g., due to fixed assortment lengths, and private fuel wood thereof. The assortment tables were derived for HessenForst with the calculation program HOLZERNTE 7.1 (Schöpfer et al., 2003). Additional parameters were defined by forest district officers and validated against harvest and sale statistics of HessenForst. More details on the assortment tables and their derivation are provided in Offer and Staupendahl (2008) and Offer and Staupendahl (2009).

We derived the share of salable volume vsalable based on these assortment tables. Since the assortment tables only provide the values in diameter steps of 2 cm, a Gompertz function was fitted in order to have a continuous model (see Fuchs et al., 2023). For the model fitting, the modified formulation according to Fischer and Schönfelder (2017) was used:

with the volume share of salable wood vsalable, the quadratic mean diameter dq, and the parameters A, zm and tw. The actual parameter values depend on tree species, stand quality, and logging method.

Apart from species.code.type, all user inputs can be provided as single values or as a vector. If mixed, the single values will be recycled.

The quadratic mean3 of the diameter at breast height (dbh) of the harvested trees [cm].

The tree species, using one of the available species.code.types. Tab. 1 lists the most important genera and species implemented. Most species are assigned to economic species groups for valuation. A list of available species codes and their assignments to economic valuation groups is provided by:

get_species_codes()
Species code Lower SaxonyEnglish species CodeScientific name
110oakQuercus sp.
211beechFagus sylvatica
221hornbeamCarpinus betulus
311ashFraxinus excelsior
321mapleAcer pseudoplatanus
331elmUlmus glabra
341limeTilia platyphyllos
354cherryPrunus avium
410birchBetula sp.
421alderAlnus glutinosa
430poplarPopulus sp.
441willowSalix sp.
511sprucePicea abies
521firAbies alba
611douglas.firPseudotsuga menziesii
711pinePinus sylvestris
811larchLarix decidua

Stand quality, expressed as an integer value of 1:3:

  • 1: extraordinarily high stand quality with high shares of wood suitable, e.g., for furniture
  • 2: moderate quality
  • 3: low quality (e.g. trees with thick branches)

The value.levels refer to the applied assortment tables (Offer and Staupendahl, 2018).

Logging method:

  • "manually": motor-manual logging using a chain saw
  • "harvester": highly mechanized logging using forest harvesters
  • "combined": a combination of the previous methods dependent on the mean diameter

The logging methods "manually" and "harvester" refer to Offer and Staupendahl (2018) and v. Bodelschwingh (2018). Since, e.g., for deciduous species a maximum diameter of 40 cm is assumed for highly mechanized logging, Fuchs et al. (2023) derived the method "combined". This refers to combinations, as applied by v. Bodelschwingh (2018) in the harvest cost model, assuming diameter-specific proportions of motor-manual and highly mechanized logging:

  • softwood species
    • diameter.q <= 20 cm: 100 % "harvester",
    • 20 cm < diameter.q < 50 cm: linear increase of "manually", maximum 50 %,
    • diameter.q >= 50 cm: 50 % "harvester" and 50 % "manually".
  • deciduous species
    • diameter.q <= 20 cm: 100 % "harvester",
    • 20 cm < diameter.q < 40 cm: linear increase of "manually", maximum 100 %,
    • diameter.q >= 40 cm: 100 % "manually".

The type of code in which species is given.

  • "en": English species names
  • "nds": numeric species codes used in Lower Saxony, Germany.

The list with the available species' codes is provided by:

get_species_codes()

A vector with relative shares of salable wood volume (relative share, not percentages).

vol_salable(40,
            "beech")

# species codes Lower Saxony (Germany)
vol_salable(40,
            211,
            species.code.type = "nds")

# vector input
vol_salable(seq(20, 50, 5),
            "spruce")

vol_salable(rep(seq(20, 50, 10),
                2),
            rep(c("beech", "spruce"),
                each = 4))

vol_salable(rep(seq(20, 50, 10),
                2),
            rep(c("beech", "spruce"),
                each = 4),
            logging.method = rep(c("manually", "harvester"),
                               each = 4))

The function estimates the skidded share in the volume over bark of the standing trees that are to be harvested. It is entire volume that is assumed to be commercially delivered to the forest road, the pulpwood and sawlog assortments. The share of skidded wood is required to derive the harvest costs per unit volume over bark. The function is based on the assortment tables from Offer and Staupendahl (2018) and its derivation is described in Fuchs et al. (2023). The underlying assortment tables are based on data from HessenForst, the public forest service of the Federal State of Hesse in Germany.

The assortment tables from Offer and Staupendahl (2018) provide conversion factors from volume over bark to harvested volume under bark. In addition, they provide the share of non-utilized wood, e.g., due to fixed assortment lengths, and private fuelwood thereof. The assortment tables were derived for HessenForst with the calculation program HOLZERNTE 7.1 (Schöpfer et al., 2003). Additional parameters were defined by forest district officers and validated against harvest and sale statistics of HessenForst. More details on the assortment tables and their derivation are provided in Offer and Staupendahl (2008) and Offer and Staupendahl (2009).

We derived the share of skidded volume vskidded based on these assortment tables. Since the assortment tables only provide the values in diameter steps of 2 cm, a Gompertz function was fitted to have a continuous model (see Fuchs et al., 2023). For the model fitting, the modified formulation according to Fischer and Schönfelder (2017) was used:

with the volume share of skidded wood vskidded, the quadratic mean diameter dq, and the parameters A, zm and tw. The actual parameter values depend on species, stand quality, and logging method.

Apart from species.code.type, all user inputs can be provided as single values or as a vector. If mixed, the single values will be recycled.

For details see vol_salable().

A vector with relative shares of skidded wood volume (relative share, not percentages).

vol_skidded(40,
            "beech")

# species codes Lower Saxony (Germany)
vol_skidded(40,
            211,
            species.code.type = "nds")

# vector input
vol_skidded(seq(20, 50, 5),
            "spruce")

vol_skidded(rep(seq(20, 50, 10),
                2),
            rep(c("beech", "spruce"),
                each = 4))

vol_skidded(rep(seq(20, 50, 10),
                2),
            rep(c("beech", "spruce"),
                each = 4),
            logging.method = rep(c("manually", "harvester"),
                               each = 4))

The function estimates volume shares of specific assortment (groups). These are expressed in relation to the salable volume. At the moment, we implemented the share of saw logs. This also allows for calculating the share of pulp wood. The function is based on the assortment tables from Offer and Staupendahl (2018). Its derivation is similar to the approach described in Fuchs et al. (2023) for the salable and skidded volume. The underlying assortment tables are based on data from HessenForst, the public forest service of the Federal State of Hesse in Germany.

The assortment tables from Offer and Staupendahl (2018) provide conversion factors from volume over bark to harvested volume under bark. In addition, they provide the share of non-utilized wood, e.g., due to fixed assortment lengths, and private fuelwood thereof. The assortment tables were derived for HessenForst with the calculation program HOLZERNTE 7.1 (Schöpfer et al., 2003). Additional parameters were defined by forest district officers and validated against harvest and sale statistics of HessenForst. More details on the assortment tables and their derivation are provided in Offer and Staupendahl (2008) and Offer and Staupendahl (2009).

We derived the share of saw logs vsaw.logs based on these assortment tables. Since the assortment tables only provide the values in diameter steps of 2 cm, a Gompertz function was fitted to have a continuous model (cf. Fuchs et al., 2023). For the model fitting, the modified formulation according to Fischer and Schönfelder (2017) was used:

with the volume share of saw logs vsaw.logs, the quadratic mean diameter dq, and the parameters A, zm and tw. The actual parameter values depend on species, stand quality, and logging method.

Apart from species.code.type and assortment, all user inputs can be provided as single values or as a vector. If mixed, the single values will be recycled.

Wood assortment whose share is sought, currently implemented: "saw.logs".

For details see vol_salable().

A vector with relative shares of respective assortment.

# saw log volume per cubic meter salable volume
share.saw.logs <- vol_assortment(40,
                                 "beech",
                                 "saw.logs")
share.saw.logs
 
# fuel wood per cubic meter salable volume
share.fuel.wood <- (vol_salable(40,
                                "beech") -
                      vol_skidded(40,
                                  "beech")) /
   vol_salable(40,
               "beech")
share.fuel.wood

# pulp wood per cubic meter salable volume
share.pulp.wood <- 1 - share.saw.logs - share.fuel.wood
 
# saw log volume per cubic meter volume over bark
vol_assortment(40,
               "beech",
               "saw.logs") *
   vol_salable(40,
               "beech")

The function estimates average wood revenues per unit salable volume [EUR m-3] applying the wood revenues model of v. Bodelschwingh (2018), which is based on the assortment tables from Offer and Staupendahl (2018). Consequences of calamities are implemented based on Dieter (2001), Möllmann and Möhring (2017), Fuchs et al. (2022a), and Fuchs et al. (2022b). Apart from Dieter (2001) and Möllmann and Möhring (2017), the function and all factors are based on data from HessenForst, the public forest service of the Federal State of Hesse in Germany.

The diameter- and species-sensitive wood revenue model was developed by v. Bodelschwingh (2018). It is based on a previous version (2013) of the assortment tables of Offer and Staupendahl (2018) and the wood sales of HessenForst from 2010 to 2015. A price matrix for different assortments was derived out of the sales data and combined with the assortment table to derive average wood revenues for diameter-dependent assortment compositions. The fitted model function for the wood revenues s is:

with the quadratic mean diameter dq, and the parameters a to e. The parameter values depend on species, stand quality (value.level), and logging method.

The model estimates wood revenues referring to Hessian market conditions in the time period from 2010 to 2015. Via the market price of a reference assortment for each species, this can be linearly adapted to other market conditions. The reference assortments (sawlogs) are defined by diameter class (1: 10-19 cm, 2: 20-29..., with 1a: 10-14 cm and 1b: 15-19 cm) and a quality from A to D (with A the highest and D the lowest quality) as usually applied in Germany (see Deutscher Forstwirtschaftsrat and Deutscher Holzwirtschaftsrat, 2020). The original prices of the reference assortments preference.assortment,original in Hesse between 2010 and 2015 are listed in Tab.2. If another price preference.assortment,user is applied to wood_revenues(), the baseline wood revenues of the model soriginal will be updated (supdated) by:

English Species CodeReference AssortmentPrice [EUR m-3]
oakB 4277.41
beechB 475.75
spruceB 2b92.47
pineB 2b71.48
douglas.firB 2b92.23
larchB 2b83.29
birchB 472.13
alderB 498.90
ashB 4112.88
poplarB 445.43

A particular strength of woodValuationDE is the possibility to consider consequences of disturbances and calamities. Users can choose a suitable parameterization from a broad set of previously published estimates for the consequences of disturbances that are pre-implemented. Alternatively, users can implement their own assumptions. For wood revenues, a factor is multiplied with the undisturbed revenues. The options that are implemented by default are listed in Tab. 3.

NameFactor softwoodFactor deciduousReferenceDetails
"none"1.001.00-default: no calamity
"calamity.dieter.2001"0.500.50Dieter (2001)Assumption based on prices in southern Germany after a calamity event, often applied in bioeconomic simulations for Germany. Originally referring to net revenues, thus to be used in combination with harvest_costs().
"fire.small.moellmann.2017"0.56-Möllmann and Möhring (2017)Based on a survey of forest managers in Germany, referring to damages by fire affecting only a few trees. The survey only asked for effects of quality losses.
"fire.large.moellmann.2017"0.56-Möllmann and Möhring (2017)Based on a survey of forest managers in Germany, referring to damages by fire affecting at least one compartment. The survey only asked for effects of quality losses.
"storm.small.moellmann.2017"0.850.79Möllmann and Möhring (2017)Based on a survey of forest managers in Germany, referring to damages by storm affecting only a few trees. The survey only asked for effects of quality losses.
"storm.large.moellmann.2017"0.850.79Möllmann and Möhring (2017)Based on a survey of forest managers in Germany, referring to damages by storm affecting at least one compartment. The survey only asked for effects of quality losses.
"insects.moellmann.2017"0.78-Möllmann and Möhring (2017)Based on a survey of forest managers in Germany, referring to damages by insects. The survey only asked for effects of quality losses.
"ips.fuchs.2022a"0.67-Fuchs et al. (2022a)Assumption of quality losses after spruce bark beetle infestations, based on the assortment tables (Offer and Staupendahl, 2018) and price matrix (v. Bodelschwingh, 2018).
"ips.timely.fuchs.2022a"0.88-Fuchs et al. (2022a)Assumption of quality losses after spruce bark beetle infestations with timely salvage harvests leading to lower value losses, based on the assortment tables (Offer and Staupendahl, 2018) and price matrix (v. Bodelschwingh, 2018).
"stand.damage.fuchs.2022b"0.900.85Fuchs et al. (2022b)Assumption of damages in a single stand influencing only the wood quality not the wood market, derived based on time series analyses of sales of HessenForst.
"regional.disturbance.fuchs.2022b"0.740.70Fuchs et al. (2022b)Assumption of regional damages influencing wood quality and regional wood market (oversupply), derived based on time series analyses of sales of HessenForst.
"transregional.calamity.fuchs.2022b"0.540.70Fuchs et al. (2022b)Assumption of (inter-)national damages influencing wood quality and wood national market (oversupply), derived based on time series analyses of sales of HessenForst.

Apart from species.code.type, price.ref.assortment, and calamity.factors, all user inputs can be provided as single values or as a vector. If mixed, the single values will be recycled.

The quadratic mean3 of the diameter at breast height (dbh) of the harvested trees [cm].

The tree species, using one of the available species.code.types. Tab. 1 lists the most important genera and species implemented. Most species are assigned to economic species groups for valuation. A list of available species codes, and their assignments to valuation groups is provided by:

get_species_codes()

Stand quality, expressed as an integer value of 1:3:

  • 1: extraordinarily high stand quality with high shares of wood suitable, e.g., for furniture
  • 2: moderate quality
  • 3: low quality (e.g. trees with thick branches)

The value.levels refer to the applied assortment tables (Offer and Staupendahl, 2018).

Logging method:

  • "manually": motor-manual logging using a chain saw
  • "harvester": highly mechanized logging using forest harvesters
  • "combined": a combination of the previous methods dependent on the mean diameter

The logging methods "manually" and "harvester" refer to Offer and Staupendahl (2018) and v. Bodelschwingh (2018). Since, e.g., for deciduous species a maximum diameter of 40 cm is assumed for highly mechanized logging, Fuchs et al. (2023) derived the method "combined". This refers to combinations, as applied by v. Bodelschwingh (2018) in the harvest cost model, assuming diameter-specific proportions of motor-manual and highly mechanized logging:

  • softwood species
    • diameter.q <= 20 cm: 100 % "harvester",
    • 20 cm < diameter.q < 50 cm: linear increase of "manually", maximum 50 %,
    • diameter.q >= 50 cm: 50 % "harvester" and 50 % "manually".
  • deciduous species
    • diameter.q <= 20 cm: 100 % "harvester",
    • 20 cm < diameter.q < 40 cm: linear increase of "manually", maximum 100 %,
    • diameter.q >= 40 cm: 100 % "manually".

Wood price of the reference assortments allowing for the consideration of market fluctuations as described above. Default is "baseline", which refers to the prices from 2010 to 2015 in Hesse, Germany according to v. Bodelschwingh (2018), listed in Tab. 2. Alternatively, users can provide a tibble with the same structure, which is illustrated by the "baseline" tibble:

prices.ref.assortments <- dplyr::tibble(
      species = c(110, 211, 511, 711, 611,
                  811, 410, 421, 311, 430),
      price.ref.assortment = c(277.41, 75.75, 92.47, 71.48, 92.23,
                               83.29, 72.13, 98.90, 112.88, 45.43))

Type of calamity or disturbance event in case of salvage harvests. This determines the applied reductions for salvage revenues. For the implemented options, see Tab.3. Alternatively, users can provide their own factors.

Summands [EUR m-3] and factors to consider the consequences of disturbances and calamities on wood revenues and harvest costs. "baseline" provides a tibble based on the references listed in Tab. 5. Alternatively, users can provide an own tibble with the same structure, which is illustrated by the "baseline" tibble:

calamity.factors <- dplyr::tibble(
      calamity.type = rep(c("none",
                            "calamity.dieter.2001",
                            "fire.small.moellmann.2017",
                            "fire.large.moellmann.2017",
                            "storm.small.moellmann.2017",
                            "storm.large.moellmann.2017",
                            "insects.moellmann.2017",
                            "ips.fuchs.2022a",
                            "ips.timely.fuchs.2022a",
                            "stand.damage.fuchs.2022b",
                            "regional.disturbance.fuchs.2022b",
                            "transregional.calamity.fuchs.2022b"),
                          each = 2),
      species.group = rep(c("softwood",
                            "deciduous"),
                          times = 12),
      revenues.factor = c(1.00, 1.00,
                          0.50, 0.50,
                          0.56,   NA,
                          0.56,   NA,
                          0.85, 0.79,
                          0.85, 0.79,
                          0.78,   NA,
                          0.67,   NA,
                          0.88,   NA,
                          0.90, 0.85,
                          0.74, 0.70,
                          0.54, 0.70),
      cost.factor = c(1.00, 1.00,
                      0.50, 0.50,
                      1.17,   NA,
                      1.09,   NA,
                      1.21, 1.24,
                      1.10, 1.12,
                        NA,   NA,
                      1.00,   NA,
                      1.00,   NA,
                      1.15, 1.15,
                      1.15, 1.15,
                      1.25, 1.25),
      cost.additional = c(0.0, 0.0,
                          0.0, 0.0,
                          0.0, 0.0,
                          0.0, 0.0,
                          0.0, 0.0,
                          0.0, 0.0,
                          0.0, 0.0,
                          2.5,  NA,
                          7.5,  NA,
                          0.0, 0.0,
                          0.0, 0.0,
                          0.0, 0.0)
    )

The type of code in which species is given.

  • "en": English species names
  • "nds": numeric species codes used in Lower Saxony, Germany.

The list with the available species' codes is provided by:

get_species_codes()

A vector with wood revenues per unit volume [EUR m-3]. The volume refers to the share of salable wood volume, which is provided by vol_salable().

wood_revenues(40,
              "beech")

# species codes Lower Saxony (Germany)
wood_revenues(40,
              211,
              species.code.type = "nds")

# vector input
wood_revenues(seq(20, 50, 5),
              "spruce")

wood_revenues(40,
              rep(c("beech", "spruce"),
                  each = 3),
              value.level = rep(1:3, 2))

# with calamity
wood_revenues(40,
              rep("spruce", 7),
              calamity.type = c("none",
                                "calamity.dieter.2001",
                                "ips.fuchs.2022a",
                                "ips.timely.fuchs.2022a",
                                "stand.damage.fuchs.2022b",
                                "regional.disturbance.fuchs.2022b",
                                "transregional.calamity.fuchs.2022b"))

# user-defined calamities with respective changes in wood revenues
wood_revenues(40,
              rep("spruce", 3),
              calamity.type = c("none",
                                "my.own.calamity.1",
                                "my.own.calamity.2"),
              calamity.factors = dplyr::tibble(
                calamity.type = rep(c("none",
                                      "my.own.calamity.1",
                                      "my.own.calamity.2"),
                                    each = 2),
                species.group = rep(c("softwood",
                                      "deciduous"),
                                    times = 3),
                revenues.factor = c(1.0, 1.0,
                                    0.8, 0.8,
                                    0.2, 0.2),
                cost.factor = c(1.0, 1.0,
                                1.5, 1.5,
                                1.0, 1.0),
                cost.additional = c(0, 0,
                                    0, 0,
                                    5, 5)))

# adapted market situation by providing alternative prices for the reference assortments
wood_revenues(40,
              c("oak", "beech", "spruce"))
wood_revenues(40,
              c("oak", "beech", "spruce"),
              price.ref.assortment = dplyr::tibble(
                species = c("oak", "beech", "spruce"),
                price.ref.assortment = c(300, 80, 50)))

The function estimates harvest costs per unit skidded volume [EUR m-3] applying the harvest costs model of v. Bodelschwingh (2018). Consequences of calamities are implemented based on Dieter (2001), Möllmann and Möhring (2017), Fuchs et al. (2022a), and Fuchs et al. (2022b).

The diameter- and species-sensitive harvest cost model was developed by v. Bodelschwingh (2018). It is based on data from KWF (2006) and AFL (2014). The fitted model function for the harvest costs h is:

with the quadratic mean diameter dq, the parameters a to c, and the maximum costs hmax. The parameter values depend on the species and the stand’s accessibility for logging operations (cost.level). The harvest costs were derived for a smaller number of economic species group. The species assignments differ from those for wood_revenues(). The species assignments are provided by:

get_species_codes()

The harvest costs are calculated under the assumption of combinations of logging methods, dependent on the quadratic mean of the tree diameters as well as the accessibility of the stand. The accessibility is considered in three cost levels (see Tab. 4). To avoid unusually high harvest costs at smaller diameters, v. Bodelschwingh (2018, Tab. 10) defined maximum harvest costs cmax (see Tab. 4).

cost.levelDefinitionMaximum Harvest Costs [EUR m-3]
3slope > 58 %80
2slope between 36 % and 58 % AND/OR moist sites70
1all other stands without special limitations60

A special strength of woodValuationDE is the consideration of consequences of disturbances and large-scale calamities. A broad set of previously published and newly derived quantitative effects of calamities is implemented. Additionally, users can implement their own assumptions. For the harvest costs, multiplicative factors as well as absolute summands can be used for implementing consequences of disturbances. The options that are implemented by default are listed in Tab. 5.

NameCost Factor SoftwoodAdditional Costs Softwood [EUR m-3]Cost Factor DeciduousAdditional Costs Deciduous [EUR m-3]ReferenceDetails
"none"1.000.001.000.00-default: no calamity
"calamity.dieter.2001"0.500.000.500.00Dieter (2001)Dieter (2001) assumed a reduction of the net revenues by 0.5 in case of calamities. In our model, this factor is therefore applied to reduce both wood revenues and harvest costs. Obviously this is counterintuitive for the harvest costs and thus to be used in combination with wood_revenues().
"fire.small.moellmann.2017"1.170.00NANAMöllmann and Möhring (2017)Based on a survey of forest managers in Germany, referring to damages by fire affecting only a few trees.
"fire.large.moellmann.2017"1.090.00NANAMöllmann and Möhring (2017)Based on a survey of forest managers in Germany, referring to damages by fire affecting at least one compartment.
"storm.small.moellmann.2017"1.210.001.240.00Möllmann and Möhring (2017)Based on a survey of forest managers in Germany, referring to damages by storm affecting only a few trees.
"storm.large.moellmann.2017"1.100.001.120.00Möllmann and Möhring (2017)Based on a survey of forest managers in Germany, referring to damages by storm affecting at least one compartment.
"insects.moellmann.2017"NANANANAMöllmann and Möhring (2017)Based on a survey of forest managers in Germany, referring to damages by insects.
"ips.fuchs.2022a"1.002.50NANAFuchs et al. (2022a)Assumption of higher harvest costs due to smaller, scattered logging operations.
"ips.timely.fuchs.2022a"1.007.50NANAFuchs et al. (2022a)Assumption of higher harvest costs due to smaller, scattered logging operations, but also including costs for debarking or chemically treating the logs afterwards.
"stand.damage.fuchs.2022b"1.1501.150Fuchs et al. (2022b)Assumption for damages in a single stand with smaller harvest volumes based on experience of HessenForst.
"regional.disturbance.fuchs.2022b"1.1501.150Fuchs et al. (2022b)Assumption for regional damages with smaller harvest volumes based on experience of HessenForst.
"transregional.calamity.fuchs.2022b"1.2501.250Fuchs et al. (2022b)Assumption for transregional damages with smaller harvest volumes and a high demand for timely harvest capacities, based on experience of HessenForst.

Apart from species.code.type, price.ref.assortment, and calamity.factors, all user inputs can be provided as single values or as a vector. If mixed, the single values will be recycled.

The quadratic mean3 of the diameter at breast height (dbh) of the harvested trees [cm].

The tree species, using one of the available species.code.types. Tab. 1 lists the most important genera and species implemented. Most species are assigned to economic species groups for valuation. A list of available species codes, and their assignments to valuation groups is provided by:

get_species_codes()

Accessibility of the stand for logging operations expressed as an integer of 1:3, with 1 for standard conditions without limitations, 2 for moist sites or sites with a slope between 36 % and 58 %, and 3 for slopes > 58 %. The cost.levels refer to the harvest cost model by v. Bodelschwingh (2018, Tab. 10). See also Tab. 4

Type of calamity or disturbance event in case of salvage harvests. This determines the assumption on the increase in harvest costs for salvage harvests. For the implemented options, see Tab.5. Alternatively, users can provide their own assumptions.

Summands [EUR m-3] and factors to consider the consequences of disturbances and calamities on wood revenues and harvest costs. "baseline" provides a tibble based on the references listed in Tab. 5. Alternatively, users can provide an own tibble with the same structure, which is illustrated by the "baseline" tibble:

calamity.factors <- dplyr::tibble(
      calamity.type = rep(c("none",
                            "calamity.dieter.2001",
                            "fire.small.moellmann.2017",
                            "fire.large.moellmann.2017",
                            "storm.small.moellmann.2017",
                            "storm.large.moellmann.2017",
                            "insects.moellmann.2017",
                            "ips.fuchs.2022a",
                            "ips.timely.fuchs.2022a",
                            "stand.damage.fuchs.2022b",
                            "regional.disturbance.fuchs.2022b",
                            "transregional.calamity.fuchs.2022b"),
                          each = 2),
      species.group = rep(c("softwood",
                            "deciduous"),
                          times = 12),
      revenues.factor = c(1.00, 1.00,
                          0.50, 0.50,
                          0.56,   NA,
                          0.56,   NA,
                          0.85, 0.79,
                          0.85, 0.79,
                          0.78,   NA,
                          0.67,   NA,
                          0.88,   NA,
                          0.90, 0.85,
                          0.74, 0.70,
                          0.54, 0.70),
      cost.factor = c(1.00, 1.00,
                      0.50, 0.50,
                      1.17,   NA,
                      1.09,   NA,
                      1.21, 1.24,
                      1.10, 1.12,
                        NA,   NA,
                      1.00,   NA,
                      1.00,   NA,
                      1.15, 1.15,
                      1.15, 1.15,
                      1.25, 1.25),
      cost.additional = c(0.0, 0.0,
                          0.0, 0.0,
                          0.0, 0.0,
                          0.0, 0.0,
                          0.0, 0.0,
                          0.0, 0.0,
                          0.0, 0.0,
                          2.5,  NA,
                          7.5,  NA,
                          0.0, 0.0,
                          0.0, 0.0,
                          0.0, 0.0)
    )

The type of code in which species is given.

  • "en": English species names
  • "nds": numeric species codes used in Lower Saxony, Germany.

The list with the available species codes is provided by:

get_species_codes()

A vector with harvest costs per unit volume [EUR m-3]. The volume refers to the share of skidded wood volume, provided by vol_skidded().

harvest_costs(40,
              "beech")

# species codes Lower Saxony (Germany)
harvest_costs(40,
              211,
              species.code.type = "nds")

# vector input
harvest_costs(seq(20, 50, 5),
              "spruce")

harvest_costs(40,
              rep(c("beech", "spruce"),
                  each = 3),
              cost.level = rep(1:3, 2))

harvest_costs(40,
              rep("spruce", 6),
              calamity.type = c("none",
                                "calamity.dieter.2001",
                                "ips.fuchs.2022a",
                                "ips.timely.fuchs.2022a",
                                "stand.damage.fuchs.2022b",
                                "regional.disturbance.fuchs.2022b",
                                "transregional.calamity.fuchs.2022b"))

# user-defined calamities with respective changes in harvest costs
harvest_costs(40,
              rep("spruce", 3),
              calamity.type = c("none",
                                "my.own.calamity.1",
                                "my.own.calamity.2"),
              calamity.factors = dplyr::tibble(
                calamity.type = rep(c("none",
                                      "my.own.calamity.1",
                                      "my.own.calamity.2"),
                                    each = 2),
                species.group = rep(c("softwood",
                                      "deciduous"),
                                    times = 3),
                revenues.factor = c(1.0, 1.0,
                                    0.8, 0.8,
                                    0.2, 0.2),
                cost.factor = c(1.0, 1.0,
                                1.5, 1.5,
                                1.0, 1.0),
                cost.additional = c(0, 0,
                                    0, 0,
                                    5, 5)))

The function is a wrapper for the entire procedure of wood valuation implemented in woodValuationDE. It estimates the share of salable (for revenues) and skidded volume (for harvest costs) as well as the wood revenues and harvest costs per unit volume. Finally, it derives the net revenues for the user-provided volume (referring to the volume over bark).

The function applies the previously described models implemented in the functions vol_salable(), vol_skidded(), wood_revenues(), and harvest_costs().

Wood volume [m3], referring to volume over bark of the trees to be harvested (German unit Vfm m.R.) as usually provided by yield tables and single-tree simulation models.

The quadratic mean3 of the diameter at breast height (dbh) of the harvested trees [cm].

The tree species, using one of the available species.code.types. Tab. 1 lists the most important genera and species implemented. Most species are assigned to economic species groups for valuation. A list of available species codes, and their assignments to valuation groups is provided by:

get_species_codes()

Stand quality, expressed as an integer value of 1:3:

  • 1: extraordinarily high stand quality with high shares of wood suitable, e.g., for furniture
  • 2: moderate quality
  • 3: low quality (e.g. trees with thick branches)

The value.levels refer to the applied assortment tables (Offer and Staupendahl, 2018).

Accessibility of the stand for logging operations expressed as an integer of 1:3, with 1 for standard conditions without limitations, 2 for moist sites or sites with a slope between 36 % and 58 %, and 3 for slopes > 58 %. The cost.levels refer to the harvest cost model by v. Bodelschwingh (2018, Tab. 10). See also Tab. 4

Logging method:

  • "manually": motor-manual logging using a chain saw
  • "harvester": highly mechanized logging using forest harvesters
  • "combined": a combination of the previous methods dependent on the mean diameter

The logging methods "manually" and "harvester" refer to Offer and Staupendahl (2018) and v. Bodelschwingh (2018). Since, e.g., for deciduous species a maximum diameter of 40 cm is assumed for highly mechanized logging, Fuchs et al. (2023) derived the method "combined". This refers to combinations, as applied by v. Bodelschwingh (2018) in the harvest cost model, assuming diameter-specific proportions of motor-manual and highly mechanized logging:

  • softwood species
    • diameter.q <= 20 cm: 100 % "harvester",
    • 20 cm < diameter.q < 50 cm: linear increase of "manually", maximum 50 %,
    • diameter.q >= 50 cm: 50 % "harvester" and 50 % "manually".
  • deciduous species
    • diameter.q <= 20 cm: 100 % "harvester",
    • 20 cm < diameter.q < 40 cm: linear increase of "manually", maximum 100 %,
    • diameter.q >= 40 cm: 100 % "manually".

Wood price of the reference assortments allowing for the consideration of market fluctuations. Default is "baseline", which refers to the prices from 2010 to 2015 in Hesse, Germany according to v. Bodelschwingh (2018), listed in Tab. 2. Alternatively, users can provide a tibble with the same structure, which is illustrated by the "baseline" tibble:

prices.ref.assortments <- dplyr::tibble(
      species = c(110, 211, 511, 711, 611,
                  811, 410, 421, 311, 430),
      price.ref.assortment = c(277.41, 75.75, 92.47, 71.48, 92.23,
                               83.29, 72.13, 98.90, 112.88, 45.43))

Type of calamity or disturbance event in case of salvage harvests. This determines the applied reductions for salvage revenues. For the implemented options, see Tab.3. Alternatively, users can provide their own factors.

Summands [EUR m-3] and factors to consider the consequences of disturbances and calamities on wood revenues and harvest costs. "baseline" provides a tibble based on the references listed in Tab. 5. Alternatively, users can provide an own tibble with the same structure, which is illustrated by the "baseline" tibble:

calamity.factors <- dplyr::tibble(
      calamity.type = rep(c("none",
                            "calamity.dieter.2001",
                            "fire.small.moellmann.2017",
                            "fire.large.moellmann.2017",
                            "storm.small.moellmann.2017",
                            "storm.large.moellmann.2017",
                            "insects.moellmann.2017",
                            "ips.fuchs.2022a",
                            "ips.timely.fuchs.2022a",
                            "stand.damage.fuchs.2022b",
                            "regional.disturbance.fuchs.2022b",
                            "transregional.calamity.fuchs.2022b"),
                          each = 2),
      species.group = rep(c("softwood",
                            "deciduous"),
                          times = 12),
      revenues.factor = c(1.00, 1.00,
                          0.50, 0.50,
                          0.56,   NA,
                          0.56,   NA,
                          0.85, 0.79,
                          0.85, 0.79,
                          0.78,   NA,
                          0.67,   NA,
                          0.88,   NA,
                          0.90, 0.85,
                          0.74, 0.70,
                          0.54, 0.70),
      cost.factor = c(1.00, 1.00,
                      0.50, 0.50,
                      1.17,   NA,
                      1.09,   NA,
                      1.21, 1.24,
                      1.10, 1.12,
                        NA,   NA,
                      1.00,   NA,
                      1.00,   NA,
                      1.15, 1.15,
                      1.15, 1.15,
                      1.25, 1.25),
      cost.additional = c(0.0, 0.0,
                          0.0, 0.0,
                          0.0, 0.0,
                          0.0, 0.0,
                          0.0, 0.0,
                          0.0, 0.0,
                          0.0, 0.0,
                          2.5,  NA,
                          7.5,  NA,
                          0.0, 0.0,
                          0.0, 0.0,
                          0.0, 0.0)
    )

The type of code in which species is given.

  • "en": English species names
  • "nds": numeric species codes used in Lower Saxony, Germany.

The list with the available species' codes is provided by:

get_species_codes()

A tibble with all steps of the wood valuation (harvest quantities, harvest costs per unit skidded volume [EUR m-3], wood revenues per unit salable volume [EUR m-3], and total net revenues [EUR]).

wood_valuation(1,
               40,
               "beech")

# species codes Lower Saxony (Germany)
wood_valuation(seq(10, 70, 20),
               40,
               211,
               species.code.type = "nds")

# vector input
wood_valuation(10,
               seq(20, 50, 5),
               "spruce")

wood_valuation(10,
               40,
               rep(c("beech", "spruce"),
                   each = 9),
               value.level = rep(rep(1:3, 2),
                                 each = 3),
               cost.level = rep(1:3, 6))

wood_valuation(10,
               40,
               rep("spruce", 6),
               calamity.type = c("none",
                                 "ips.fuchs.2022a",
                                 "ips.timely.fuchs.2022a",
                                 "stand.damage.fuchs.2022b",
                                 "regional.disturbance.fuchs.2022b",
                                 "transregional.calamity.fuchs.2022b"))

# user-defined calamities with respective changes in harvest costs and wood revenues
wood_valuation(10,
               40,
               rep("spruce", 3),
               calamity.type = c("none",
                                 "my.own.calamity.1",
                                 "my.own.calamity.2"),
               calamity.factors = dplyr::tibble(
                 calamity.type = rep(c("none",
                                       "my.own.calamity.1",
                                       "my.own.calamity.2"),
                                     each = 2),
                 species.group = rep(c("softwood",
                                       "deciduous"),
                                     times = 3),
                 revenues.factor = c(1.0, 1.0,
                                     0.8, 0.8,
                                     0.2, 0.2),
                 cost.factor = c(1.0, 1.0,
                                 1.5, 1.5,
                                 1.0, 1.0),
                 cost.additional = c(0, 0,
                                     0, 0,
                                     5, 5)))

# adapted market situation by 

Copy Link

Version

Install

install.packages('woodValuationDE')

Monthly Downloads

130

Version

1.0.2

License

MIT + file LICENSE

Issues

Pull Requests

Stars

Forks

Maintainer

Jasper M. Fuchs

Last Published

June 17th, 2024

Functions in woodValuationDE (1.0.2)

vol_salable

Relative share in the volume over bark that is salable
wood_revenues

Wood revenues per cubic meter salable volume
vol_assortment

Relative volume share of different assortments
vol_skidded

Relative share in the volume over bark that is skidded
wood_valuation

All steps of the monetary valuation of wood volumes over bark
wood_net_revenues

Net revenues for wood volumes over bark
get_species_codes

Available species in woodValuationDE, their codes, and parameter assignments
harvest_costs

Harvest costs per cubic meter skidded volume