Use recursive partitioning function rpart::rpart() to perform a 'classification' of relatively stable slopes in a timeseries.

ts_slopes(
  y,
  minDataSplit = 12,
  minSlopeDuration = round(minDataSplit/3),
  changeSensitivity = 0.01,
  maxSlopes = floor(max(NROW(y), na.rm = TRUE)/minSlopeDuration),
  method = c("anova", "poisson", "class", "exp")[1],
  minChange = sd(y, na.rm = TRUE),
  doSlopePlot = FALSE,
  doTreePlot = FALSE
)

Arguments

y

A time series of numeric vector

minDataSplit

An integer indicating how many datapoints should be in a segment before it will be analysed for presence of a slope (default = 12)

minSlopeDuration

Minimum duration (number of datapoints) of a slope (default = round(minDataSplit/3))

changeSensitivity

A number indicating a criterion of change that must occur before declaring the presence of a slope Higher numbers indicate higher levels of change must occur before a slope is considered. For example, if method = "anova", the overall R^2 after a slope is introduced must increase by the value of changeSensitivity, see the cp parameter in rpart::rpart.control(). (default = 0.01)

maxSlopes

Maximum number of levels in one series (default = floor(max(NROW(y), na.rm = TRUE)/minSlopeDuration))

method

The partitioning method to use, see the manual pages of rpart for details.

minChange

After the call to rpart, adjust detected slope value to a minimum absolute change in y. If a slope value is smaller than minChange, the previous slope will be continued. Note that this is an iterative process starting at the beginning of the series and 'correcting' towards the end. The results are stored in p_adj. Set to NA to skip, which means p_adj will be identical to p (default = sd(diff(y), na.rm = TRUE))

doSlopePlot

Should a plot with the original series and the levels be produced? (default = FALSE)

doTreePlot

Should a plot of the decision tree be produced. This requires package partykit (default = FALSE)

Value

A list object with fields tree and pred. The latter is a data frame with columns x (time), y (the variable of interest) and p the predicted slopes in y and p_adj, the slopes in p but adjusted for the value passed to minChange.

Author

Fred Hasselman

Examples


# Slopes in white noise?

set.seed(4321)
y <- rnorm(100)
wn <- ts_levels(y)
plot(wn$pred$x,wn$pred$y, type = "l")
lines(wn$pred$p, col = "red3", lwd = 2)

# This is due to the default changeSensitivity of 0.01

wn2 <- ts_slopes(y,changeSensitivity = .1)
#> Warning: The largest slope value is smaller than the value of argument minChange.
#> Partitioning results are stored in variable `p`, the adjusted results are stored in variable `p_adj`.
lines(wn2$pred$p, col = "steelblue", lwd = 2)