我有以下 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
有没有办法可以测试和消除这种季节性?即使我需要 24 次时只有 20 次。
最佳答案
使用通常的分解方法是不可能的,因为它们使用至少与季节性周期一样多的自由度来估计季节性。正如@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)
您可以根据需要调整傅立叶项的顺序。我在这里用了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")
关于r - 在没有两个完整数据周期的情况下检测季节性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51329598/