在没有两个完整周期的数据的情况下检测季节变化

时间:2018-07-13 16:43:52

标签: r time-series

我有以下20个月的数据集(df):

price
2735.869
2857.105
2725.971
2734.809
2761.314
2828.224
2830.284
2758.149
2774.943
2782.801
2861.970
2878.688
3049.229
3029.340
3099.041
3071.151
3075.576
3146.372
3005.671
3149.381

应该有季节性,我想对此进行估计并删除。我尝试使用以下代码进行此操作:

df <- ts(df$price, frequency = 12, start = c(2016,8))
decompose_df <- decompose( , "additive")
adjust_df<- df- decompose_df $seasonal
plot(adjust_df)

但是由于我只有20个月且没有两个完整周期的数据,因此出现以下错误:

Error in decompose(df, "additive") : 
time series has no or less than 2 periods

有没有一种方法可以测试和消除这种季节性?即使我只有20个时段,而我需要24个时段。

1 个答案:

答案 0 :(得分:8)

使用常规的分解方法是不可能的,因为它们使用至少与季节相同的自由度来估计季节。正如@useR所指出的,每个季节至少需要两个观测值才能区分季节和噪声。

但是,如果您愿意假设季节性相对平稳,则可以使用较少的自由度进行估算。例如,您可以使用带有一些参数的傅立叶项来近似季节性模式。

df <- ts(c(
2735.869,2857.105,2725.971,2734.809,2761.314,2828.224,2830.284,2758.149,
2774.943,2782.801,2861.970,2878.688,3049.229,3029.340,3099.041,3071.151,
3075.576,3146.372,3005.671,3149.381), start=c(2016,8), frequency=12)

library(forecast)
library(ggplot2)
decompose_df <- tslm(df ~ trend + fourier(df, 2))
trend <- coef(decompose_df)[1] + coef(decompose_df)['trend']*seq_along(df)
components <- cbind(
  data = df,
  trend = trend,  
  season = df - trend - residuals(decompose_df),
  remainder = residuals(decompose_df)
)
autoplot(components, facet=TRUE)

enter image description here

您可以根据需要调整傅立叶项的顺序。我在这里用过2。对于月度数据,您可以使用的最大值为6,但这将提供一个具有13个自由度的模型,而仅具有20个观测值的模型就太多了。如果您不了解傅立叶的季节性术语,请参阅https://otexts.org/fpp2/useful-predictors.html#fourier-series

现在,我们可以删除季节性因素以获取经过季节性调整的数据。

adjust_df <- df - components[,'season']
autoplot(df, series="Data") + autolayer(adjust_df, series="Seasonally adjusted")

enter image description here