6

ts から季節性を取り除きたい。この特定の ts は日単位で、年単位と週単位の両方の季節サイクル (頻度 365 と 7) があります。

両方を削除するために、傾向と残りを抽出し、新しい ts の頻度を 7 に設定する前に、頻度を 365 に設定して ts で stl() を実行しようとしました。

これはうまく機能していないようで、それが私のアプローチなのか、それとも問題を引き起こしている ts に固有のものなのか疑問に思っています。誰かが私の方法論を批判し、おそらく別のアプローチを推奨できますか?

4

3 に答える 3

7

forecastパッケージに実装されている TBATS モデルを使用すると、非常に簡単に実行できます。データが次のように保存されていると仮定した例を次に示します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 によって実装されたものです。

decompHyndman が提供する関数 (以下に再現) は、時系列をチェックしてから、季節 (存在する場合)、seasonality、およびコンポーネントに変換するのに非常に役立ちます。decomposingtrendresidual

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 に答える