Title: | Analyzing Pointer Years and Components of Resilience |
---|---|
Description: | Functions to calculate and plot event and pointer years as well as resilience indices. Designed for dendroecological applications, but also suitable to analyze patterns in other ecological time series. |
Authors: | Marieke van der Maaten-Theunissen [aut, cph, cre, trl], Ernst van der Maaten [aut, trl], Gottfried Jetsckhe [aut, trl], Mario Trouillier [aut, trl] |
Maintainer: | Marieke van der Maaten-Theunissen <[email protected]> |
License: | GPL (>= 2) |
Version: | 2.0.2 |
Built: | 2024-12-22 06:46:53 UTC |
Source: | CRAN |
The function creates a dot plot showing positive and (or) negative event years from a list
of the type as produced by pointer.norm
or pointer.rgc
.
event.plot(list.name, sign = c("both", "pos", "neg"), period = NULL, x.tick.major = 10, x.tick.minor = 5)
event.plot(list.name, sign = c("both", "pos", "neg"), period = NULL, x.tick.major = 10, x.tick.minor = 5)
list.name |
a |
sign |
a |
period |
a |
x.tick.major |
an |
x.tick.minor |
an |
The function makes a dot plot showing event years for individual trees. Positive and negative event years are indicated with different symbols and (or) colors.
Dot plot.
Marieke van der Maaten-Theunissen and Ernst van der Maaten.
## Plot event years from pointer.rgc output data(s033) py <- pointer.rgc(s033) event.plot(py) ## Plot negative event years from pointer.norm output (method "Neuwirth") for a specific period data(s033) detr_s033 <- detrend(s033, method = "Spline", nyrs = 30) pyn <- pointer.norm(detr_s033, method.thresh = "Neuwirth") event.plot(pyn, sign = "neg", period = c(1950, 2007))
## Plot event years from pointer.rgc output data(s033) py <- pointer.rgc(s033) event.plot(py) ## Plot negative event years from pointer.norm output (method "Neuwirth") for a specific period data(s033) detr_s033 <- detrend(s033, method = "Spline", nyrs = 30) pyn <- pointer.norm(detr_s033, method.thresh = "Neuwirth") event.plot(pyn, sign = "neg", period = c(1950, 2007))
The function calculates year-to-year growth changes for individual tree-ring series and defines interval trends for (the population of) trees using the pointer interval method according to Schweingruber et al. (1990), which is also extensively described in Jetschke et al. (2019). The minimum percentual growth change and the minimum percentage of trees that should display a negative (or positive) trend for that year to be considered as negative (or positive) pointer year, can be adjusted.
interval.trend(data, period = NULL, trend.thresh = 0, IT.thresh = 95, make.plot = FALSE)
interval.trend(data, period = NULL, trend.thresh = 0, IT.thresh = 95, make.plot = FALSE)
data |
a |
period |
a |
trend.thresh |
a |
IT.thresh |
a |
make.plot |
a |
The function calculates year-to-year growth changes. For each tree and year, the interval trend is defined as 1 if a positive change exceeds trend.thresh
, as 0 if a negative change falls below minus trend.thresh
and as 0.5 if the absolute change is below trend.thresh
. trend.thresh
defaults to 0%. The interval trend for a population is defined as the average interval trend of the individual trees. A year is considered a negative (or positive) pointer year if the percentage of trees showing a decreasing (or increasing) trend exceeds IT.thresh
(defaults to 95%). Hence, in case of a negative pointer year the mean overall interval trend falls below 1 - IT.thresh
, for a positive pointer year the mean overall interval trend exceeds IT.thresh
.
The function returns a list
containing the following components:
perc.diff |
a |
ITvalues |
a |
out |
a |
spec.param |
a |
Marieke van der Maaten-Theunissen, Ernst van der Maaten and Gottfried Jetschke.
Jetschke, G., van der Maaten, E. and van der Maaten-Theunissen, M. (2019) Towards the extremes: a critical analysis of pointer year detection methods. Dendrochronologia 53: 55-62.
Schweingruber, F.H., Eckstein, D., Serre-Bachet, F. and Bräker, O.U. (1990) Identification, presentation and interpretation of event years and pointer years in dendrochronology. Dendrochronologia 8: 9-38.
## Calculate pointer years using interval.trend ## for a specified period and create a plot data(s033) IT <- interval.trend(s033, period = c(1950,2010), make.plot = TRUE) ## Calculate pointer years as years with at least 90% of the trees ## showing a positive/negative interval trend data(s033) IT <- interval.trend(s033, IT.thresh = 90) IT$out[which(IT$out$nature == 1),"year"] IT$out[which(IT$out$nature == -1),"year"]
## Calculate pointer years using interval.trend ## for a specified period and create a plot data(s033) IT <- interval.trend(s033, period = c(1950,2010), make.plot = TRUE) ## Calculate pointer years as years with at least 90% of the trees ## showing a positive/negative interval trend data(s033) IT <- interval.trend(s033, IT.thresh = 90) IT$out[which(IT$out$nature == 1),"year"] IT$out[which(IT$out$nature == -1),"year"]
The function applies a 13-year weighted low-pass filter, as described by Fritts (1976), on a data.frame
with tree-ring series.
lowpass13(data)
lowpass13(data)
data |
a |
A 13-year weighted low-pass filter, as described by Fritts (1976, p. 270), can be applied to tree-ring series prior to the calculation of event and pointer years using pointer.norm
. According to Cropper (1979), such a filter improves the detection of event and pointer years for complacent series, whereas for sensitive series filtering has little effect.
Note that the resulting time series are truncated by 6 years at both ends inherent to the calculation method.
The function returns a data.frame
with 13-year low-pass filtered index series.
Marieke van der Maaten-Theunissen and Ernst van der Maaten.
Cropper, J.P. (1979) Tree-ring skeleton plotting by computer. Tree-Ring Bulletin 39: 47-59.
Fritts, H.C. (1976) Tree rings and climate. Academic Press Inc. (London) Ltd.
data(s033) lp13_s033 <- lowpass13(s033)
data(s033) lp13_s033 <- lowpass13(s033)
The function calculates event and pointer years on a data.frame
with tree-ring series using the normalization in a moving window method introduced by Cropper (1979; cf. Schweingruber et al. 1990, Jetschke et al. 2019). This method locally z-transforms tree growth in year i
within a symmetric moving window of n
years, thereby providing the number of standard deviations that tree growth deviates in individual years (Cropper values, Ct) from the window average. To identify event years, one absolute threshold on the number of standard deviations can be set (Cropper 1979), or, alternatively, three intensity classes (Neuwirth et al. 2007). Threshold values for defining event and pointer years can be adjusted.
Prior to the calculation of event and pointer years with pointer.norm
, a 13-year weighted low-pass filter, as described by Fritts (1976), may be applied on the tree-ring series using lowpass13
. According to Cropper (1979), such a filter improves the detection of event and pointer years for complacent series, whereas for sensitive series filtering has little effect. Alternatively, a flexible detrending (e.g., using a cubic-smoothing spline with a 50% frequency cut-off at 15 years) may be applied prior to pointer.norm
.
pointer.norm(data, period = NULL, window = 13, method.thresh = c("Cropper", "Neuwirth"), C.thresh = 0.75, N.thresh = c(1, 1.28, 1.645), series.thresh = 75, make.plot = FALSE)
pointer.norm(data, period = NULL, window = 13, method.thresh = c("Cropper", "Neuwirth"), C.thresh = 0.75, N.thresh = c(1, 1.28, 1.645), series.thresh = 75, make.plot = FALSE)
data |
a |
period |
a |
window |
an |
method.thresh |
a |
C.thresh |
a (positive) |
N.thresh |
a |
series.thresh |
a |
make.plot |
a |
The function locally z-transforms tree growth in year i
within a symmetric moving window of n
years. For method.thresh
"Cropper"
, event years are defined as those years having absolute Cropper values (Ct) above a specified threshold (defaults to |Ct| > 0.75). For method.thresh
"Neuwirth"
, three classes of distinct growth deviations can be defined, being 'weak', 'strong' and 'extreme' (defaults to |Ct| > 1, |Ct| > 1.28, and |Ct| > 1.645). The window size can be adjusted (defaults to 13 years), as well as the minimum percentage of trees that should display a positive (or negative) event year for that year to be considered as positive (or negative) pointer year (defaults to 75%).
Note that the resulting time series are truncated by (window-1)/2
at both ends inherent to the calculation method.
The function returns a list
containing the following components:
for method.thresh
"Cropper"
:
Cvalues |
a |
EYvalues |
a |
out |
a |
spec.param |
a |
for method.thresh
"Neuwirth"
:
Cvalues |
a |
EYvalues |
a |
out |
a |
spec.param |
a |
Marieke van der Maaten-Theunissen and Ernst van der Maaten.
Cropper, J.P. (1979) Tree-ring skeleton plotting by computer. Tree-Ring Bulletin 39: 47-59.
Jetschke, G., van der Maaten, E. and van der Maaten-Theunissen, M. (2019) Towards the extremes: A critical analysis of pointer year detection methods. Dendrochronologia 53: 55-62.
Fritts, H.C. (1976) Tree rings and climate. Academic Press Inc. (London) Ltd.
Neuwirth, B., Schweingruber, F.H. and Winiger, M. (2007) Spatial patterns of central European pointer years from 1901 to 1971. Dendrochronologia 24: 79-89.
Schweingruber, F.H., Eckstein, D., Serre-Bachet, F. and Bräker, O.U. (1990) Identification, presentation and interpretation of event years and pointer years in dendrochronology. Dendrochronologia 8: 9-38.
## Calculate pointer years on detrended tree-ring series using method.thresh "Cropper" ## and a user-defined threshold for event-year definition of 1 data(s033) detr_s033 <- detrend(s033, method = "Spline", nyrs = 30) pyc <- pointer.norm(detr_s033, method.thresh = "Cropper", C.thresh = 1) head(pyc$out) ## Calculate pointer years on detrended tree-ring series using method.thresh "Neuwirth" ## and a user-defined window of 11 years data(s033) detr_s033 <- detrend(s033, method = "Spline", nyrs = 30) pyn <- pointer.norm(detr_s033, window = 11, method.thresh = "Neuwirth", make.plot = TRUE) head(pyn$out)
## Calculate pointer years on detrended tree-ring series using method.thresh "Cropper" ## and a user-defined threshold for event-year definition of 1 data(s033) detr_s033 <- detrend(s033, method = "Spline", nyrs = 30) pyc <- pointer.norm(detr_s033, method.thresh = "Cropper", C.thresh = 1) head(pyc$out) ## Calculate pointer years on detrended tree-ring series using method.thresh "Neuwirth" ## and a user-defined window of 11 years data(s033) detr_s033 <- detrend(s033, method = "Spline", nyrs = 30) pyn <- pointer.norm(detr_s033, window = 11, method.thresh = "Neuwirth", make.plot = TRUE) head(pyn$out)
The function creates a dot plot showing positive and (or) negative pointer years from lists
of the type as produced by pointer.norm
, pointer.rgc
, pointer.zchron
and (or) interval.trend
.
pointer.plot(list.sites, sign = c("both", "pos", "neg"), period = NULL, labels = NULL, x.tick.major = 10, x.tick.minor = 5)
pointer.plot(list.sites, sign = c("both", "pos", "neg"), period = NULL, labels = NULL, x.tick.major = 10, x.tick.minor = 5)
list.sites |
a |
sign |
a |
period |
a |
labels |
a |
x.tick.major |
an |
x.tick.minor |
an |
The function makes a dot plot showing pointer years for multiple sites. Positive and negative pointer years are indicated with different symbols an (or) colors.
Dot plot.
Marieke van der Maaten-Theunissen and Ernst van der Maaten.
## Plot negative pointer years for multiple sites (or different methods) data(s033) detr_s033 <- detrend(s033, method = "Spline", nyrs = 30) py <- pointer.rgc(s033) pyn <- pointer.norm(detr_s033, method = "Neuwirth") it <- interval.trend(s033) zchron <- pointer.zchron(detr_s033) comparison <- list(py, pyn, it, zchron) pointer.plot(comparison, sign = "neg", period = c(1950, 2013), labels = c("py", "pyn", "it", "zchron")) ## Plot pointer years for different specifications of pointer.norm (method "Neuwirth") data(s033) w09 <- pointer.norm(detr_s033, window = 9, method.thresh = "Neuwirth") w11 <- pointer.norm(detr_s033, window = 11, method.thresh = "Neuwirth") w13 <- pointer.norm(detr_s033, method.thresh = "Neuwirth") comparison <- list(w09, w11, w13) pointer.plot(comparison, period = c(1950, 2007))
## Plot negative pointer years for multiple sites (or different methods) data(s033) detr_s033 <- detrend(s033, method = "Spline", nyrs = 30) py <- pointer.rgc(s033) pyn <- pointer.norm(detr_s033, method = "Neuwirth") it <- interval.trend(s033) zchron <- pointer.zchron(detr_s033) comparison <- list(py, pyn, it, zchron) pointer.plot(comparison, sign = "neg", period = c(1950, 2013), labels = c("py", "pyn", "it", "zchron")) ## Plot pointer years for different specifications of pointer.norm (method "Neuwirth") data(s033) w09 <- pointer.norm(detr_s033, window = 9, method.thresh = "Neuwirth") w11 <- pointer.norm(detr_s033, window = 11, method.thresh = "Neuwirth") w13 <- pointer.norm(detr_s033, method.thresh = "Neuwirth") comparison <- list(w09, w11, w13) pointer.plot(comparison, period = c(1950, 2007))
The function calculates event and pointer years on a data.frame
with tree-ring series using the relative growth change method, described as abrupt growth change method in Schweingruber et al. (1990). This method relates tree growth in year i
to the average growth of n
preceding years. Thresholds for event- and pointer-year calculations can be adjusted.
pointer.rgc(data, period = NULL, nb.yrs = 4, rgc.thresh.pos = 60, rgc.thresh.neg = 40, series.thresh = 75, make.plot = FALSE)
pointer.rgc(data, period = NULL, nb.yrs = 4, rgc.thresh.pos = 60, rgc.thresh.neg = 40, series.thresh = 75, make.plot = FALSE)
data |
a |
period |
a |
nb.yrs |
an |
rgc.thresh.pos |
a |
rgc.thresh.neg |
a |
series.thresh |
a |
make.plot |
a |
The function calculates the ratio of tree growth in year t
and the average growth of n
preceding years for individual trees. Resulting relative growth changes are used to identify event years for trees, and these event years to define pointer years for the site.
Following Schweingruber et al. (1990), nb.yrs
, rgc.thresh.pos
, rgc.thresh.neg
and series.thresh
are set to 4, 60, 40 and 75 respectively, meaning that a positive or negative pointer year will be defined when at least 75% of the tree-ring series display an event year with a growth increase or decrease of at least 60% or 40%, respectively, relative to the average growth in the four preceding years. Depending on the sensitivity of the tree-ring series, the thresholds rgc.thresh.pos
and rgc.thresh.neg
may be adjusted (e.g., lowered for more complacent series; Jetschke et al. 2019).
Note that the resulting time series are truncated by nb.yrs
at the beginning inherent to the calculation method.
The function returns a list
containing the following components:
rgc |
a |
EYvalues |
a |
out |
a |
spec.param |
a |
Marieke van der Maaten-Theunissen and Ernst van der Maaten.
Jetschke, G., van der Maaten, E. and van der Maaten-Theunissen, M. (2019) Towards the extremes: A critical analysis of pointer year detection methods. Dendrochronologia 53: 55-62.
Schweingruber, F.H., Eckstein, D., Serre-Bachet, F. and Bräker, O.U. (1990) Identification, presentation and interpretation of event years and pointer years in dendrochronology. Dendrochronologia 8: 9-38.
In writing the function, the code of the dplR function pointer
(Pierre Mérian) was used as a reference.
## Calculate pointer years on tree-ring series data(s033) py1 <- pointer.rgc(s033) head(py1$out) ## Calculate pointer years with user-defined arguments data(s033) py2 <- pointer.rgc(s033, period = c(1950,2010), nb.yrs = 5, rgc.thresh.pos = 50, rgc.thresh.neg = 50, series.thresh = 50, make.plot = TRUE) head(py2$out)
## Calculate pointer years on tree-ring series data(s033) py1 <- pointer.rgc(s033) head(py1$out) ## Calculate pointer years with user-defined arguments data(s033) py2 <- pointer.rgc(s033, period = c(1950,2010), nb.yrs = 5, rgc.thresh.pos = 50, rgc.thresh.neg = 50, series.thresh = 50, make.plot = TRUE) head(py2$out)
The function calculates pointer years on a data.frame
of tree-ring series using a z-transformation of the site chronology (by default based on a biweight robust mean). The method provides the number of standard deviations that the chronology deviates in individual years. To identify pointer years, one absolute threshold on the number of standard deviations can be set. Optionally, a t-test can be applied to test whether the z-transformed chronology significantly exceeds the selected threshold. The function is intended to use on flexibly detrended data, e.g., with a cubic-smoothing spline with a 50% frequency cut-off at 15 years (cf. Jetschke et al. 2019).
pointer.zchron(data, period = NULL, bi.weight = TRUE, z.thresh = 1, t.Test = FALSE, make.plot = FALSE)
pointer.zchron(data, period = NULL, bi.weight = TRUE, z.thresh = 1, t.Test = FALSE, make.plot = FALSE)
data |
a |
period |
a |
bi.weight |
a |
z.thresh |
a |
t.Test |
a |
make.plot |
a |
The function develops a site chronology, which is z-transformed over its entire length, thereby providing the number of standard deviations that the chronology deviates in individual years. In developing the site chronology, a normal or biweight robust mean can be used. A threshold z.thresh
on the minimum number of standard deviations can be set (cf. Cropper 1979) to define the years to be considered as pointer years.
Optionally, a t-test may be performed to test whether the z-transformed chronology significantly differs from the selected threshold value in a particular year. Therefore, individual tree-ring series are z-transformed as well and compared to the threshold value z.thresh
. In case a biweight robust mean is used in building the site chronology, the t-test is based on the biweight robust estimate of the standard deviation. In all t-tests a significance level of 0.05 is used.
The function returns a list
containing the following components:
TRIsite |
a |
out |
a |
spec.param |
a |
Marieke van der Maaten-Theunissen, Ernst van der Maaten and Gottfried Jetschke.
Cropper, J.P. (1979) Tree-ring skeleton plotting by computer. Tree-Ring Bulletin 39: 47-59.
Jetschke, G., van der Maaten, E. and van der Maaten-Theunissen, M. (2019) Towards the extremes: A critical analysis of pointer year detection methods. Dendrochronologia 53: 55-62.
## Calculate pointer years on detrended tree-ring series data(s033) detr_s033 <- detrend(s033, method = "Spline", nyrs = 15) pz1 <- pointer.zchron(detr_s033) head(pz1$out) ## Calculate pointer years with user-defined arguments data(s033) detr_s033 <- detrend(s033, method = "Spline", nyrs = 15) pz2 <- pointer.zchron(detr_s033, period = c(1950,2010), z.thresh = 1.28, make.plot = TRUE) head(pz2$out)
## Calculate pointer years on detrended tree-ring series data(s033) detr_s033 <- detrend(s033, method = "Spline", nyrs = 15) pz1 <- pointer.zchron(detr_s033) head(pz1$out) ## Calculate pointer years with user-defined arguments data(s033) detr_s033 <- detrend(s033, method = "Spline", nyrs = 15) pz2 <- pointer.zchron(detr_s033, period = c(1950,2010), z.thresh = 1.28, make.plot = TRUE) head(pz2$out)
The function calculates resilience indices on a data.frame
, e.g., of tree-ring series, after Lloret et al. (2011; i.e. resistance, recovery, (relative) resilience), Thurm et al. (2016; recovery period, total growth reduction) and Schwarz et al. (2020; average growth reduction, average recovery rate), useful to analyze growth responses of individual trees prior, during and after extreme events / disturbances. The component 'resistance' is conceptually identical to 'abrupt growth changes' as described in Schweingruber et al. (1990; cf. pointer.rgc
). 'Recovery' is the ability of tree growth to recover after disturbance, whereas 'resilience' reflects the ability of trees to reach pre-disturbance growth levels. Weighting of the resilience by the experienced growth reduction results in 'relative resilience'. 'Recovery period' (or: 'growth recovery time') is the time needed to reach pre-disturbance growth levels again. 'Total growth reduction' reflects the cumulative growth reduction in the year of disturbance as well as the associated years in the recovery period. 'Average growth reduction' is the total growth reduction divided by the length of the recovery period. 'Average recovery rate' is the mean percentual recovery over the recovery period.
res.comp(data, nb.yrs = c(4,4), max.yrs.rec = 10)
res.comp(data, nb.yrs = c(4,4), max.yrs.rec = 10)
data |
a |
nb.yrs |
a |
max.yrs.rec |
a |
The function calculates various resilience indices after Lloret et al. (2011), Thurm et al. (2016) and Schwarz et al. (2020). The output provides different matrices with resilience indices for individual tree-ring series and years.
In calculating resilience indices the number of pre- and post disturbance years (nb.yrs
), as well as the maximum number of years to be considered in defining the recovery period (max.yrs.rec
) can be specified.
The function returns a list
containing the following components:
resist |
a |
recov |
a |
resil |
a |
rel.resil |
a |
rec.period |
a |
avg.rec.rate |
a |
tot.abs.grow.red |
a |
tot.rel.grow.red |
a |
avg.abs.grow.red |
a |
avg.rel.grow.red |
a |
nb.series |
a |
spec.param |
a |
Marieke van der Maaten-Theunissen, Ernst van der Maaten and Mario Trouillier.
Lloret, F., Keeling, E.G. and Sala, A. (2011) Components of tree resilience: effects of successive low-growth episodes in old ponderosa pine forests. Oikos 120: 1909-1920.
Schwarz, J., Skiadaresis, G., Kohler, M., Kunz, J., Schnabel, F., Vitali, V. and Bauhus, J. (2020) Quantifying growth responses of trees to drought — a critique of commonly used resilience indices and recommendations for future studies. Current Forestry Reports 6: 185-200.
Schweingruber, F.H., Eckstein, D., Serre-Bachet, F. and Bräker, O.U. (1990) Identification, presentation and interpretation of event years and pointer years in dendrochronology. Dendrochronologia 8: 9-38.
Thurm, E.A., Uhl, E. and Pretzsch, H. (2016) Mixture reduces climate sensitivity of Douglas-fir stem growth. Forest Ecology and Management 376: 205-220.
## Calculate resilience indices on tree-ring series data(s033) res <- res.comp(s033)
## Calculate resilience indices on tree-ring series data(s033) res <- res.comp(s033)
The function creates box plots for selected years of the resilience indices as calculated by res.comp
, and is intended for quick visualization.
res.plot(list.name, select.yr = NULL, param = c("resist", "recov", "resil", "rel.resil", "rec.period", "avg.rec.rate", "tot.abs.grow.red", "tot.rel.grow.red", "avg.abs.grow.red", "avg.rel.grow.red"))
res.plot(list.name, select.yr = NULL, param = c("resist", "recov", "resil", "rel.resil", "rec.period", "avg.rec.rate", "tot.abs.grow.red", "tot.rel.grow.red", "avg.abs.grow.red", "avg.rel.grow.red"))
list.name |
a |
select.yr |
an |
param |
a |
The function creates a box plot for a selected resilience index showing the full range of variation for individual trees in specific years. Box plots are only created for years for which indices are available for >= 5 series, as this value represents the number of statistics that a box plot represents in its' simplest form.
Box plot.
Marieke van der Maaten-Theunissen and Ernst van der Maaten.
## Plot the recovery period for three selected years data(s033) res <- res.comp(s033) res.plot(res, select.yr = c(1976, 1992, 2003), param = "resist")
## Plot the recovery period for three selected years data(s033) res <- res.comp(s033) res.plot(res, select.yr = c(1976, 1992, 2003), param = "resist")
This dataset presents tree-ring series for 20 European beech (Fagus sylvatica L.) trees from the forest reserve Schneetal, Bavaria, Germany. Series are averages of two cores.
data(s033)
data(s033)
A data.frame
containing 20 tree-ring series in columns and 136 years in rows.
Principe, A.S., van der Maaten, E., van der Maaten-Theunissen, M., Struwe, T., Wilmking, M. & Kreyling, J. (2017) Low resistance but high resilience in growth of a major deciduous forest tree (Fagus sylvatica L.) in response to late spring frost in southern Germany. Trees 31: 743-751. doi: 10.1007/s00468-016-1505-3.