我对统计和 R 相当陌生。我想知道为我的数据集确定 ARIMA 参数的过程。你能帮我用 R 和理论上(如果可能的话)找出同样的方法吗?
数据范围从 12 年 1 月到 14 年 3 月,描述了月度销售额。这是数据集:
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
这是趋势:
数据不表现出趋势、季节性行为或周期性。
我对统计和 R 相当陌生。我想知道为我的数据集确定 ARIMA 参数的过程。你能帮我用 R 和理论上(如果可能的话)找出同样的方法吗?
数据范围从 12 年 1 月到 14 年 3 月,描述了月度销售额。这是数据集:
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
这是趋势:
数据不表现出趋势、季节性行为或周期性。
一般来说,深入研究高级时间序列分析教科书(介绍性书籍通常会指导您只信任您的软件),例如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 向下偏差。Keith Ord 教授曾将此称为“爱丽丝梦游仙境效应”
正如 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
package 中可用的功能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