ts对象的双季节周期

时间:2014-01-08 11:00:00

标签: r time-series decomposition stl-decomposition

我想从ts中剥离季节性。这个特殊的ts是每天,并且有每年和每周的季节周期(频率365和7)。

为了删除两者,我尝试在频率设置为365的ts上进行stl(),然后提取趋势和余数,并将新ts的频率设置为7,然后重复。

这似乎并没有很好地运作,我想知道这是我的方法,还是导致我出现问题的ts固有的东西。任何人都可以批评我的方法,也许可以推荐另一种方法吗?

3 个答案:

答案 0 :(得分:7)

使用forecast包中实现的TBATS模型可以很容易地实现它。以下示例假设您的数据存储为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)中描述了该模型的详细信息。

答案 1 :(得分:2)

一种方法不仅可以处理季节性成分(周期性重复发生的事件),而且可以处理趋势(标准的缓慢变化),stl(),特别是由Rob J Hyndman实施。

Hyndman给出的decomp函数(下面转载)非常有助于检查seasonality然后将decomposing时间序列检查为季节性(如果存在),{{1} }和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()),如果没有季节性,则使用回归样条。

答案 2 :(得分:0)

检查这是否有用:
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