6

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

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

这似乎效果不太好,我想知道这是我的方法,还是 ts 固有的东西导致了我的问题。任何人都可以批评我的方法,并可能推荐一种替代方法吗?

4

3 回答 3

7

使用包中实现的 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)中描述了模型的详细信息。

于 2014-01-08T21:58:44.150 回答
2

一种不仅可以处理季节性成分(周期性重复发生的事件)而且可以处理趋势(常态的缓慢变化)的方法令人钦佩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),如果没有季节性,则使用惩罚回归样条。

于 2014-01-08T11:40:48.343 回答
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
于 2014-01-08T11:14:32.897 回答