Двойные сезонные циклы в объекте

Я хочу снять сезонность с тс. Этот конкретный период является ежедневным и имеет как годовые, так и еженедельные сезонные циклы (частота 365 и 7).

Чтобы удалить оба, я попытался выполнить stl() для ts с частотой, установленной на 365, перед извлечением тренда и остатков, а также для установки частоты нового ts на 7 и повторить.

Кажется, что это не очень хорошо работает, и мне интересно, является ли это моим подходом или чем-то присущим ТС, что вызывает у меня проблемы. Может ли кто-нибудь критиковать мою методологию и, возможно, рекомендовать альтернативный подход?

3 ответа

Существует очень простой способ сделать это, используя модель TBATS, реализованную в forecast пакет. Вот пример, предполагающий, что ваши данные хранятся как x:

library(forecast)
x2 <- msts(x, seasonal.periods=c(7,365))
fit <- tbats(x2)
x.sa <- seasadj(fit)

Детали модели описаны в De Livera, Hyndman and Snyder (JASA, 2011).

Подход, который может обрабатывать не только сезонные компоненты (циклически повторяющиеся события), но также тренды (медленные сдвиги в норме), является stl()в частности, как это реализовано Rob J Hyndman.

decomp Функция Hyndman дает там (воспроизведено ниже) очень полезно для проверки seasonality а потом decomposing временной ряд в сезонный (если таковой существует), trend, а также residual компоненты.

decomp <- function(x,transform=TRUE)
{
  #decomposes time series into seasonal and trend components
  #from http://robjhyndman.com/researchtips/tscharacteristics/
  require(forecast)
  # Transform series
  if(transform & min(x,na.rm=TRUE) >= 0)
  {
    lambda <- BoxCox.lambda(na.contiguous(x))
    x <- BoxCox(x,lambda)
  }
  else
  {
    lambda <- NULL
    transform <- FALSE
  }
  # Seasonal data
  if(frequency(x)>1)
  {
    x.stl <- stl(x,s.window="periodic",na.action=na.contiguous)
    trend <- x.stl$time.series[,2]
    season <- x.stl$time.series[,1]
    remainder <- x - trend - season
  }
  else #Nonseasonal data
  {
    require(mgcv)
    tt <- 1:length(x)
    trend <- rep(NA,length(x))
    trend[!is.na(x)] <- fitted(gam(x ~ s(tt)))
    season <- NULL
    remainder <- x - trend
  }
  return(list(x=x,trend=trend,season=season,remainder=remainder,
    transform=transform,lambda=lambda))
}

Как вы можете видеть, он использует stl() (который использует loess) если есть сезонность и оштрафованные сплайны регрессии, если нет сезонности.

Проверьте, полезно ли это:
Start and End Values depends on your Data - Change the Frequency values accordingly

splot <- ts(Data1, start=c(2010, 2), end=c(2013, 9), frequency=12)

additive trend, seasonal, and irregular components can be decomposed using the stl() Function

fit <- stl(splot, s.window="period")
monthplot(splot) 
library(forecast)
vi <-seasonplot(splot)

vi должен давать отдельные значения для сезонных индексов

Также проверьте ниже:

splot.stl <- stl(splot,s.window="periodic",na.action=na.contiguous)
    trend <- splot.stl$time.series[,2]
    season <- splot.stl$time.series[,1]
    remainder <- splot - trend - season
Другие вопросы по тегам