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

ts_levels(
  y,
  minDataSplit = 12,
  minLevelDuration = round(minDataSplit/3),
  changeSensitivity = 0.01,
  maxLevels = floor(max(NROW(y), na.rm = TRUE)/minLevelDuration),
  method = c("anova", "poisson", "class", "exp")[1],
  minChange = sd(y, na.rm = TRUE),
  doLevelPlot = 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 level change (default = 12)

minLevelDuration

Minimum duration (number of datapoint) of a level (default = round(minDataSplit/3))

changeSensitivity

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

maxLevels

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

method

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

minChange

After the call to rpart, adjust detected level changes to a minimum absolute change in y. If a level change is smaller than minChange, the previous level 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(y, na.rm = TRUE))

doLevelPlot

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 levels in y and p_adj, the levels in p but adjusted for the value passed to minChange.

Author

Fred Hasselman

Examples


# Levels 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_levels(y,changeSensitivity = .1)
#> Warning: The largest level difference 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)