在存在tsCV
和forecast
函数的情况下,我无法使用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
最后一个例子是,在我们不进行交叉验证的情况下,将elm
与xreg
函数一起使用
z3<-ts(rnorm(rnorm(112,150,20)))
fit <- elm(z1,type='lasso',reps=50,xreg=data.frame(z3))
我希望我已经清楚了,我的尝试足以说明问题