Я пытаюсь провести перекрестную проверку временных рядов, используя функцию tsCV
из пакета forecast
в случае, если есть xreg
и функция elm
пакета nnfor
.
Чтобы выполнить перекрестную проверку с 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))
Надеюсь, я был ясен и моих попыток было достаточно, чтобы проиллюстрировать проблему