Прогнозирование еженедельных данных временных рядов с несколькими регрессорами - PullRequest
0 голосов
/ 11 марта 2019

Мне интересно, как я могу адаптировать использование терминов Фурье Роба Хиндмана, как в этом сообщении в блоге , для прогнозирования еженедельных данных временных рядов с помощью дополнительного регрессора. Ниже моя попытка, но я получаю сообщение об ошибке, которое xreg is rank deficient

library(forecast)
gascsv <- read.csv("https://robjhyndman.com/data/gasoline.csv", header=FALSE)[,1]
gas<- ts(gascsv[1:300], freq=365.25/7, start=1991+31/365.25)
#assume that gasreg is an additional regressor used to forecast gas
gasreg <- ts(gascsv[301:600], freq=365.25/7, start=1991+31/365.25)


bestfit <- list(aicc=Inf)
for(i in 1:25){
  for(j in 1:25){
    fit <- auto.arima(gas, xreg=cbind(fourier(gas, K=i),fourier(gasreg,K=j)), seasonal=FALSE)
    if(fit$aicc < bestfit$aicc){
      bestfit <- fit
      k <-i
      l <- j 
      }
    else break;
  }
}

Спасибо!

Редактировать: После некоторых дополнительных поисков в Интернете я нашел некоторые материалы, которые кажутся полезными. В другом сообщении Роба в качестве регрессоров используется набор терминов Фурье, а также фиктивная переменная. Этот пост на kaggle (см. 3. Модель ARIMA) использует несколько терминов Фурье способом, очень похожим на то, что я делаю, хотя я все еще получаю ошибку xreg is rank deficient. Может ли это быть вызвано тем, что gasreg совпадает с данными о газе?

1 Ответ

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

fourier(gas, K=i) и fourier(gasreg,K=j) производят один и тот же набор Фурье. Я считаю, что результаты fourier() зависят только от длины временного ряда, а не от содержания.Ошибка дефицита ранга была вызвана использованием одного и того же регрессора дважды.Я не думаю, что мне нужно вводить ряд Фурье дважды, и приведенного ниже кода, кажется, достаточно.

bestfit <- list(aicc=Inf)
for(i in 1:25){
  for(j in 1:25){
    fit <- auto.arima(gas, xreg=cbind(fourier(gas, K=i),gasreg), seasonal=FALSE)
    if(fit$aicc < bestfit$aicc){
      bestfit <- fit
      k <-i
      }
    else break;
  }
}
...