Пожалуйста, выберите более длинный горизонт, когда прогнозы впервые рассчитываются в пакете прогноза в r - PullRequest
0 голосов
/ 01 мая 2018

Когда я запускаю следующий код, я НЕ получаю эту ошибку:

## https://www.dataiku.com/learn/guide/code/r/time_series.html

library(readxl)
library(forecast)
library(dplyr)
library(prophet)
library(rstan)
library(Hmisc)
library(caret)

data<-read_excel("Time Series/Items.xlsx", col_types = c("text", "numeric"))
Nper=0.75

stmodels=c("meanf","naive","snaive","rwf","croston","stlf","ses","holt","hw","splinef","thetaf","ets","auto.arima","tbats","prophet")

gkuniforecast = function(data, Np, Ncolumn, tsfreq, model) {
  ## Preparation
  N = ceiling(Np*nrow(data))

  ## Models
  if (model=="prophet"){
    df=data
    names(df)=c("ds","y")
    df$ds=as.Date(paste(df$ds,"-01",sep=""), "%Y-%b-%d")
    train.df = df[1:N,]
    na.df=data.frame(ds=rep(NA, N),y=rep(NA, N))
    test.df <- rbind(na.df, df[(N+1):nrow(data),])
    m <- prophet(train.df)

    future <- make_future_dataframe(m, periods = nrow(data)-N, freq = 'month')

    pro_forecast <- predict(m, future)
    plot(m, pro_forecast)
    ##prophet_plot_components(m, forecast)
    acc=matrix(rep(NA, 16),nrow=2,ncol=8,dimnames=list(c("Training set", "Test set"),c("ME","RMSE","MAE","MPE","MAPE","MASE","ACF1","Theil's U")))
    acc["Test set","RMSE"]=sqrt(mean((pro_forecast$yhat - test.df)^2, na.rm = TRUE))
  }else{
    x=pull(data,Ncolumn)
    train.x = ts(x[1:N], frequency=tsfreq)
    test.x <- ts(c(rep(NA, N), x[(N+1):NROW(x)]), frequency=tsfreq)
    str1=paste0("m_",model," = ",model,"(train.x)")
    if (Np==1) {str2=paste0("f_",model," = forecast(m_",model,", h=NROW(x)")
    } else {str2=paste0("f_",model," = forecast(m_",model,", h=NROW(x)-N)")}
    str3=paste0("plot(f_",model,")")
    str4="lines(test.x)"
    str5=paste0("acc=accuracy(f_",model,",test.x)")
    str=paste0(str1,";",str2,";",str3,";",str4,";",str5)
    eval(parse(text=str))
  }
  return(acc)
  }
acc = lapply(stmodels, gkuniforecast, data=data, Np=Nper, Ncolumn=2,tsfreq=12)

Но когда я запускаю этот код, я делаю:

##Forecast data prep
tsfreq=5
x=pull(data,1)
train.x = ts(x[1:N], frequency=tsfreq)
test.x <- ts(c(rep(NA, N), x[(N+1):NROW(x)]), frequency=tsfreq)


stmodels=c("meanf","naive","snaive","rwf","croston","stlf","ses","holt","hw"##,"splinef"
           ,"thetaf","ets","auto.arima","tbats")

for (i in 1:length(stmodels)){
str1=paste0("m_",stmodels[i]," = ",stmodels[i],"(train.x)")
str2=paste0("f_",stmodels[i]," = forecast(m_",stmodels[i],", h=NROW(x)-N)")
str3=paste0("plot(f_",stmodels[i],")")
str4="lines(test.x)"
str5=paste0('acc[["',stmodels[i],'"]]=accuracy(f_',stmodels[i],',test.x)')
str=paste0(str1,";",str2,";",str3,";",str4,";",str5)
eval(parse(text=str))
}

Кажется, есть проблема с 'hw' (splinef закомментирован, потому что он дает мне другую ошибку), но я не понимаю, почему в первом наборе данных я не получаю ошибок, и я поступаю со вторым набором данных. То, что также отличается, это частота.

Опять ошибка: Пожалуйста, выберите более длинный горизонт при первом вычислении прогнозов

1 Ответ

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

Вы смешиваете функции, которые создают прогнозы напрямую (например, meanf()), с функциями, которые генерируют модели (например, ets()). Для функций, которые генерируют прогнозы напрямую, необходимо указать горизонт прогноза при вызове функции. См. https://otexts.org/fpp2/the-forecast-package-in-r.html для списка функций, которые производят прогнозы напрямую.

...