Двойные сезонные циклы в объекте
Я хочу снять сезонность с тс. Этот конкретный период является ежедневным и имеет как годовые, так и еженедельные сезонные циклы (частота 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