Answers:
通常,请阅读高级时间序列分析教科书(入门书籍通常会指导您仅信任您的软件),例如Box,Jenkins和Reinsel的时间序列分析。您还可以通过谷歌搜索找到Box-Jenkins程序的详细信息。请注意,除了Box-Jenkins,还有其他方法,例如基于AIC的方法。
在R中,您首先将数据转换为ts
(时间序列)对象,并告诉R频率为12(每月数据):
require(forecast)
sales <- ts(c(99, 58, 52, 83, 94, 73, 97, 83, 86, 63, 77, 70, 87, 84, 60, 105, 87, 93, 110, 71, 158, 52, 33, 68, 82, 88, 84),frequency=12)
您可以绘制(部分)自相关函数:
acf(sales)
pacf(sales)
这些并不表示任何AR或MA行为。
然后,拟合模型并对其进行检查:
model <- auto.arima(sales)
model
请参见?auto.arima
寻求帮助。如我们所见,auto.arima
选择一个简单的(0,0,0)模型,因为它既看不到趋势,季节性,也看不到AR或MA。最后,您可以预测并绘制时间序列和预测:
plot(forecast(model))
看一下?forecast.Arima
(注意大写字母A!)。
这本免费的在线教科书很好地介绍了使用R进行时间序列分析和预测。非常推荐。
两件事。您的时间序列是每月的,您需要至少4年的数据才能进行明智的ARIMA估计,因为有27点未给出自相关结构。这也可能意味着您的销售受某些外部因素的影响,而不是与其自身价值相关联。尝试找出影响您的销售的因素,以及正在衡量的因素。然后,您可以运行回归或VAR(向量自回归)来获取预测。
如果您除了这些值外没有其他任何东西,最好的方法是使用指数平滑法来获得幼稚的预测。R中可以使用指数平滑。
其次,不要孤立地看待某产品的销售,这两种产品的销售可能是相关的,例如,咖啡销售的增加可以反映出茶叶销售的减少。使用其他产品信息来改善您的预测。
这通常发生在零售或供应链中的销售数据中。他们在系列中没有显示很多自相关结构。另一方面,ARIMA或GARCH之类的方法通常适用于通常具有自相关的股市数据或经济指数。
这实际上是评论,但超出了允许范围,因此我将其发布为准答案,因为它提出了分析时间序列数据的正确方法。。
众所周知的事实,但在这里和其他地方经常被忽略,是用于制定暂定ARIMA模型的理论ACF / PACF假定没有脉冲/水平移动/季节性脉冲/本地时间趋势。另外,它以恒定的参数和恒定的误差随时间变化为前提。在这种情况下,很容易将第21个观察值(值= 158)标记为离群值/脉冲,建议将其调整为-80会得出修改后的值78。修改后的序列所得的ACF / PACF显示很少或没有随机(ARIMA)结构的证据。在这种情况下,手术成功了,但是病人死亡了。样本ACF基于协方差/方差,并且过度夸大/膨胀的方差会导致ACF的向下偏差。基思·奥尔德教授曾将此称为“爱丽丝梦游仙境效应”
正如Stephan Kolassa所指出的那样,您的数据中没有太多结构。自相关函数不建议使用ARMA结构(请参见acf(sales)
,pacf(sales)
),forecast::auto.arima
并且不选择任何AR或MA顺序。
require(forecast)
require(tsoutliers)
fit1 <- auto.arima(sales, d=0, D=0, ic="bic")
fit1
#ARIMA(0,0,0) with non-zero mean
#Coefficients:
# intercept
# 81.3704
#s.e. 4.4070
但是,请注意,在5%的显着性水平上,残差的正态无效性被拒绝了。
JarqueBera.test(residuals(fit1))[[1]]
#X-squared = 12.9466, df = 2, p-value = 0.001544
旁注:JarqueBera.test
基于jarque.bera.test
包中提供的功能tseries
。
将观测值21中包含的加法离群值包括在内,从而检测出tsoutliers
的残差具有正态性。因此,截距的估计和预测不受外围观察的影响。
res <- tsoutliers::tso(sales, types=c("AO", "TC", "LS"),
args.tsmethod=list(ic="bic", d=0, D=0))
res
#ARIMA(0,0,0) with non-zero mean
#Coefficients:
# intercept AO21
# 78.4231 79.5769
#s.e. 3.3885 17.6072
#sigma^2 estimated as 298.5: log likelihood=-115.25
#AIC=236.49 AICc=237.54 BIC=240.38
#Outliers:
# type ind time coefhat tstat
#1 AO 21 2:09 79.58 4.52
JarqueBera.test(residuals(res$fit))[[1]]
#X-squared = 1.3555, df = 2, p-value = 0.5077