所以我正在查看单位销售数据。我正在做单变量时间序列分析。我的数据是 2012 年至 2014 年的每周销售数字数据(显然直到 2014 年底)。我首先绘制了我的响应变量与时间的关系。
我怀疑趋势和季节性是有道理的。所以我用黄土(STL)做了一个季节性趋势分解。这是结果。
但是,当我对原始数据集进行平稳性测试时,它给了我平稳性。我尝试了 Box-Ljung Philips-Perron 单位根检验增强 dicky fuller 检验,其中固定和爆炸作为替代方案和 kpss。静止的。那么为什么我的趋势和个性不显着呢?我为每个观察分配了一个月索引并做了 boxplot(sales~month, data=???) 结果如下:
然后问自己,平均值的差异是否显着,它们不是。我尝试了 aov pairwise.t.test 和 TuckeyHD。即使某些手段的均值差异很重要,但总体而言并不重要。那么我可以说在带有 ARIMA 的数据集和模型中没有出现明显的趋势和季节性吗?此外,我的数据集中只有 156 个观察值。
这是 acf 和 pacf 你会指定什么 ARMA?如果是 ARMA。我真的很茫然,这是我第一次看到稳定的原始销售数据。
原始数据静止但仍然可以看到趋势和季节性是 stl
这就是我使用 R 包预测ARIMA 模型选择和tsoutliers来检测可能的加性异常值、水平变化或临时变化所得到的结果。
这些是数据:
x <- structure(c(1291, 2497, 2643, 2633, 2637, 3246, 2764, 2552, 2190, 2423, 2393, 2278, 1573, 792, 1826, 1819, 1610, 1344, 1762, 1917, 1920, 1804, 1936, 1912, 2000, 1742, 2120, 2483, 2475, 2252, 2061, 2145, 1901, 2223, 1934, 1439, 1963, 1879, 1587, 2467, 2852, 3811, 3154, 2428, 2881, 2625, 2416, 2538, 1947, 2526, 2421, 1277, 1334,
2009, 2693, 2624, 2714, 2882, 3044, 2847, 2439, 2690, 2677, 2461, 1495, 2501, 2614, 2486, 2390, 1901, 2315, 2710, 2436, 2184, 2079, 2234, 2382, 2213, 2506, 2673, 2579, 2341, 2246, 2331, 1670, 2263, 2453, 2411, 2653, 2754, 2818, 2635, 2577, 2897, 2796, 2039, 2188,
2749, 2790, 2510, 2128, 2839, 2270, 1791, 1373, 2078, 2878, 3198, 3095, 2964, 3230, 3122, 2809, 2902, 3048, 2984, 2927, 2740, 2732, 1572, 2829, 1831, 2821, 2907, 2973, 2690, 2511, 2632, 2502, 2590, 2907, 3046, 2953, 2663, 2613, 2637, 2061, 2812, 2660, 2653, 2708, 2921, 2862, 2526, 2863, 3002, 3227, 2254, 2606, 2959, 2963, 3302),
.Tsp = c(2012, 2014.90384615385, 52), class = "ts")
拟合 ARIMA 模型:
require(tsoutliers)
res <- tso(x, args.tsmethod = list(ic="bic"))
res
# output
# Series: x
# ARIMA(2,0,0) with non-zero mean
# Coefficients:
# ar1 ar2 intercept TC6 AO14 LS40 AO65
# 0.6172 -0.2038 1960.4325 1024.713 -885.4593 494.7448 -932.6690
# s.e. 0.0836 0.0846 83.7532 296.303 252.3412 102.8566 250.3566
# LS107 AO120 AO122
# 370.7175 -1219.8245 -987.1700
# s.e. 95.7657 252.4097 252.4363
# sigma^2 estimated as 88411: log likelihood=-1081.49
# AIC=2184.99 AICc=2186.87 BIC=2218.25
# Outliers:
# type ind time coefhat tstat
# 1 TC 6 2012:06 1024.7 3.458
# 2 AO 14 2012:14 -885.5 -3.509
# 3 LS 40 2012:40 494.7 4.810
# 4 AO 65 2013:13 -932.7 -3.725
# 5 LS 107 2014:03 370.7 3.871
# 6 AO 120 2014:16 -1219.8 -4.833
# 7 AO 122 2014:18 -987.2 -3.911
数据由一个固定的 AR(2) 模型拟合,输出中总结了一些异常值。根据该模型,在数据中观察到循环行为而不是季节性。
这些是拟合模型的残差。
-562.694; 861.332; 215.01; 360.635; 400.555; -19.663; 63.132; 89.367; -159.542; 310.001; 101.865;
80.454; -540.365; -10.707; -60.819; -131.584; -301.359; -436.549; 105.306; -50.281; -56.658; -142.147;
62.602; -66.119; 63.857; -253.158; 302.135; 379.365; 224.416; 80.363; 25.394; 181.858; -152.887;
336.83; -200.61; -451.631; 318.987; -189.269; -322.656; 225.7; 313.434; 1113.322; -57.1; -182.213;
584.986; -98.521; -57.223; 141.604; -567.276; 401.332; -181.432; -1142.653; -401.002; 5.72; 284.743;
-68.867; 203.088; 301.483; 378.136; 115.386; -138.022; 324.644; 73.6; -83.233; 14.096; 63.987; 124.937;
-57.862; -51.839; -507.671; 188.566; 228.418; -205.009; -207.419; -212.721; -44.265; -13.322; -242.081;
185.378; 137.111; -0.256; -146.214; -113.48; -18.343; -751.16; 267.111; -43.557; -81.991; 224.644;
167.73; 218.705; 16.786; 84.769; 403.277; 92.964; -536.499; 59.121; 373.918; 99.044; -91.952; -292.79;
596.918; -488.727; -471.684; -709.996; 155.382; 64.387; 263.095; 50.069; 47.84; 373.703; 74.842;
-117.303; 146.866; 171.693; 36.535; 48.783; -116.079; -20.282; 6.377; 5.001; -16.583; 0.506; 82.552;
96.052; -210.158; -201.05; -27.24; -268.39; -75.503; 160.697; 121.984; 7.788; -196.493; -86.462;
-90.693; -691.693; 419.689; -313.173; -73.34; -44.991; 132.638; -46.613; -302.799; 229.549; 92.099;
299.978; -783.563; 214.792; 152.29; 10.151; 418.609
plot(residuals(res$fit))

残差的自相关:
par(mfrow = c(2,1), mar = c(5,4,4,3))
tmp <- acf(residuals(res$fit), lag.max = 53, plot = FALSE)
tmp$acf[1] <- NA
plot(tmp, ylim = c(-0.4, 0.4))
pacf(residuals(res$fit), lag.max = 53, ylim = c(-0.4, 0.4))

残差的自相关揭示了 52 阶滞后(滞后一年)的重要性。合并此滞后的一种方法是将其定义如下:
xlag52 <- ts(c(rep(NA, 52), window(x, start = c(2013))))
tsp(xlag52) <- tsp(x)
并通过xlag52函数xreg或中的tso 参数arima。然而,可能是因为这种滞后的样本太小,算法在拟合 ARIMA 模型时会遇到困难。
编辑
@IrishStat 提到的季节性假人的想法比尝试添加 52 阶滞后更合适。您可以使用forecast包的这些功能:seasonaldummies生成季节性假人或生成季节性假人fourier的三角函数表示。为了说明和作为@IrishStat 已经显示的结果的补充,下面我展示了我使用季节性周期的前 10 个组件得到的结果。
seas <- fourier(x, K=10)
trend <- seq_along(x)
mo <- outliers(c("TC", rep("AO", 5)), c(2, 14, 42, 65, 120, 148))
outl <- outliers.effects(mo, length(x))
seas <- fourier(x, K=10)
trend <- seq_along(x)
res2 <- arima(x, order = c(1,0,0), xreg = cbind(seas, trend, outl))
这产生以下残差
plot(residuals(res2))

par(mfrow = c(2,1), mar = c(5,4,4,3))
acf(residuals(res2), lag.max = 52)
pacf(residuals(res2), lag.max = 52)

现在,我们可以看到 52 阶的自相关在残差中不太突出。
获得以下季节性模式估计:
fitted.seas <- ts(seas %*% coef(res2)[3:22])
tsp(fitted.seas) <- tsp(x)
plot(fitted.seas, type = "l", main = "estimated seasonal component")

最后,当您将 R 用于问题中显示的结果时,如果您想使用@IrishStat 提出的模型,您可以执行以下操作:
mo <- outliers(rep("AO", 5), c(14, 65, 42, 39, 120))
outl <- outliers.effects(mo, length(x))
seas <- matrix(0, nrow = length(x), ncol = 52)
for (i in seq(52))
seas[seq(i, length(x), 52),i] <- 1
trend <- seq_along(x)
res3 <- arima(x, order = c(1,0,0), xreg = cbind(seas[,-c(1,18,33)], trend, outl))
本着圣诞节的精神,真诚地尊重 OP 对他合理问题的回答,我每周进行了 152 次观察(近 3 年的数据),并在全自动免提模式下使用 AUTOBOX,一块我帮助开发的软件,给出我认为更完整和全面的答案。人们可以使用任何灵活的分析系统来复制我的结果,并通过一些必要的编程来完成一些技术进步。@javlacalle(先前报告的结果)得出的结论是,尽管残留的 ACF(在 period 处)表明存在循环效应,但他未能提供完整的解决方案,尽管他对他善意的方法出了什么问题有一些线索。我相信他没有能力将一组每周假人无缝集成到他的模型中。这里的问题非常简单:在 acf 中第 52 期的显着滞后的识别可以证明需要 ARIMA 增强或需要确定性的季节性虚拟增强。在 Box 和 Jenkins 以及他们的狂热者大军(我是其中的领导者!)限制 ARIMA(基于内存)解决方案的方法之前,确定性模型(即季节性假人)的丰富历史很流行,并且显然被忽略了。在存在的情况下整合确定性季节性结构的发展。在存在时变系数和时变误差方差的情况下,ARIMA 结构和经验确定的干预措施现在可以常规使用。在这种情况下,@javlacalle 使用的工具包在我看来不够强大,无法正确和完全解决数据提出的问题。使用初始 ARIMA 模型识别的简单方法假设除其他外没有异常、没有确定性季节性虚拟变量、干预检测之前没有确定性趋势,假设一个“良好的 ARIMA 模型”,似乎失败了,因为该系列有一个数据呈显着上升趋势,并包含强烈的确定性每周效应。他的干预检测方案产生了好坏参半的结果,因为残差数据的暂定集受到未指定即明确省略/需要的每周虚拟变量和时间趋势的强烈影响。
我已经在网上发布了我的完整结果http://www.autobox.com/stack/weekly.zip. 最终模型包括一个 AR(1) 系数值 0.606,奇怪地接近于报告的 0.617 和 48 个每周虚拟变量(缺少第 1、18 和 33 周)、5.54 的趋势值和第 12 期的大约 5 个加性异常值 (AO) ,14,65,42 和 39。最终模型统计数据显示 MSE 为 44800,比之前报告的 88411 减少了 50%,这强调了模型的差异。以下是表示随机性的残差图。残差的最终 ACF,明显没有任何滞后 52 效应,可在 week.zip 中作为 finalacf.txt 获得。此处显示了最终模型残差的图。重要的是要注意,与先前报告的结果相比,误差范围显着减小。
拟合/预测图很好地展示了模型的本质,并在此处显示。
Cleansed Data 图很好地突出了 5 个异常的简约识别。
每周虚拟变量的加入需要额外的参数(我认为需要这些参数,因为它们在统计上很重要),尽管我已经能听到一些读者的喘息声,他们对使用这么多参数表示怀疑。
实际/拟合和预测图对于理解这些强大的结果也很有用。
虽然所有模型都是错误的,但这个模型似乎在解释过去和预测未来 52 周方面特别有用。
总之,虽然 ARIMA 结构相同,但模型在趋势和季节性成分方面存在显着差异,估计误差方差减少了近 50%。重述报告结果的误差方差比我建议的模型大 100%。我确信,如果能以某种方式自动整合每周的虚拟变量,结果仍然会显示赤字。OP 在视觉上明显的趋势和季节性现在安全地反映在模型和预测中。最后,周期性模型不一定是自回归(记忆)模型,在这种情况下,它可能是季节性虚拟模型。量子点