为时间序列问题查找acf值时出现问题

时间:2018-10-03 11:05:58

标签: python r time-series

我正在尝试在时序问题中找到acf的值。我有一个2003年至2017年的数据集。

我正在使用以下函数创建数据的时间序列

tf = ts(df$x, start = c(2003,1), end = c(2017,12), frequency = 12)

当我尝试通过使用函数进行绘图来找到acf的值

acf(ts)

我的图是这样的

enter image description here

使用时序函数时,我无法得出“ p”的值应该是什么。如图所示,没有反转

fit = arima(tf, c(p,2,3))

作为参考,https://github.com/girijesh18/dataset/blob/master/timeSeries.csv我的数据如下

我无法弄清楚应该为“ p”使用什么值。我还尝试过在1到20之间的“ p”值,但预测值不是很准确。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

首先,我将利用您的时间序列的差异去趋势化,它具有相当大的随机趋势。最明显的迹象是,除了时间序列呈稳定上升趋势外,ACF组件需要很长时间才能消失。虽然您可以像使用漂移项那样使模型适合数据,但是当趋势不存在时,读取ACF和PACF图要容易得多。

tf <- structure(c(58082, 48500, 45723, 53662, 46723, 45070, 49782, 55437,
57672, 61121, 43857, 49819, 50750, 53589, 53812, 53575, 52339, 51115,
56529, 61498, 58757, 72876, 55999, 58374, 63885, 63287, 60027, 65795,
62850, 61908, 68108, 72639, 77105, 84996, 65488, 62178, 74750, 66085,
59711, 69304, 68357, 67133, 74545, 73623, 82071, 89533, 72117, 69004,
72681, 80214, 80744, 81643, 87599, 86213, 97495, 97841, 104953, 110353,
90415, 83875, 93160, 89539, 85021, 91314, 87036, 83731, 91047, 94552,
105628, 94743, 84954, 72535, 77898, 68418, 60609, 73703, 67298, 64375,
73550, 76887, 77538, 92233, 73267, 77779, 80634, 72736, 81475, 87595,
87386, 88874, 95145, 96991, 95186, 106122, 81173, 77941, 88576, 86372,
77850, 91188, 90547, 87803, 95264, 90054, 100544, 96302, 82402, 78297,
91847, 86235, 87557, 91139, 93116, 93855, 94172, 100003, 97051, 86785,
84849, 81682, 88273, 85645, 80121, 92187, 96409, 97609, 94971, 111356,
102049, 110838, 97596, 88747, 100882, 97801, 99312, 100163, 112241, 101667,
122227, 127548, 123216, 131987, 112248, 118140, 128127, 114529, 151671,
135476, 148513, 141155, 142314, 142144, 139774, 142715, 124773, 111401,
129554, 140624, 128378, 130208, 141051, 132299, 145779, 152341, 146552,
150930, 139732, 133423, 154363, 148374, 137392, 149258, 160086, 154738,
159570, 164496, 166885, 188369, 144181, 148121, 169758, 158890, 159699,
161691, 165828, 175617, 181875, 182883), .Tsp = c(1, 188, 1), class = "ts")

par(mfrow=c(3, 1), mar=c(3, 3, 2, 1), mgp=c(2, 0.6, 0), oma=c(0, 0, 0, 0))
plot(tf); acf(tf, main=""); pacf(tf, main="")

图1

enter image description here

tf.d <- diff(tf)
plot(tf.d); acf(tf.d, main=""); pacf(tf.d, main="")

图2

enter image description here

现在,我们可以开始解释图,从ACF开始。我们可以看到,滞后1处的相关为负,当我们取一个序列的差时,这常常会发生,被称为“超差分”。由于具有与过去的数据点极为相似的数据点序列,现在它们与过去的数据点极为相似,从而增加了周期1的波动。从图中可以看出,水平大约为-0.3,而可能还不足以引起问题,可能需要牢记。传统观点还告诉我们,在1个滞后后死亡的ACF应该配备MA(1)系数,我的经验是,最好从AR系数开始,因为它们可能会使MA系数变得多余。但是情况也可能相反,因此MA(1)应该在候选模型中。
查看PACF图,我们在滞后1和滞后2处看到两个重要的分量,这表示一个AR(2)模型。
进一步查看ACF和PACF图,我们会看到类似波形的特征以及在滞后12处有一个正峰值,这告诉我这是每月或每两小时一次的数据,并且我们有一个季节性成分。 弄清楚季节成分与非季节成分并没有很大不同,我们将仅以季节/周期性时滞而不是样本时滞来描述相关性。

tf.d12 <- ts(tf.d, f=12)
plot(tf.d12); acf(tf.d12, main="", lag.max=12*4); pacf(tf.d12, main="", lag.max=12*4)

图3

enter image description here

从ACF图来看,我们在滞后的1、2、3、4…时期看到了强大的分量,这在某种程度上让人联想到第一个ACF图,这意味着我们拥有一阶的季节性差异分量,但是没有再次转换数据,我们将现在已经成为SARIMA模型的D设置为1。如开头所述,非平稳性将掩盖ACF图中MA过程的迹象,因此我们必须拭目以待,看看是否有必要。
在PACF图中,我们可以在1、2或3个周期滞后处找到重要的分量,但出于简约的精神,我们假设SAR(2)就足够了。

现在的下一步是拟合所有模型并评估残差的ACF和PACF。如果我们在选择候选模型方面很聪明,那么这里应该不会太多。由于对数据的性质一无所知,这三者几乎是任意选择的。

ari1 <- arima(tf.d12, order=c(2, 0, 0), seasonal=c(2, 1, 0))
ari2 <- arima(tf.d12, order=c(1, 0, 1), seasonal=c(2, 1, 0))
ari3 <- arima(tf.d12, order=c(1, 0, 1), seasonal=c(2, 1, 1))

par(mfcol=c(3, 2), mar=c(3, 3, 2, 1), mgp=c(2, 0.6, 0), oma=c(0, 0, 1.5, 0))
acf(residuals(ari1), main="", ylim=c(-0.2, 1), lag.max=12*4)
mtext(ari1$call, 3, cex=0.8)
acf(residuals(ari2), main="", ylim=c(-0.2, 1), lag.max=12*4)
mtext(ari2$call, 3, cex=0.8)
acf(residuals(ari3), main="", ylim=c(-0.2, 1), lag.max=12*4)
mtext(ari3$call, 3, cex=0.8)
pacf(residuals(ari1), main="", ylim=c(-0.2, 0.44), lag.max=12*4)
mtext(ari1$call, 3, cex=0.8)
pacf(residuals(ari2), main="", ylim=c(-0.2, 0.44), lag.max=12*4)
mtext(ari2$call, 3, cex=0.8)
pacf(residuals(ari3), main="", ylim=c(-0.2, 0.44), lag.max=12*4)
mtext(ari3$call, 3, cex=0.8)
mtext("residual values", 3, outer=TRUE, cex=1.3)

图4

enter image description here

诸如此类的图表,关于数据的经验和理论知识,信息标准的应用(如AICc)和验证(如CV),将带您找到合适的模型。盲目地信任auto.arima()是不好的。

更多注意事项:

par(mfrow=c(1, 1), mar=c(3, 3, 2, 1), mgp=c(2, 0.6, 0), oma=c(0, 0, 0, 0))
plot(stl(tf.d12, "periodic"))

图5

enter image description here

如果我们分解tf.d12,我们会发现数据中仍然有轻微的趋势。在模型中添加非季节性差异可能是合适的:

arima(tf.d12, order=c(2, 1, 1), seasonal=c(2, 1, 1))

分解还揭示了看起来像时间分量的其余部分,幅度似乎随着时间增加。我们的模型不处理这个问题。

tsoutliers::locate.outliers表示索引145处的一个加法离群值以及索引71和149处的两个时间变化。

对不起,这有点冗长,我开始研究数据,无法停止。最后,整件事可能更适合Cross Validated,那里还有很多知识渊博的人可以发表第二意见。

答案 1 :(得分:0)

要计算出P,请使用PACF,而不是ACF。

尽管仅使用R中预测包中的auto.arima函数要容易得多,它将自动为您找到最佳的p,q,d值。