Перекрестная проверка временных рядов в R: использование tsCV () с tslm () - Модели - PullRequest
0 голосов
/ 09 мая 2018

В настоящее время я пытаюсь оценить tslm-модель, используя перекрестную проверку временных рядов. Я хочу использовать фиксированную модель (без переоценки параметров), чтобы взглянуть на прогнозы горизонта на 1–3 шага вперед на период оценки прошлого года.

У меня проблемы с получением tsCV и tslm из библиотеки прогнозов для совместной работы. Чего мне не хватает?

library(forecast)
library(ggfortify)

AirPassengers_train <- head(AirPassengers, 100)
AirPassengers_test  <- tail(AirPassengers, 44)

## Holdout Evaluation
n_train <- length(AirPassengers_train)
n_test  <- length(AirPassengers_test)
pred_train <- ts(rnorm(n_train))
pred_test  <- ts(rnorm(n_test))

fit <- tslm(AirPassengers_train ~ trend + pred_train)

forecast(fit, newdata = data.frame(pred_train = pred_test)) %>% 
  accuracy(AirPassengers_test)
#>                        ME     RMSE      MAE       MPE     MAPE     MASE
#> Training set 1.135819e-15 30.03715 23.41818 -1.304311 10.89785 0.798141
#> Test set     3.681350e+01 76.39219 55.35298  6.513998 11.96379 1.886546
#>                   ACF1 Theil's U
#> Training set 0.6997632        NA
#> Test set     0.7287923  1.412804


## tsCV Evaluation
fc_reg <- function(x) forecast(x, newdata = data.frame(pred_train = pred_test),
                               h = h, model = fit)

tsCV(AirPassengers_test, fc_reg, h = 1)
#>      Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
#> 1957                  NA  NA  NA  NA  NA  NA  NA  NA
#> 1958  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
#> 1959  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
#> 1960  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA


forecast(AirPassengers_test, newdata = data.frame(pred_train = pred_test),
         h = 1, model = fit)
#> Error in forecast.ts(AirPassengers_test, newdata = data.frame(pred_train = pred_test),
#> : Unknown model class

У меня такое ощущение, что https://gist.github.com/robjhyndman/d9eb5568a78dbc79f7acc49e22553e96 актуально. Как бы я применил это к сценарию выше?

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

В итоге я использовал функцию для прогнозирования тренда. Я не уверен, правильно ли это указано, но rmse выглядит примерно так.

flm <- function(y, h) { forecast(tslm(y ~ trend, lambda=0), h=h) }

e <- tsCV(tsDF, flm, h=6)
sqrt(mean(e^2, na.rm=TRUE))

@ robhyndman

0 голосов
/ 10 мая 2018

Для перекрестной проверки временных рядов вы должны подгонять отдельную модель к каждому тренировочному набору, не пропуская существующую модель. Благодаря переменным предикторам функция должна иметь возможность захватывать соответствующие элементы при подборе каждой модели и другие элементы при составлении прогнозов.

Будет работать следующее.

fc <- function(y, h, xreg)
{
  if(NROW(xreg) < length(y) + h)
    stop("Not enough xreg data for forecasting")
  X <- xreg[seq_along(y),]
  fit <- tslm(y ~ X)
  X <- xreg[length(y)+seq(h),]
  forecast(fit, newdata=X)
}

# Predictors of the same length as the data
# and with the same time series characteristics.    
pred <- ts(rnorm(length(AirPassengers)), start=start(AirPassengers),
           frequency=frequency(AirPassengers))

# Now pass the whole time series and the corresponding predictors 
tsCV(AirPassengers, fc, xreg=pred)

Если у вас более одной переменной-предиктора, тогда xreg должна быть матрицей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...