inst/doc/stRvignette.R

## ----setup, include = FALSE---------------------------------------------------
knitr::opts_chunk$set(cache = FALSE, fig.show = 'hold', fig.width = 7, fig.height = 3)
library(stR)
library(forecast)
library(seasonal)

## ---- fig.height = 4.5--------------------------------------------------------
m <- decompose(co2)
plot(m)

## ---- fig.height = 4.5--------------------------------------------------------
plot(stl(log(co2), s.window = "periodic", t.window = 30))

## ---- include = FALSE---------------------------------------------------------
f = "co2.fit.tbats.RDS"
if(file.exists(f)) {
  co2.fit = readRDS(f)
} else {
  co2.fit <- tbats(co2)
  saveRDS(co2.fit, f, compress = "xz")
}

## ---- eval = FALSE------------------------------------------------------------
#  library(forecast)
#  co2.fit <- tbats(co2)

## ---- fig.height = 4.5--------------------------------------------------------
plot(co2.fit)

## -----------------------------------------------------------------------------
library(seasonal)
co2.fit <- seas(co2)
plot(co2.fit, trend = TRUE)

## ---- include = FALSE---------------------------------------------------------
f = "co2.fit.stR.RDS"
if(file.exists(f)) {
  co2.fit = readRDS(f)
} else {
  co2.fit <- AutoSTR(co2)
  saveRDS(co2.fit, f, compress = "xz")
}

## ---- eval = FALSE------------------------------------------------------------
#  co2.fit <- AutoSTR(co2)

## ---- fig.height = 4----------------------------------------------------------
plot(co2.fit)

## -----------------------------------------------------------------------------
taylor.msts <- msts(log(head(as.vector(taylor), 336*4)),
  seasonal.periods=c(48,48*7,48*7*52.25),
  start=2000+22/52)
plot(taylor.msts, ylab = "Electricity demand")

## ---- include = FALSE---------------------------------------------------------
f = "taylor.fit.stR.RDS"
if(file.exists(f)) {
  taylor.fit = readRDS(f)
} else {
  taylor.fit <- AutoSTR(taylor.msts, gapCV = 48, confidence = 0.95)
  saveRDS(taylor.fit, f, compress = "xz")
}

## ---- eval = FALSE------------------------------------------------------------
#  taylor.fit <- AutoSTR(taylor.msts, gapCV = 48, confidence = 0.95)

## ---- fig.height = 4.5--------------------------------------------------------
plot(taylor.fit)

## -----------------------------------------------------------------------------
plot(grocery, ylab = "NSW Grocery Turnover, $ 10^6")

## -----------------------------------------------------------------------------
logGr <- log(grocery)
plot(logGr, ylab = "NSW Grocery Turnover, log scale")

## -----------------------------------------------------------------------------
trendSeasonalStructure <- list(
  segments = list(c(0,1)),
  sKnots = list(c(1,0)))

## -----------------------------------------------------------------------------
seasonalStructure <- list(
  segments = list(c(0,12)),
  sKnots = list(1,2,3,4,5,6,7,8,9,10,11,c(12,0)))

## -----------------------------------------------------------------------------
seasons <- as.vector(cycle(logGr))

## -----------------------------------------------------------------------------
trendSeasons <- rep(1, length(logGr))

## -----------------------------------------------------------------------------
times <- as.vector(time(logGr))

## -----------------------------------------------------------------------------
data <- as.vector(logGr)

## -----------------------------------------------------------------------------
trendTimeKnots <- seq(
  from = head(times, 1),
  to = tail(times, 1),
  length.out = 175)

## -----------------------------------------------------------------------------
seasonTimeKnots <- seq(
  from = head(times, 1),
  to = tail(times, 1),
  length.out = 15)

## -----------------------------------------------------------------------------
trendData <- rep(1, length(logGr))
seasonData <- rep(1, length(logGr))

## -----------------------------------------------------------------------------
trend <- list(
  name = "Trend",
  data = trendData,
  times = times,
  seasons = trendSeasons,
  timeKnots = trendTimeKnots,
  seasonalStructure = trendSeasonalStructure,
  lambdas = c(0.5,0,0))

## -----------------------------------------------------------------------------
season <- list(
  name = "Yearly seasonality",
  data = seasonData,
  times = times,
  seasons = seasons,
  timeKnots = seasonTimeKnots,
  seasonalStructure = seasonalStructure,
  lambdas = c(10,0,0))

## -----------------------------------------------------------------------------
predictors <- list(trend, season)

## ---- include = FALSE---------------------------------------------------------
f = "gr.fit.stR.RDS"
if(file.exists(f)) {
  gr.fit = readRDS(f)
} else {
  gr.fit <- STR(data, predictors, confidence = 0.95, gap = 1, reltol = 0.00001)
  saveRDS(gr.fit, f, compress = "xz")
}

## ---- eval = FALSE------------------------------------------------------------
#  gr.fit <- STR(data, predictors, confidence = 0.95, gap = 1, reltol = 0.00001)

## ---- fig.height=4------------------------------------------------------------
plot(gr.fit, xTime = times, forecastPanels = NULL)

## ---- echo=TRUE, warning=FALSE, results='hide'--------------------------------
season <- list(name = "Yearly seasonality",
               data = seasonData,
               times = times,
               seasons = seasons,
               timeKnots = seasonTimeKnots,
               seasonalStructure = seasonalStructure,
               lambdas = c(1,1,1))
predictors = list(trend, season)

## ---- include = FALSE---------------------------------------------------------
f = "gr.fit.2.stR.RDS"
if(file.exists(f)) {
  gr.fit = readRDS(f)
} else {
  gr.fit <- STR(data,
                predictors,
                confidence = 0.95,
                gap = 1,
                reltol = 0.00001)
  saveRDS(gr.fit, f, compress = "xz")
}

## ---- eval = FALSE------------------------------------------------------------
#  gr.fit <- STR(data,
#                predictors,
#                confidence = 0.95,
#                gap = 1,
#                reltol = 0.00001)

## ---- fig.height=4------------------------------------------------------------
plot(gr.fit, xTime = times, forecastPanels = NULL)

## ---- fig.height = 4----------------------------------------------------------
outl <- rep(0,length(grocery))
outl[14] <- 900
outl[113] <- -700
tsOutl <- ts(outl, start = c(2000,1), frequency = 12)

## -----------------------------------------------------------------------------
logGrOutl <- log(grocery + tsOutl)
plot(logGrOutl, ylab = "Log turnover with outliers")

## ---- echo=TRUE, warning=FALSE, results='hide'--------------------------------
trendSeasonalStructure <- list(segments = list(c(0,1)),
                              sKnots = list(c(1,0)))
seasonalStructure <- list(segments = list(c(0,12)),
                         sKnots  = list(1,2,3,4,5,6,7,8,9,10,11,c(12,0)))
seasons <- as.vector(cycle(logGrOutl))
trendSeasons <- rep(1, length(logGrOutl))
times <- as.vector(time(logGrOutl))
data <- as.vector(logGrOutl)
timeKnots <- times
trendData <- rep(1, length(logGrOutl))
seasonData <- rep(1, length(logGrOutl))
trend <- list(data = trendData,
             times = times,
             seasons = trendSeasons,
             timeKnots = timeKnots,
             seasonalStructure = trendSeasonalStructure,
             lambdas = c(0.1,0,0))
season <- list(data = seasonData,
              times = times,
              seasons = seasons,
              timeKnots = timeKnots,
              seasonalStructure = seasonalStructure,
              lambdas = c(10,0,0))
predictors <- list(trend, season)

## ---- include = FALSE---------------------------------------------------------
f = "logGrOutl.stR.RDS"
if(file.exists(f)) {
  fit.str = readRDS(f)
} else {
  fit.str <- STR(as.vector(logGrOutl), predictors, confidence = 0.95, gapCV = 1, reltol = 0.001)
  saveRDS(fit.str, f, compress = "xz")
}

## ---- eval = FALSE------------------------------------------------------------
#  fit.str <- STR(as.vector(logGrOutl), predictors, confidence = 0.95, gapCV = 1, reltol = 0.001)

## ---- fig.height = 4----------------------------------------------------------
plot(fit.str, xTime = times, forecastPanels = NULL)

## ---- include = FALSE---------------------------------------------------------
f = "logGrOutl.stR.robust.RDS"
if(file.exists(f)) {
  fit.rstr = readRDS(f)
} else {
  fit.rstr <- STR(as.vector(logGrOutl), predictors, confidence = 0.95, gapCV = 1, reltol = 0.001, nMCIter = 200, robust = TRUE)
  saveRDS(fit.rstr, f, compress = "xz")
}

## ---- eval = FALSE------------------------------------------------------------
#  fit.rstr <- STR(as.vector(logGrOutl), predictors, confidence = 0.95, gapCV = 1, reltol = 0.001, nMCIter = 200, robust = TRUE)

## ---- fig.height = 4----------------------------------------------------------
plot(fit.rstr, xTime = times, forecastPanels = NULL)

## ---- echo=TRUE, warning=FALSE, results='hide'--------------------------------
times <- as.vector(time(calls))
timeKnots <- seq(min(times), max(times), length.out=25)

trendSeasonalStructure <- list(segments = list(c(0,1)),
                              sKnots = list(c(1,0)))
trendSeasons <- rep(1, length(calls))

sKnotsDays <- as.list(seq(1, 169, length.out = 169))
seasonalStructureDays <- list(segments = list(c(1, 169)),
                             sKnots = sKnotsDays)
seasonsDays <- seq_along(calls) %% 169 + 1

sKnotsWeeks <- as.list(seq(0,169*5, length.out=13*5))
seasonalStructureWeeks <- list(segments = list(c(0, 169*5)),
                              sKnots = sKnotsWeeks)
seasonsWeeks <- seq_along(calls) %% (169*5) + 1

data <- as.vector(calls)
trendData <- rep(1, length(calls))
seasonData <- rep(1, length(calls))

trend <- list(data = trendData,
              times = times,
              seasons = trendSeasons,
              timeKnots = timeKnots,
              seasonalStructure = trendSeasonalStructure,
              lambdas = c(0.02, 0, 0))

seasonDays <- list(data = seasonData,
                   times = times,
                   seasons = seasonsDays,
                   timeKnots = seq(min(times), max(times), length.out=25),
                   seasonalStructure = seasonalStructureDays,
                   lambdas = c(0, 11, 30))

seasonWeeks <- list(data = seasonData,
                    times = times,
                    seasons = seasonsWeeks,
                    timeKnots = seq(min(times), max(times), length.out=25),
                    seasonalStructure = seasonalStructureWeeks,
                    lambdas = c(30, 500, 0.02))

predictors <- list(trend, seasonDays, seasonWeeks)

## ---- include = FALSE---------------------------------------------------------
f = "calls.fit.RDS"
if(file.exists(f)) {
  calls.fit = readRDS(f)
} else {
  calls.fit <- STR(data = data,
                   predictors = predictors,
                   confidence = 0.95,
                   reltol = 0.003,
                   nFold = 4,
                   gap = 169)
  saveRDS(calls.fit, f, compress = "xz")
}

## ---- eval = FALSE------------------------------------------------------------
#  calls.fit <- STR(data = data,
#                   predictors = predictors,
#                   confidence = 0.95,
#                   reltol = 0.003,
#                   nFold = 4,
#                   gap = 169)

## ---- fig.height = 4----------------------------------------------------------
plot(calls.fit,
     xTime = as.Date("2003-03-03") +
       ((seq_along(data)-1)/169) +
       (((seq_along(data)-1)/169) / 5)*2,
     forecastPanels = NULL)

## ---- echo=TRUE, warning=FALSE, results='hide'--------------------------------
TrendSeasonalStructure <- list(segments = list(c(0,1)),
                              sKnots = list(c(1,0)))
DailySeasonalStructure <- list(segments = list(c(0,48)),
                              sKnots = c(as.list(1:47), list(c(48,0))))
WeeklySeasonalStructure <- list(segments = list(c(0,336)),
                                sKnots = c(as.list(seq(4,332,4)), list(c(336,0))))
WDSeasonalStructure <- list(segments = list(c(0,48), c(100,148)),
                           sKnots = c(as.list(c(1:47,101:147)), list(c(0,48,100,148))))

TrendSeasons <- rep(1, nrow(electricity))
DailySeasons <- as.vector(electricity[,"DailySeasonality"])
WeeklySeasons <- as.vector(electricity[,"WeeklySeasonality"])
WDSeasons <- as.vector(electricity[,"WorkingDaySeasonality"])

Data <- as.vector(electricity[,"Consumption"])
Times <- as.vector(electricity[,"Time"])
TempM <- as.vector(electricity[,"Temperature"])
TempM2 <- TempM^2

TrendTimeKnots <- seq(from = head(Times, 1), to = tail(Times, 1), length.out = 116)
SeasonTimeKnots <- seq(from = head(Times, 1), to = tail(Times, 1), length.out = 24)
SeasonTimeKnots2 <- seq(from = head(Times, 1), to = tail(Times, 1), length.out = 12)

TrendData <- rep(1, length(Times))
SeasonData <- rep(1, length(Times))

Trend <- list(name = "Trend",
              data = TrendData,
              times = Times,
              seasons = TrendSeasons,
              timeKnots = TrendTimeKnots,
              seasonalStructure = TrendSeasonalStructure,
              lambdas = c(1500,0,0))
WSeason <- list(name = "Weekly seas",
               data = SeasonData,
               times = Times,
               seasons = WeeklySeasons,
               timeKnots = SeasonTimeKnots2,
               seasonalStructure = WeeklySeasonalStructure,
               lambdas = c(0.8,0.6,100))
WDSeason <- list(name = "Daily seas",
                 data = SeasonData,
                 times = Times,
                 seasons = WDSeasons,
                 timeKnots = SeasonTimeKnots,
                 seasonalStructure = WDSeasonalStructure,
                 lambdas = c(0.003,0,240))
TrendTempM <- list(name = "Trend temp Mel",
                   data = TempM,
                   times = Times,
                   seasons = TrendSeasons,
                   timeKnots = TrendTimeKnots,
                   seasonalStructure = TrendSeasonalStructure,
                   lambdas = c(1e7,0,0))
TrendTempM2 <- list(name = "Trend temp Mel^2",
                    data = TempM2,
                    times = Times,
                    seasons = TrendSeasons,
                    timeKnots = TrendTimeKnots,
                    seasonalStructure = TrendSeasonalStructure,
                    lambdas = c(1e7,0,0))
Predictors <- list(Trend, WSeason, WDSeason, TrendTempM, TrendTempM2)

## ---- include = FALSE---------------------------------------------------------
f = "elec.fit.RDS"
if(file.exists(f)) {
  elec.fit = readRDS(f)
} else {
  elec.fit <- STR(data = Data,
                  predictors = Predictors,
                  confidence = 0.95,
                  gapCV = 48*7)
  saveRDS(elec.fit, f, compress = "xz")
}

## ---- eval = FALSE------------------------------------------------------------
#  elec.fit <- STR(data = Data,
#                  predictors = Predictors,
#                  confidence = 0.95,
#                  gapCV = 48*7)

## ---- fig.height = 6----------------------------------------------------------
plot(elec.fit,
     xTime = as.Date("2000-01-11")+((Times-1)/48-10),
     forecastPanels = NULL)

## ---- echo=TRUE, warning=FALSE, results='hide'--------------------------------
TrendSeasonalStructure <- list(segments = list(c(0,1)),
                               sKnots = list(c(1,0)))
DailySeasonalStructure <- list(segments = list(c(0,48)),
                               sKnots = c(as.list(1:47), list(c(48,0))))
WeeklySeasonalStructure <- list(segments = list(c(0,336)),
                                sKnots = c(as.list(seq(4,332,4)), list(c(336,0))))
WDSeasonalStructure <- list(segments = list(c(0,48), c(100,148)),
                            sKnots = c(as.list(c(1:47,101:147)), list(c(0,48,100,148))))

TrendSeasons <- rep(1, nrow(electricity))
DailySeasons <- as.vector(electricity[,"DailySeasonality"])
WeeklySeasons <- as.vector(electricity[,"WeeklySeasonality"])
WDSeasons <- as.vector(electricity[,"WorkingDaySeasonality"])

Data <- as.vector(electricity[,"Consumption"])
Times <- as.vector(electricity[,"Time"])
TempM <- as.vector(electricity[,"Temperature"])
TempM2 <- TempM^2

TrendTimeKnots <- seq(from = head(Times, 1), to = tail(Times, 1), length.out = 116)
SeasonTimeKnots <- seq(from = head(Times, 1), to = tail(Times, 1), length.out = 24)
SeasonTimeKnots2 <- seq(from = head(Times, 1), to = tail(Times, 1), length.out = 12)

TrendData <- rep(1, length(Times))
SeasonData <- rep(1, length(Times))

Trend <- list(name = "Trend",
              data = TrendData,
              times = Times,
              seasons = TrendSeasons,
              timeKnots = TrendTimeKnots,
              seasonalStructure = TrendSeasonalStructure,
              lambdas = c(1500,0,0))
WSeason <- list(name = "Weekly seas",
                data = SeasonData,
                times = Times,
                seasons = WeeklySeasons,
                timeKnots = SeasonTimeKnots2,
                seasonalStructure = WeeklySeasonalStructure,
                lambdas = c(0.8,0.6,100))
WDSeason <- list(name = "Daily seas",
                 data = SeasonData,
                 times = Times,
                 seasons = WDSeasons,
                 timeKnots = SeasonTimeKnots,
                 seasonalStructure = WDSeasonalStructure,
                 lambdas = c(0.003,0,240))
TrendTempM <- list(name = "Trend temp Mel",
                   data = TempM,
                   times = Times,
                   seasons = TrendSeasons,
                   timeKnots = TrendTimeKnots,
                   seasonalStructure = TrendSeasonalStructure,
                   lambdas = c(1e7,0,0))
TrendTempM2 <- list(name = "Trend temp Mel^2",
                    data = TempM2,
                    times = Times,
                    seasons = TrendSeasons,
                    timeKnots = TrendTimeKnots,
                    seasonalStructure = TrendSeasonalStructure,
                    lambdas = c(1e7,0,0))
Predictors <- list(Trend, WSeason, WDSeason, TrendTempM, TrendTempM2)

## ---- echo=TRUE, warning=FALSE, results='hide'--------------------------------
Data[(length(Data)-7*48):length(Data)] <- NA

## ---- include = FALSE---------------------------------------------------------
f = "elec.fit.forecasting.RDS"
if(file.exists(f)) {
  elec.fit = readRDS(f)
} else {
  elec.fit <- STR(data = Data,
                  predictors = Predictors,
                  confidence = 0.95,
                  gapCV = 48*7)
  saveRDS(elec.fit, f, compress = "xz")
}

## ---- eval = FALSE------------------------------------------------------------
#  elec.fit <- STR(data = Data,
#                  predictors = Predictors,
#                  confidence = 0.95,
#                  gapCV = 48*7)

## ---- fig.height = 7.5--------------------------------------------------------
plot(elec.fit,
     xTime = as.Date("2000-01-11")+((Times-1)/48-10),
     forecastPanels = 7)

## ---- fig.height = 4.5--------------------------------------------------------
plotBeta(elec.fit, predictorN = 1)

## ---- fig.height = 4.5--------------------------------------------------------
plotBeta(elec.fit, predictorN = 2)
plotBeta(elec.fit, predictorN = 3)

## ---- fig.height = 4.5--------------------------------------------------------
plotBeta(elec.fit, predictorN = 4)
plotBeta(elec.fit, predictorN = 5)

## ---- echo=TRUE, warning=FALSE, results='hide'--------------------------------
Trend <- list(name = "Trend",
              data = TrendData,
              times = Times,
              seasons = TrendSeasons,
              timeKnots = TrendTimeKnots,
              seasonalStructure = TrendSeasonalStructure,
              lambdas = c(150000,0,0))
Predictors <- list(Trend, WSeason, WDSeason, TrendTempM, TrendTempM2)

## ---- include = FALSE---------------------------------------------------------
f = "elec.fit.2.forecasting.RDS"
if(file.exists(f)) {
  elec.fit.2 = readRDS(f)
} else {
  elec.fit.2 <- STR(data = Data,
                    predictors = Predictors,
                    confidence = 0.95,
                    gapCV = 48*7)
  saveRDS(elec.fit.2, f, compress = "xz")
}

## ---- eval = FALSE------------------------------------------------------------
#  elec.fit.2 <- STR(data = Data,
#                    predictors = Predictors,
#                    confidence = 0.95,
#                    gapCV = 48*7)

## ---- fig.height = 7.5--------------------------------------------------------
plot(elec.fit.2,
     xTime = as.Date("2000-01-11")+((Times-1)/48-10),
     forecastPanels = 7)

## ---- fig.height = 4.5--------------------------------------------------------
for(i in 1:5)
  plotBeta(elec.fit.2, predictorN = i)

Try the stR package in your browser

Any scripts or data that you put into this service are public.

stR documentation built on Aug. 11, 2023, 1:10 a.m.