Модель UCM в R выдает ошибку "Ошибка в SSMCycle" - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь запустить модель ненаблюдаемых компонентов в R с определенным набором данных. Вот код.

   library(rucm)
reg<-data.frame(a=c(3,7,2,4,8,3,7,7,5,9),b=c(9,5,6,2,1,7,3,5,8,4))
reg<-as.matrix(reg)
h<-4
x1=ts(c(5979511 ,13608701,  6193970 , 5269967 ,10424370 , 9504397),frequency=365.25/52)
u<-ucm_Forecast(x1,h,reg)

#d<-cbind(as.data.frame(x1),reg[1:length(x1),])

ucm_Forecast=function(x,h,xreg){

print(x)
  if (ncol(xreg)>=1){


      x<-x/10000
      d<-cbind(as.data.frame(x),xreg[1:length(x),])

    fit_ucm<- ucm(formula = x~a+b, data = d, level = TRUE, slope=TRUE)

    print("right before predict")
    print(xreg)

    indep <- paste(names(d)[2:3], collapse= "+")
    newdata1 <- SSModel(as.formula(paste0("rep(NA,h) ~ ", indep, "+ SSMtrend(1, Q =  list(fit_ucm$est.var.level))",
                                          "+ SSMcycle(365, Q = fit_ucm$est.var.cycle)")), H = fit_ucm$irr.var, data=as.data.frame(xreg[(length(x)+1):(length(x)+h),]))
    fcst<-predict(fit_ucm$model, newdata=newdata1)

    #fcst<-predict(fitucm$model, xreg=xreg[(length(x)+1):(length(x)+h),])
  print("right after predict")
      fcst<-fcst*10000
    print(fcst)

  } else {

    x=ts(filter(Model_Dataset,Category==Cat,Date<FcstDate)$`Gross Sales`)
    x<-x*10000
    x<-x/10000
    x<-ts(x)

    x
    fitucm<- ucm(formula = x~0, data = x, level = TRUE, slope=TRUE)
    fcst<-predict(fitucm$model, n.ahead = h)
    fcst<-fcst*10000
    fcst
  }

  return(fcst)
}

Я получаю ошибку ниже, соответствующую заявлению, и я не знаю, что это значит, потому что это какой-то внутренний вызов.

  newdata1 <- SSModel(as.formula(paste0("rep(NA,h) ~ ", indep, "+ SSMtrend(1, Q =  list(fit_ucm$est.var.level))",
                                              "+ SSMcycle(365, Q = fit_ucm$est.var.cycle)")), H = fit_ucm$irr.var, data=as.data.frame(xreg[(length(x)+1):(length(x)+h),]))



  Error in SSMcycle(period = 365, Q = fit_ucm$est.var.cycle, index = 1L,  : 
  Misspecified Q, argument Q must be (p x p) matrix, (p x p x 1), or (p x p x n) array where m is the number of time series.
Called from: SSMcycle(period = 365, Q = fit_ucm$est.var.cycle, index = 1L, 
    n = 4L)

Может кто-нибудь помочь?

1 Ответ

1 голос
/ 27 марта 2020

надеюсь, что у вас все хорошо с блокировками (пишет из Испании). Я не совсем уверен в прогнозах, которые я получил, но вот что я понял, отлаживая ваш код.

В этой строке кода, создавая модель fit_ucm:

fit_ucm<- ucm(formula = x~a+b, data = d, level = TRUE, slope=TRUE)

, вы создаете модель только с компонентом уровня и компонентом наклона. Однако при создании SSModel вы пытаетесь ввести компонент periodi c, используя функцию SSMcycle(). Это вызывает ошибку, потому что он не находит компонент fit_ucm$est.var.cycle предыдущей модели, потому что он не существует (помните, что вы только обучили модель уровня + уклона). Более того, когда вы создаете компонент тренда, вы только моделируете уровень модели ucm, поэтому вы забыли slope. После того, как я все это отладил, я могу предложить два решения:

  1. Удалить компонент цикла функции SSModel() и создать модель только с компонентом уровня и наклона. Для чтения документации это можно сделать с помощью функций SSMregression() или SSMtrend(). Из-за моей неспособности использовать SSMregression() и чтения документации SSMtrend() код для создания SSModel только с компонентом уровня и наклона :
newdata1 <- SSModel(as.formula(paste0("rep(NA,h) ~ ", indep,
                                      "+ SSMtrend(2, Q = list(fit_ucm$est.var.level,
                                                              fit_ucm$est.var.slope))")
                                   ), 
                        H = fit_ucm$irr.var, 
                        data = as.data.frame(xreg[(length(x)+1):(length(x)+h),]))
Введите компонент cycle в модель ucm и создайте SSModel с компонентами уровня, наклона и цикла . Это можно сделать с помощью следующего кода:
fit_ucm <- ucm(formula = x~a+b, data = d, level = TRUE, slope=TRUE, cycle = TRUE, cycle.period = 365.25/52)
newdata1 <- SSModel(as.formula(paste0("rep(NA,h) ~ ", indep,
                                      "+ SSMtrend(2, Q =  list(fit_ucm$est.var.level,
                                                               fit_ucm$est.var.slope))",
                                      "+ SSMcycle(365.25/52, Q = fit_ucm$est.var.cycle)")
                                   ), 
                        H = fit_ucm$irr.var, 
                        data=as.data.frame(xreg[(length(x)+1):(length(x)+h),]))

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

library(rucm)
reg<-data.frame(a=c(3,7,2,4,8,3,7,7,5,9),b=c(9,5,6,2,1,7,3,5,8,4))
reg<-as.matrix(reg)
h<-4
x1=ts(c(5979511 ,13608701,  6193970 , 5269967 ,10424370 , 9504397),frequency=365.25/52)

#d<-cbind(as.data.frame(x1),reg[1:length(x1),])

ucm_Forecast=function(x,h,xreg){

  print(x)
  if (ncol(xreg)>=1){


    x<-x/10000
    d<-cbind(as.data.frame(x),xreg[1:length(x),])

    fit_ucm<- ucm(formula = x~a+b, data = d, level = TRUE, slope=TRUE, cycle = TRUE, cycle.period = 365.25/52)

    print("right before predict")
    print(xreg)

    indep <- paste(names(d)[2:3], collapse= "+")
    newdata1 <- SSModel(as.formula(paste0("rep(NA,h) ~ ", 
                                          indep,
                                          "+ SSMtrend(2, Q =  list(fit_ucm$est.var.level,fit_ucm$est.var.slope))",
                                          "+ SSMcycle(365.25/52, Q = fit_ucm$est.var.cycle)")
                                   ), 
                        H = fit_ucm$irr.var, data=as.data.frame(xreg[(length(x)+1):(length(x)+h),]))
    fcst <- predict(fit_ucm$model, newdata=newdata1)

    #fcst<-predict(fitucm$model, xreg=xreg[(length(x)+1):(length(x)+h),])
    print("right after predict")
    fcst<-fcst*10000
    print(fcst)

  } else {

    x=ts(filter(Model_Dataset,Category==Cat,Date<FcstDate)$`Gross Sales`)
    x<-x*10000
    x<-x/10000
    x<-ts(x)

    x
    fitucm<- ucm(formula = x~0, data = x, level = TRUE, slope=TRUE, cycle = TRUE, cycle.period = 365.25/52)
    fcst<-predict(fitucm$model, n.ahead = h)
    fcst<-fcst*10000
    fcst
  }

  return(fcst)
}

Помимо всего этого, я не могу заверить что прогнозы верны. У меня есть сомнения относительно того, правильно ли моделируется уровень и наклон, используя функцию SSMtrend. Если у кого-то есть лучшая информация о том, как смоделировать каждый компонент, любая информация приветствуется.

Надеюсь, это поможет!

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