【问题标题】:Removing trend by performing differencing in Time series prediction通过在时间序列预测中执行差分来消除趋势
【发布时间】:2014-07-19 14:52:30
【问题描述】:

根据文献,对于时间相关性建模,应从时间序列数据中去除趋势。我们选择差分来消除趋势。

我想知道:

当我们执行差分时,数据会完全改变,随后预测也会改变。 例如,如果我们假设数据的范围是 7.9、7.25、6.98 和 ...,那么在执行差分之后,预测将低于 1。 我们应该如何评估现实世界数据中的预测? 我们是否也应该对参考数据执行类似的差分?

我正在使用 AR(p) 时间模型。此外,该过程在 R 软件中实现。

Data sample (rn25_29_o):

class = c("POSIXct", 
"POSIXt"), tzone = "")), .Names = c("ambtemp", "dt"), row.names = c(NA, 
486L), class = "data.frame")

  ambtemp                  dt
1   -1.96 2007-09-28 23:55:00
2   -2.02 2007-09-28 23:57:00
3   -1.92 2007-09-28 23:59:00
4   -1.64 2007-09-29 00:01:00
5   -1.76 2007-09-29 00:03:00
6   -1.83 2007-09-29 00:05:00

dput(Dif_Median_ambtemp) 
structure(c(NA, 0.2, 0.16, -0.0700000000000001, -0.1, -0.04, 
-0.01, 0, 0.0700000000000001, 0.23, 0.16, -0.26, -0.3, -0.18, 
0, -0.04, -0.04, 0.14, 0.14, 0.14, -0.02, -0.0999999999999999, 
0, 0.16, 0.0900000000000001, 0.28, 0.27, -0.17, -0.17, 0, -0.02, 
-0.12, -0.1, 0, -0.05, -0.0800000000000001, -0.0699999999999998, 
0, 0.03, -0.00999999999999979, 0, 0.0999999999999999, 0.0999999999999999, 
0.0800000000000001, 0.12, 0.24, 0.26, 0.0999999999999999, 0.0599999999999998, 
0.02, 0, -0.02, -0.0599999999999998, -0.0399999999999998, 0, 
0, -0.02, -0.0700000000000001, -0.24, -0.37, -0.22, -0.0799999999999998, 
-0.03, -0.12, -0.03, 0.1, 0.02, 0.14, 0.18, 0.0600000000000001, 
0, -0.02, -0.0600000000000001, -0.04, 0, -0.02, -0.0999999999999999, 
-0.11, -0.16, -0.13, 0.0800000000000001, 0.0800000000000001, 
0, 0.01, 0.12, 0, 0.22, 0.23, -0.1, -0.0800000000000001, -0.0800000000000001, 
0, 0, 0.02, 0.28, 0.3, 0.04, -0.0900000000000001, -0.0900000000000001, 
-0.01, -0.22, -0.37, -0.16, 0, -0.32, -0.45, -0.13, 0.04, 0.04, 
0, 0.1, 0.12, 0.0399999999999996, 0, 0, -0.12, 0, 0.14, 0.02, 
0, 0.02, 0.34, 0.3, -0.0800000000000001, -0.0900000000000001, 
-0.01, -0.01, -0.12, -0.11, 0, -0.17, -0.17, -0.16, -0.16, 0.24, 
0.24, 0.0900000000000003, 0.0900000000000003, 0, 0.11, 0.41, 
0.45, 0.27, 0, -0.15, -0.03, 0.0600000000000001, 0.0800000000000001, 
0.0600000000000001, 0.04, 0, -0.04, -0.0600000000000001, -0.14, 
-0.18, -0.0600000000000001, -0.01, -0.26, -0.32, -0.22, -0.15, 
0.12, 0.18, 0.0600000000000001, 0, 0.0800000000000001, 0, -0.11, 
-0.0299999999999998, 0.2, 0.33, 0.13, 0.0600000000000001, 0.0600000000000001, 
-0.01, -0.03, -0.15, -0.15, -0.0799999999999998, -0.0899999999999999, 
-0.04, -0.01, -0.01, -0.0600000000000001, -0.05, 0, 0.02, 0.05, 
0.18, 0.17, 0.05, 0.0800000000000001, 0.0600000000000001, 0.3, 
0.34, 0.0499999999999998, 0.02, 0.05, 0.03, -0.23, -0.48, -0.33, 
-0.13, -0.14, -0.11, -0.02, 0.04, 0.0800000000000001, 0.0800000000000001, 
0.13, 0.15, 0.0700000000000001, 0.01, -0.02, -0.0800000000000001, 
-0.0600000000000001, -0.04, -0.0799999999999998, -0.0499999999999998, 
-0.04, -0.03, -0.04, -0.0600000000000001, -0.02, 0.02, 0.04, 
0.04, 0.02, 0, 0, 0, 0, 0.02, 0.02, 0, 0.02, 0.0399999999999998, 
0.0199999999999998, 0, 0.14, 0.31, 0.19, 0.02, -0.01, -0.0700000000000001, 
-0.23, -0.2, -0.03, 0, -0.0799999999999998, -0.0799999999999998, 
0.44, 0.54, 0.0999999999999999, 0.1, 0.1, 0.26, 0.26, 0, 1.08, 
1.08, -0.24, -0.62, -0.44, -0.18, -0.02, 0, 0, 0.01, 0.16, 0.55, 
0.3, 0.26, 0.18, 0.18, 0.26, 0, -0.37, -0.37, 0.18, 0.41, 0.35, 
0.12, -0.73, -0.73, 0.07, 0.23, 0.16, -0.26, -0.26, 0.4, 0.4, 
0, 0.08, 1.1, 1.02, -0.27, -0.62, -0.84, -0.49, 0.19, 1.29, 1.12, 
0.62, 0.76, 0.48, 0.32, -0.82, -0.92, -0.17, -0.19, -0.33, -0.21, 
0, 0, 0.44, 0.98, 0.65, 0.11, -0.13, -0.13, -0.44, -0.89, -0.45, 
0.17, 0.17, 0.38, 0.4, 0.3, 0.16, 0, 0.5, 0.38, -0.22, -0.72, 
-0.65, 0, 0.38, 0.23, 0.0900000000000001, 0.25, 0.16, 0.66, 0.66, 
0, -1.09, -1.09, 0.17, 0.91, 0.8, 0.0599999999999996, 0, -0.21, 
-0.21, -0.0299999999999998, -0.0299999999999998, 0.16, 0.58, 
0.42, 0.62, 0.66, 0.0399999999999996, -0.96, -0.96, 0, 0, -0.04, 
-0.04, 0.71, 0.71, -0.27, -0.27, -0.54, 0.91, 1.44, 0.0599999999999996, 
0, -0.19, -0.379999999999999, -0.26, -0.0600000000000001, -0.0600000000000001, 
0.28, 0.45, 0, -0.22, -0.0499999999999998, 0.37, 0.57, 0.600000000000001, 
0, -0.95, -0.55, 0.21, 1.16, 0.04, -0.510000000000001, 0.0800000000000001, 
-0.22, 0.0999999999999996, 0.29, 0.29, -0.84, -0.84, 0.82, 0.87, 
0.0499999999999998, -0.34, -0.34, 0.0599999999999996, 0.0699999999999994, 
0.00999999999999979, 0, 0.31, 0.220000000000001, -0.0899999999999999, 
0, 0.199999999999999, 0.43, 0.23, -0.12, -0.12, -0.0199999999999996, 
-0.0199999999999996, 0, 0.52, 0.52, -0.44, -0.44, -0.0700000000000003, 
0.38, -0.29, -0.590000000000001, 0.149999999999999, 0, -0.34, 
-0.34, 0.350000000000001, 0.4, 0.0499999999999998, 0, 0.0700000000000003, 
0.0700000000000003, -0.0800000000000001, -0.0800000000000001, 
0, 0.0800000000000001, 0.66, 0.58, 0, 0.0499999999999998, 0.0499999999999998, 
-0.0300000000000002, -0.0300000000000002, -0.17, -0.42, -0.42, 
-0.37, -0.2, -0.13, 0.04, 0.17, 0.64, 0.71, 0.2, 0.13, 0.17, 
-0.51, -0.399999999999999, 0, 0, 0.26, -0.0200000000000005, 0, 
0.44, 0.75, 0.31, 0, -0.3, -0.3, 0, 0.00999999999999979, 0.00999999999999979, 
NA), .Dim = c(484L, 1L), .Dimnames = list(NULL, "ambtemp"))

dput(x.fore)
structure(list(pred = structure(c(5.77898604276542, 5.76851499635615, 
5.75806783191914, 5.74764449498526, 5.73724493120963), .Tsp = c(487, 
491, 1), class = "ts"), se = structure(c(0.32761784341869, 0.40079130692622, 
0.46226728095271, 0.516242830302498, 0.564873114585049), .Tsp = c(487, 
491, 1), class = "ts")), .Names = c("pred", "se"))

代码:

require(zoo)
require(xts)
n= 3

ambtemp <-  subset(rn25_29_o, select=c("ambtemp")) # creating subset which includes only "ambtemp" column
Median_ambtemp <- rollmedian(ambtemp,n,fill = list(NA, NULL, NA)) # smoothing the data

Dif_Median_ambtemp <- diff(Median_ambtemp, 2)

te = (x.fit = arima(Dif_Median_ambtemp, order = c(1, 0, 0)))   # fit the model and print the results
x.fore = predict(te, n.ahead=5)

【问题讨论】:

  • 是的,如果您使用差异数据,您应该调整预测。如果您将此信息添加到帖子中,将更容易为您提供更多详细信息:您使用的是哪种模型,ARIMA 时间序列模型?你用的是哪个软件?你能发布一些示例数据吗?
  • @javlacalle 问题已修改。我应该如何调整预测?

标签: time-series prediction difference trend


【解决方案1】:

这不是一个可复制的例子(我应该加载哪个包来使用rollmediann的值是多少?最好将dput(rn25_29_o)的输出贴出来,这样我们就不需要猜测了数据的结构?无论如何,看代码我看到下面应该调整预测到与Median_ambtemp相同的水平:

diffinv(x.fore$pred, lag = 2, xi = tail(Dif_Median_ambtemp, 2))

【讨论】:

  • xi 应该包含观察到的系列的最后一个值,特别是,与您在对数据进行差分时使用的滞后顺序一样多(用于执行逆序的顺序相同)差分滤波器)。在这种情况下,滞后为 2,因此 xi 包含该系列的最后两个值。
  • 我在运行代码时遇到错误:diffinv.vector(x, lag, Difference, xi) 中的错误:外部函数调用中的 NA/NaN/Inf (arg 2)
  • 正如我所说,我无法重现您的示例。您可以发布dput(Dif_Median_ambtemp)dput(x.fore) 的输出。
  • 谢谢。我没有收到该错误,但由于Dif_Median_ambtemp 中的最后一个值不可用(NA),一些预测也是NA。我建议您为Dif_Median_ambtemp 拟合模型,而不包括最后的观察结果Dif_Median_ambtemp[1:483]。在这种情况下,我应用diffinv 后得到的预测是:0.0100 0.0100 0.0310 0.0366 0.0604 0.0674 0.0919
  • 我也可以更正代码。我得到了与您提到的反向预测相同的结果。但是,预测应该是:5.652297、5.605061、5.558288、5.511974、5.466113。
猜你喜欢
  • 2016-01-09
  • 2020-01-05
  • 1970-01-01
  • 2020-02-05
  • 2019-03-23
  • 2021-11-22
  • 2021-07-15
  • 1970-01-01
  • 2012-11-29
相关资源
最近更新 更多