Ошибка "Объект не найден" в пакете прогнозов

Я работаю с пакетом прогнозов (версия 8.5) в R (версия 3.5.3), пытаясь сделать некоторые прогнозы ARIMA, используя великолепную функцию auto.arima ().

При запуске этой функции я всегда получаю код ошибки: «Ошибка в eval (expr, p): объект 'fitxreg' не найден». Я уже пробовал отладку и не смог точно понять, в чем проблема, но когда я вернусь к прогнозу 8.4, этот блок кода работает без проблем.

arimaIssue <- function(fitxreg = NULL, forxreg = NULL){
  library(forecast)

  fit <- auto.arima(AirPassengers[1:87], 
                    seasonal = FALSE, 
                    xreg = fitxreg, lambda = 'auto', allowmean = TRUE)

  fcast <- forecast(fit, xreg = forxreg, h = 3)

  return(fcast)
}

arimaIssue()

Я ожидал, что это вернет объект прогноза из auto.arima (), который не использует внешние регрессоры (обратите внимание, что и fitxreg, и forxreg имеют значение NULL). Однако я просто получаю описанную выше ошибку.

Любая помощь приветствуется!


person BurlyPotatoMan    schedule 26.03.2019    source источник


Ответы (2)


Решение

Мы можем добавить проверку, чтобы увидеть, является ли fitxreg NULL или нет

arimaIssue <- function(fitxreg = NULL, forxreg = NULL){
  library(forecast)

  if(missing(fitxreg)){
    fit <- auto.arima(AirPassengers[1:87], 
                    seasonal = FALSE, 
                    xreg = NULL, lambda = 'auto', allowmean = TRUE)
  } else {
    fit <- auto.arima(AirPassengers[1:87], 
                            seasonal = FALSE, 
                            xreg = fitxreg, lambda = 'auto', allowmean = TRUE)
  }
  fcast <- forecast(fit, xreg = forxreg, h = 3)

  return(fcast)
}

arimaIssue()

Возврат:

   Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
88       320.8124 278.8410 370.7503 259.3371 401.0221
89       310.9559 254.0070 384.2721 229.0197 431.6157
90       301.5867 239.6709 384.1640 213.1853 439.0395

Решение, если вы не против установить переменную в своей глобальной среде,

arimaIssue <- function(fitxreg = NULL, forxreg = NULL){
  library(forecast)
  fitxreg <<- fitxreg
    fit <- auto.arima(AirPassengers[1:87], 
                    seasonal = FALSE, 
                    xreg = fitxreg, lambda = 'auto', allowmean = TRUE)

  fcast <- forecast(fit, xreg = forxreg, h = 3)

  return(fcast)
}

arimaIssue()


   Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
88       320.8124 278.8410 370.7503 259.3371 401.0221
89       310.9559 254.0070 384.2721 229.0197 431.6157
90       301.5867 239.6709 384.1640 213.1853 439.0395
person Hector Haffenden    schedule 26.03.2019
comment
Это определенно работает, но есть ли способ решить эту проблему без установки переменной в глобальной среде? Спасибо за помощь! - person BurlyPotatoMan; 26.03.2019
comment
Это более уместно? @BurlyPotatoMan - person Hector Haffenden; 26.03.2019
comment
Да! Спасибо! Я только что опубликовал решение, которое делает то же самое, только с меньшим количеством кода. Спасибо вам за помощь! - person BurlyPotatoMan; 26.03.2019
comment
@BurlyPotatoMan Не беспокойтесь, это была интересная проблема, подумайте о том, чтобы принять ответ (зеленая галочка в верхнем левом углу ответа), если он отвечает на ваш вопрос. - person Hector Haffenden; 26.03.2019

Понятно!

Проблема в том, что подходящий объект содержит имя внешнего регрессора как «fitxreg», и когда прогноз () ищет «fitxreg», он ничего не находит. Следующее обновление кода теперь дает прогноз. Спасибо Гектору за подсказку о том, что происходит!

arimaIssue <- function(fitxreg = NULL, forxreg = NULL){
  library(forecast)

  fit <- auto.arima(AirPassengers[1:87], seasonal = FALSE, xreg = fitxreg, lambda = 'auto',
                    allowmean = TRUE)

  if(is.null(fitxreg)){
    fit$call$xreg <- NULL
  }


  fcast <- forecast(fit, xreg = forxreg, h = 3)

  return(fcast)
}

arimaIssue()
person BurlyPotatoMan    schedule 26.03.2019