与时间序列和xreg的交叉验证

时间:2019-05-31 20:18:19

标签: time-series forecasting cross-validation

在存在tsCVforecast函数的情况下,我无法使用xreg包中的函数elm对时间序列进行交叉验证。 nnfor软件包。

要像Hyndman撰写的here一样与xreg进行交叉验证,我们应该使用以下函数(示例):

library(forecast)

fc <- function(y, h, xreg)
{
  X <- xreg[1:length(y),]
  if(NROW(xreg) < length(y) + h)
    stop("Not enough xreg data for forecasting")
  newX <- xreg[length(y)+(1:h),]
  fit <- auto.arima(y, xreg=X)
  forecast(fit, xreg=newX)
}

# Test
y <- ts(rnorm(100))
x <- matrix(ts(rnorm(100)),ncol=1)

tsCV(y, fc, xreg=x)

这是auto.arima的特例,但我们可以适应其他模型,就像我对nnetar(自回归神经网络)所做的那样

    z1<-ts(rnorm(rnorm(100,150,20)))
    z2<-ts(rnorm(rnorm(100,150,20)))

        fc1 <- function(y, h, xreg)
        {
          X <- xreg[1:length(y),]
          if(NROW(xreg) < length(y) + h)
            stop("Not enough xreg data for forecasting")
          newX <- xreg[length(y)+(1:h),]
          fit <- nnetar(y,repeats=200,p=1,P=1,xreg=X)
          forecast(fit, xreg=newX)
        }
        test1<-tsCV(z1, fc1, xreg=z2,h=2)

head(test1)
Time Series:
Start = 1 
End = 6 
Frequency = 1 
         h=1        h=2
1         NA         NA
2         NA         NA
3  1.1512374  0.4210337
4 -0.4963436 -2.7574866
5 -2.0564821 -1.5121580
6 -1.5738913 -0.9921145

,这些命令可以完美运行,甚至可以放xreg。在elm的情况下,该方法似乎不接受xreg作为ts,而仅接受作为矩阵/ df。好的,但是尝试下面的代码,结果是NA

的向量
z1<-ts(rnorm(rnorm(100,150,20)))
z2<-ts(rnorm(rnorm(100,150,20)))

fc <- function(y, h, xreg)
    {
      X <- xreg[1:length(y),]
      if(NROW(xreg) < length(y) + h)
        stop("Not enough xreg data for forecasting")
      newX <- xreg[length(y)+(1:h),]
      fit <- elm(y,type='lasso',reps=1,xreg=data.frame(X))
      forecast(fit, xreg=data.frame(newX))
    }
test<-tsCV(z1, fc, xreg=z2,h=2)

tail(test)

Time Series:
Start = 95 
End = 100 
Frequency = 1 
    h=1 h=2
 95  NA  NA
 96  NA  NA
 97  NA  NA
 98  NA  NA
 99  NA  NA
100  NA  NA

问题似乎出在使用xreg时,因为尝试在没有tsCV的情况下使用elm xreg,所以根据命令成功了

fc2 <- function(x, h){forecast(elm(x,type='lasso',reps=2), h=h)}
test2<- tsCV(z1, fc2, h=2)
tail(test2))

Time Series:
Start = 95 
End = 100 
Frequency = 1 
           h=1        h=2
 95  1.6305545 -1.3471257
 96 -1.3642895 -1.6843630
 97 -1.6701517 -1.4690025
 98 -1.4517845 -0.2956304
 99 -0.2808163         NA
100         NA         NA

最后一个例子是,在我们不进行交叉验证的情况下,将elmxreg函数一起使用

z3<-ts(rnorm(rnorm(112,150,20)))
fit <- elm(z1,type='lasso',reps=50,xreg=data.frame(z3))

我希望我已经清楚了,我的尝试足以说明问题

0 个答案:

没有答案