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

PMc*_*PMc 7 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
Run Code Online (Sandbox Code Playgroud)

应该有季节性,我想估计并删除它.我使用下面的代码尝试了这个:

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

但由于我只有20个月而不是两个完整的数据期,我得到以下错误:

Error in decompose(df, "additive") : 
time series has no or less than 2 periods
Run Code Online (Sandbox Code Playgroud)

有没有办法测试和删除这个季节性?即使我只需要20个周期,但我需要24个周期.

Rob*_*man 9

使用通常的分解方法是不可能的,因为他们使用至少与季节性时期一样多的自由度来估计季节性.正如@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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

您可以根据需要调整傅里叶项的顺序.我在这里用过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")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述