我想从 ts 中去掉季节性。这个特定的 ts 是每天的,并且有每年和每周的季节性周期(频率 365 和 7)。
为了消除两者,我尝试在频率设置为 365 的 ts 上执行 stl(),然后提取趋势和余数,并将新 ts 的频率设置为 7,然后重复。
这似乎效果不太好,我想知道这是我的方法,还是 ts 固有的东西导致了我的问题。任何人都可以批评我的方法,并可能推荐一种替代方法吗?
我想从 ts 中去掉季节性。这个特定的 ts 是每天的,并且有每年和每周的季节性周期(频率 365 和 7)。
为了消除两者,我尝试在频率设置为 365 的 ts 上执行 stl(),然后提取趋势和余数,并将新 ts 的频率设置为 7,然后重复。
这似乎效果不太好,我想知道这是我的方法,还是 ts 固有的东西导致了我的问题。任何人都可以批评我的方法,并可能推荐一种替代方法吗?
使用包中实现的 TBATS 模型有一种非常简单的方法forecast
。这是一个假设您的数据存储为的示例x
:
library(forecast)
x2 <- msts(x, seasonal.periods=c(7,365))
fit <- tbats(x2)
x.sa <- seasadj(fit)
De Livera、Hyndman 和 Snyder (JASA, 2011)中描述了模型的详细信息。
一种不仅可以处理季节性成分(周期性重复发生的事件)而且可以处理趋势(常态的缓慢变化)的方法令人钦佩stl()
,特别是由 Rob J Hyndman 实施。
Hyndman 在那里给出的decomp
函数(转载如下)对于检查时间序列非常有帮助,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