尝试在R中产生预测错误时出错

时间:2018-08-24 14:40:36

标签: r forecasting

我正在尝试修改我拥有的某些代码,这些代码可以工作,以使用不同的函数来估计模型。原始代码如下,并且可以与ARIMA函数一起使用:

S=round(0.75*length(ts_HHFCE_log))
h=1

error1.h <- c()
for (i in S:(length(ts_HHFCE_log)-h))
{
  mymodel.sub <- arima(ts_HHFCE_log[1:i], order = c(0,1,3),seasonal=c(0,0,0))
  predict.h <- predict(mymodel.sub,n.ahead=h)$pred[h]
  error1.h <- c(error1.h,ts_HHFCE_log[i+h]-predict.h)
}

直觉如下:您的时间序列的长度为T。您从样本的开头开始,但是要给出足够的观察值以回归并获取alpha和beta的参数系数。为了简单起见,我们称其为t。然后,基于此,对于时间段(t + 1),您将提前一个步骤进行预测。然后,您的预测误差是(t + 1)的实际值与基于直到t之前可用数据的回归的预测值之间的差。然后进行迭代,并从头考虑(t + 1),回归和预测(t + 2)。然后,您将获得(t + 2)的预测误差。然后,基本上,您将继续执行此迭代过程,直到达到(T-1)并为T生成预测为止。这提供了所谓的动态超出样本的预测误差序列。您可以针对不同的模型执行此操作,然后使用更适合使用的模型进行统计检验。这是仅使用您已有的数据进行样本外预测的一种方法。

我将代码修改如下:

S=round(0.75*length(ts.GDP))
h=1

error1.h <- c()
for (i in S:(length(ts.GDP)-h))
{
  mymodel.sub <- lm(ts.GDP[4:i] ~ ts.GDP[3:(i-1)] + ts.GDP[2:(i-2)] + ts.GDP[1:(i-3)])
  predict.h <- predict(mymodel.sub,n.ahead=h)$pred[h]
  error1.h <- c(error1.h,ts.GDP[i+h]-predict.h)
}

我正在尝试制作AR(3)模型。我不使用ARIMA函数的原因是因为我还想将这些预测误差与ARDL模型进行比较,据我所知,对于ARDL模型没有简单的函数(我必须使用lm() ,因此为什么我要使用lm()函数来建立AR(3)模型。

我想比较AR(3)模型的模型如下:

model_ts.GDP_1 <- lm(ts.GDP[4:123] ~ ts.GDP[3:122] + ts.GDP[2:121] + ts.GDP[1:120] + ts.CCI_AGG[3:122] + ts.CCI_AGG[2:121] + ts.CCI_AGG[1:120])

我不确定如何进一步修改代码以获取所需的信息。希望我所解释的直觉在我想做的事情中应该很清楚。

GDP数据基本上是季度增长率。它是固定的。第二个模型中的另一个变量是我使用动态PCA构建的索引,并采用了第一个差异,因此它也是固定的。但是无论如何,在第二种模型中,t的预测仅基于每个GDP的滞后数据和我构建的指标。同样,鉴于我正在使用现有数据模拟样本预测,因此实际进行适当的预测没有问题。 (在时间序列中,该技术被视为比较模型的健壮方法,而不是简单地使用诸如RMSE等之类的方法。)

谢谢!

我正在使用的数据:

Date    GDP_qoq CCI_A_qoq
31/03/1988  2.956   0.540
30/06/1988  2.126   -0.743
30/09/1988  3.442   0.977
31/12/1988  3.375   -0.677
31/03/1989  2.101   0.535
30/06/1989  1.787   -0.667
30/09/1989  2.791   0.343
31/12/1989  2.233   -0.334
31/03/1990  1.961   0.520
30/06/1990  2.758   -0.763
30/09/1990  1.879   0.438
31/12/1990  0.287   -0.708
31/03/1991  1.796   -0.078
30/06/1991  1.193   -0.735
30/09/1991  0.908   0.896
31/12/1991  1.446   0.163
31/03/1992  0.870   0.361
30/06/1992  0.215   -0.587
30/09/1992  0.262   0.238
31/12/1992  1.646   -1.436
31/03/1993  2.375   0.646
30/06/1993  0.249   -0.218
30/09/1993  1.806   0.676
31/12/1993  1.218   -0.393
31/03/1994  1.501   0.346
30/06/1994  0.879   -0.501
30/09/1994  1.123   0.731
31/12/1994  2.089   0.062
31/03/1995  0.386   0.475
30/06/1995  1.238   -0.243
30/09/1995  1.836   0.263
31/12/1995  1.236   -0.125
31/03/1996  1.926   -0.228
30/06/1996  2.109   -0.013
30/09/1996  1.312   0.196
31/12/1996  0.972   -0.015
31/03/1997  1.028   -0.001
30/06/1997  1.086   -0.016
30/09/1997  2.822   0.156
31/12/1997  -0.818  -0.062
31/03/1998  1.418   0.408
30/06/1998  0.970   -0.548
30/09/1998  0.968   0.466
31/12/1998  2.826   -0.460
31/03/1999  0.599   0.228
30/06/1999  -0.651  -0.361
30/09/1999  1.289   0.579
31/12/1999  1.600   0.196
31/03/2000  2.324   0.535
30/06/2000  1.368   -0.499
30/09/2000  0.825   0.440
31/12/2000  0.378   -0.414
31/03/2001  0.868   0.478
30/06/2001  1.801   -0.521
30/09/2001  0.319   0.068
31/12/2001  0.877   0.045
31/03/2002  1.253   0.061
30/06/2002  1.247   -0.013
30/09/2002  1.513   0.625
31/12/2002  1.756   0.125
31/03/2003  1.443   -0.088
30/06/2003  0.874   -0.138
30/09/2003  1.524   0.122
31/12/2003  1.831   -0.075
31/03/2004  0.780   0.395
30/06/2004  1.665   -0.263
30/09/2004  0.390   0.543
31/12/2004  0.886   -0.348
31/03/2005  1.372   0.500
30/06/2005  2.574   -0.066
30/09/2005  0.961   0.058
31/12/2005  2.378   -0.061
31/03/2006  1.015   0.212
30/06/2006  1.008   -0.218
30/09/2006  1.105   0.593
31/12/2006  0.943   -0.144
31/03/2007  1.566   0.111
30/06/2007  1.003   -0.125
30/09/2007  1.810   0.268
31/12/2007  1.275   -0.592
31/03/2008  1.413   0.017
30/06/2008  -0.491  -0.891
30/09/2008  -0.617  -0.836
31/12/2008  -1.410  -1.092
31/03/2009  -1.593  0.182
30/06/2009  -0.106  -0.922
30/09/2009  0.788   0.351
31/12/2009  0.247   0.414
31/03/2010  1.221   -0.329
30/06/2010  1.561   -0.322
30/09/2010  0.163   0.376
31/12/2010  0.825   -0.104
31/03/2011  2.484   0.063
30/06/2011  -0.574  -0.107
30/09/2011  0.361   -0.006
31/12/2011  0.997   -0.304
31/03/2012  0.760   0.243
30/06/2012  0.143   -0.381
30/09/2012  2.547   0.315
31/12/2012  0.308   -0.046
31/03/2013  0.679   0.221
30/06/2013  0.766   -0.170
30/09/2013  1.843   0.352
31/12/2013  0.756   0.080
31/03/2014  1.380   -0.080
30/06/2014  1.501   0.162
30/09/2014  0.876   0.017
31/12/2014  0.055   -0.251
31/03/2015  0.497   0.442
30/06/2015  1.698   -0.278
30/09/2015  0.066   0.397
31/12/2015  0.470   0.076
31/03/2016  1.581   0.247
30/06/2016  0.859   -0.342
30/09/2016  0.865   -0.011
31/12/2016  1.467   0.049
31/03/2017  1.006   0.087
30/06/2017  0.437   -0.215
30/09/2017  0.527   0.098
31/12/2017  0.900   0.218

1 个答案:

答案 0 :(得分:0)

您唯一需要了解的是如何使用lm获得预测,没有必要添加其他详细信息(没有可重复的数据只会使您变得更加困难)。

创建虚拟数据:

set.seed(123)
df<-data.frame(a=runif(10),b=runif(10),c=runif(10))
> print(df)
       a          b         c
1  0.2875775 0.95683335 0.8895393
2  0.7883051 0.45333416 0.6928034
3  0.4089769 0.67757064 0.6405068
4  0.8830174 0.57263340 0.9942698
5  0.9404673 0.10292468 0.6557058
6  0.0455565 0.89982497 0.7085305
7  0.5281055 0.24608773 0.5440660
8  0.8924190 0.04205953 0.5941420
9  0.5514350 0.32792072 0.2891597
10 0.4566147 0.95450365 0.1471136

适合您的模型:

model<-lm(c~a+b,data=df)

创建新数据:

new_df<-data.frame(a=runif(1),b=runif(1))

> print(new_df)
      a        b
1 0.9630242 0.902299

从新数据中获取预测:

prediction<- predict(model,new_df)   

> print(prediction)
    1 
0.8270997

在您的情况下,新数据new_df将是您的滞后数据,但是如果您希望我们仔细研究问题的详细信息,则必须进行适当的更改,或者如上所述提供可复制的数据。< / p>

希望这会有所帮助。