我想从ts中剥离季节性。这个特殊的ts是每天,并且有每年和每周的季节周期(频率365和7)。
为了删除两者,我尝试在频率设置为365的ts上进行stl(),然后提取趋势和余数,并将新ts的频率设置为7,然后重复。
这似乎并没有很好地运作,我想知道这是我的方法,还是导致我出现问题的ts固有的东西。任何人都可以批评我的方法,也许可以推荐另一种方法吗?
答案 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