knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)

Introduction

Rfuels is a small package for estimating surface fuel loads from Brown's transects (a.k.a. line-intercept transects) in forests dominated by Sierra Nevada conifer species.

The common protocols for sampling surface fuels in forest ecosystems directly describe the fuel load in terms of duff/litter depth, counts of fine woody fuels, and surveys of coarse woody debris. However, many uses of these data (e.g. fire behavior models and carbon accounting) require the fuel load to be expressed in terms of mass of surface fuels per unit area.

Brown (1974) described a general-purpose set of equations to estimate fuel loads from transect data. Rfuels uses the species composition of the local overstory to improve the fuel load estimates from Brown's transects.

See "Using Rfuels" for information about data requirements and using the package, and see "Background Information" for a more detailed description of the estimation method.

Installing Rfuels

Someday, Rfuels may appear on the CRAN repository. For now, you can install Rfuels from the GitHub repo:

# install the 'devtools' package
install.packages("devtools")

# load the 'devtools' package
library(devtools)

# install Rfuels
devtools::install_github('danfosterfire/Rfuels')

Then you can load the Rfuels package with:

library(Rfuels)

Using Rfuels

Rfuels provides a high-level wrapper function, estimate_fuel_loads(), which
takes three arguments:

estimate_fuel_loads() will return a tidy dataframe, with each row a unique observation (a fuels transect sampled on a specific date) and columns describing the surface fuel load in various subcategories.

Data Requirements

Rfuels imposes very specific requirements on the type and format of input data, so read this section carefully!

Fuels Data

Surface fuels should be recorded in the field following Brown (1974) or a similar method. The specifics of transect lengths, number of transects per plot, and the number of litter and duff samples per transect are variable, but the broad outline is common:

Rfuels requires the input fuels data to be formatted as a dataframe with a row for each observation (a transect on a specific date). The dataframe must have at least these columns (column names are exact):

Additionally, the dataframe may have a column for slope_percent, the slope (in percent) along the transect. Brown's equations include the option to correct for the slope effect on horizontal length of transects. Keep in mind that this correction factor applies to the transect slope, not the plot slope. If a slope_percent is not supplied, we set the slope correction factor to 1 (no slope).

Trees Data

The dataframe must have a row for each observation of each individual tree on each sampling date (this format is commonly called a "treelist"). The treelist must have at least these columns:

Load Data

Our nice example data are .csv files which are already properly formatted:

# load the example fuels data from the .csv file
example_fuels_data = read.csv(file = 'path/to/your/data/fuels.csv',
                              stringsAsFactors = TRUE)

# load the example trees data from the .csv file
example_trees_data = read.csv(file = 'path/to/your/data/trees.csv',
                              stringsAsFactors = TRUE)

And here's what the example data look like:

# load the example fuels data from the .csv file
example_fuels_data = 
  utils::read.csv(file = system.file('extdata', 'example_fuels.csv', 
                                      package = 'Rfuels'),
                  stringsAsFactors = TRUE)



# load the example trees data from the .csv file
example_trees_data = 
  utils::read.csv(file = system.file('extdata', 'example_treelist.csv',
                                     package = 'Rfuels'),
                  stringsAsFactors = TRUE)
head(example_fuels_data)

head(example_trees_data)

Call estimate_fuel_loads()

Once your input data are properly formatted, you can call estimate_fuel_loads() and assign the resulting dataframe to a variable:

transect_fuel_loads =  

  estimate_fuel_loads(fuels_data = example_fuels_data,
                      trees_data = example_trees_data,
                      results_type = 'results_only')

We got a message about the type of results returned, and also a warning about our input treelist. Our dataset includes Quercus kelloggii, which isn't one of the tree species for which we have empirical data to plug into the fuel load estimations. estimate_fuel_loads() makes a best-guess and counts all unrecognized tree species as 'OTHER', and applies the "All species" generic coefficients from Van Wagtendonk et al. (1996) and (1998).

(How appropriate it is to apply an 'all species' constant for Sierra Nevada conifers to black oak fuels is another question; hopefully in the future we can expand the empirical dataset Rfuels draws upon.)

Now we have a dataframe with the fuel load (and some overstory information) for each transect in each year:

head(transect_fuel_loads)

Results details

The results_only dataframe (the default) includes the following columns:

The results_full dataframe includes all of the above, plus these additonal columns describing the directly observed values and some intermediate calculations:

Finally, the fuels_only dataframe includes only the observation identification columns (plot_id, inv_date, and azimuth) and the columns for the various fuel load categories.

Working with fuel load data

under construction

Background Information

This method for calculating fuel loads from Brown's transects was originally described in Stephens (2001). Specifically:

"Surface and ground fuel loads were calculated by using appropriate equations developed for Sierra Nevada forests (van Wagtendonk et al. 1996, 1998). Coefficients required to calculate all surface and ground fuel loads were arithmetically weighted by the basal area fraction (percentage of total basal area by species) to produce accurate estimates of fuel loads (Jan van Wagtendonk, personal communication, 1999)."

Since then, the method has been used repeatedly in other publications, particularly those related to the Fire-Fire-Surrogate study at Blodgett Forest Reserach Station, e.g. Stephens and Moghaddas (2005) and Stephens et al. (2012). At some point, Jason Moghaddas constructed an excel workbook (with included macros) to facilitate use of the method for new datasets.

The this package implements the method in R, using Moghaddas' implementation (and various publications) for reference. The goal of this effort is to make the method more accessible, transparent, and reproducible for use in future research.

This method requires Brown's transect data and plot (or stand) level overstory data. Brown (1974) describes the widely used fuels transect sampling protocol and provides equations used to calculate fuel loads for woody debris from the transect samples.

The general idea of Stephens's modification of the method is to refine the fuel load estimates by using overstory data to improve the accuracy of coefficents used in Brown's equations to calculate fuel loads from transect data. Specifically, QMD, SEC, and SG are coefficients which vary by the species that is the fuel source, and so better estimates can (presumably) be derived by using species-weighted-average values for QMD, SEC, and SG rather than using Brown's given values, which are generalized for entire regions. (See below for definitions of QMD, SEC, and SG.)

Note: This implementation of the method assumes the user is working in the Sierra Nevada. Any species not included in the Van Wagtendonk et al. tables below is assigned their "All Species" value by default. Also, per the usage of Moghaddas' spreadsheet for previous studies, I have elected to include both live and dead trees in the basal-area calculations for the purposes of calculating fuel loads.

This method breaks forest fuels into three main categories, each of which has a particular implementation for calculating the fuel load represented by transect samples.

Litter and Duff

Litter and duff are measured as depths as specific points along a sampling transect. Van Wagtendonk (1998) developed regressions for litter, Duff, and combined-litter-and-duff loading (kg/$m^2$) as a function of depth (cm) for 19 different Sierra Nevada conifer species:

knitr::kable(Rfuels:::litterduff_coeffs,
             caption = 'Van Wagtendonk et al. (1998) Table 7: Regression statistics for litter, duff, and litter and duff weight (kg m-2) as a function of their respective depths (cm) for 19 Sierra Nevada conifers')

The fuel load represented by a depth measurement under a mixed-species overstory can be estimated using the equation

$$F_{d,plot} = d * Coeff_{plot}$$

where:

We can calculate $Coeff_{plot}$ by averaging together the different species-specific coefficients for each tree species contributing fuel to the plot, weighted by their local prevalence. Specifically, we weight each species' coefficient by the proportion of total basal area contributed by that species:

$$Coeff_{plot} = \sum_{spp}{[(\frac{BA_{spp}}{BA_{total}})*Coeff_{spp}]}$$

Where

This esimate of the fuel load represented by the transect can be averaged with other transects at the same plot (which will have the same value for $Coeff_{plot}$, but different values for d) to generate plot-level estimates of fuel load, which can themselves be averaged to generate unit-level estimates of fuel load, depending on the user's study design.

Fine Woody Debris: 1-hour, 10-hour, and 100-hour fuels

Calculating fuel loads represented by transect counts of 1-hour, 10-hour, and 100-hour fuels is more complicated, but follows the same principle as described for litter and duff above. The different timelag classes (which correspond to size classes of 0.0-0.64cm, 0.64-2.54cm, and 2.54-7.62cm, respectively) must be calculated separately but in a common manner.

Van Wagtendonk et al. (1996) give the equation (modified from Brown 1974):

$$W = \frac{constQMDSECSLPSG*n}{length}$$

Where:

Procedures for calculating these values are described below. QMD, SEC, and SG all vary by timelag classification, and so W is calculated individually for each timelag (1h, 10h, and 100h).

Const (k-values)

Equation constant k ("const" in van Wagtendonk 1996 and Brown 1974) for sampled units and output units. These values for k are from van Wagner (1982), and these are used by forest service per Woodall and Williams (2008). (These values are also consistent with Moghaddas' work.)

knitr::kable(Rfuels:::kvals,
             caption = 'Van Wagner (1982) Table 1: Equation constant k for some length, volume, and weight units in line intersect sampling')

QMD (Quadratic mean diameter in centimeters squared)

QMD, SEC, and SG vary by species and timelag classification of the fuel being totaled. Values for specific species/timelag for fine woody fuels are drawn from van Wagtendonk (1996).

knitr::kable(Rfuels:::QMDcm,
             caption = 'Van Wagtendonk et al. (1996) Table 3: Average squared quadratic mean diameter by fuel size class for 19 Sierra Nevada conifers')

These constants are used in combination with overstory data to create an aggregate estimate of QMD, an average of the various species' QMD estimates (from Van Wagtendonk et al.) weighted by the proportion of stand basal area occupied by each species. See the following formula:

$$QMD_{plot,timelag} = \sum_{species=spp}{PropBA_{spp,plot}*QMD_{spp,timelag}}$$

Where

SEC (secant of acute angle)

knitr::kable(Rfuels:::SEC,
             caption = 'Van Wagtendonk et al. (1996) Table 6: Average secant of acute angles of inclination of nonhorizontal particles by fuel size class for 19 Sierra Nevada conifers')

A propotion-BA-weighted average of SEC is generated in the same way as QMD above.

SG (specific gravity)

Note that van Wagtendonk et al. found that "species was not significant for the 7.62+cm (3+ in) rotten fuels." and that the average specific gravity for rotten fuels was .36, which is here included as a value.

knitr::kable(Rfuels:::SG,
             caption = 'Van Wagtendonk et al. (1996) Table 8: Average specific gravity by fuel size class for 19 Sierra Nevada conifers')

A propotion-BA-weighted average of SEC is generated in the same way as QMD above.

SLP (slope correction factor)

SLP varies by the plot location and transect azimuth, $SLP = c = \sqrt{1+(\frac{percentslope}{100})^2}$ per Brown 1974. This is a simple adjustment for the influence of slope on transect length.

length

length is the length of the sampling transect, and varies by the sampling protocol (which may vary from year-to-year) and the timelag class.

n

n is the number of intersections of the given timeclass in the plane of the transect.

Coarse Woody Debris: 1000-hour fuels

Brown (1974) gives:

$$W_{1000h} = \frac{11.64\sum{d^2}sac}{N*l}$$

and notes:

"For material 3 inches and larger, square the diameter of each intersected piece and sum the squared values ($\sum{d^2}$) for all pieces in the sampled area. Compute $\sum{d^2}$ separately for sound and rotten categories. To obtain weights or volumes for certain diameter ranges (3 to 9 inches, for example), compute $\sum{d^2}$ for the specified range."

This equation is just a special case of the equations given above for 1-100 hour fuels. 11.64 is a unit conversion factor for US units (const as above), s is the specific gravity of the fuel (SG as above), a is a value for the secant angle (SEC as above), and c is the slope correction factor (SLP as above). N is the number of transects represented in the calculation, and is assumed to be 1 in this method. l is the transect length, as described above.

The difference is that instead of counted intercepts and an average squared quadratic mean diameter, we have the actual sum of squared diameters from the measurements directly.

For sound 1000-hour fuels, we can substitute the BA-weighted-average for a specific transect's overstory and re-arrange the equation:

$$W_{1000S} = (\sum{d^2})(\frac{constSLP}{length})\sum_{spp}{(\frac{BA_{spp}}{BA_{total}})SEC_{spp,1000s})}(\sum_{spp}{(\frac{BA_{spp}}{BA_{total}})SG_{spp,1000s}})$$

van Wagtendonk 1998 give species-specific values for QMD, SEC, and SG, for both 1000-hour sound and 1000-hour rotten fuels.

Users who have diameter measurements for 1000-hour fuels (which is a standard sampling protocol) have actual diameter measurements, and don't need the by-species QMD averages from Van Wagtendonk et al. (1996).

Van Wagtendonk et al. (1996) do not discuss sound vs. rotten 1000-hour fuels, stating only that "The average secant of the acute angle to the horizontal for the 7.62+ cm (3+in) size class for all species was 2.67 (Table 6)." However, actually referring to table six gives very different data, with by-species averages recorded and varying from 1.00 to 1.06, with an average of 1.02. I believe the text is in error (2.67 bears no resemblance to the data given in the table, but it is 7.62 reversed.)

For SG, "The average specific gravity for rotten fuels was .36." and "species was not significant for the 7.62+ cm (3+ in) rotten fuels." Specific gravities by species for sound 1000-hour fuels are given in Van Wagtendonk et al. (1996), Table 8.

References



danfosterfire/Rfuels documentation built on May 28, 2019, 11:04 p.m.