Ошибка при выполнении кода ucm на временном ряду - PullRequest
0 голосов
/ 04 мая 2020

Рассмотрим следующий код. Вызов ucm без функции-оболочки работает правильно. (См. Комментарий «СЛЕДУЮЩЕЕ ЗАЯВЛЕНИЕ РАБОТАЕТ ПРАВИЛЬНО».) Но при вызове функции возникает ошибка, приведенная ниже. Может ли кто-нибудь помочь мне отладить? Подобно тому, как я масштабирую значения временных рядов перед их передачей в автономную функцию ucm, я масштабирую значения временных рядов в другой части функции, которая в конечном итоге выполняется при вызове функции, но все же я увидеть эту ошибку.

 Error in is.SSModel(do.call(updatefn, args = c(list(inits, model), update_args)),  : 
      System matrices (excluding Z) contain NA or infinite values, covariance matrices contain values larger than 1e+07


 library(rucm)
    reg1<-data.frame()
    h<-4
    x<-ts(c(5979511 ,13608701,  6193970 , 5269967 ,10424370 , 9504397, 4564657, 5665863, 3435868,9845647,5454546,2454657),frequency=365.25/52)
    x<-x/100000
    print(x)
    # THE FOLLOWING STATEMENT WORKS CORRECTLY
    fit_ucm<- ucm(formula = x~0, data = x, level = TRUE, slope=TRUE,cycle=TRUE,cycle.period=365.52/52)

    u<-ucm_Forecast(x,h,reg1)   <-This call errors out
    u


    ucm_Forecast=function(x,h,xreg){

      if (ncol(xreg)>=1){

        xregFit=data.frame(xreg[1:length(x),],check.names=FALSE)
        x<-x/10000
        d<-cbind(data.frame(x=x),xregFit)
        independent <- paste0("`", names(d)[-1], "`", collapse = " + ")
        fit_ucm<- ucm(as.formula(paste0("`",names(d[1]),"` ~", independent)), data = d, level = TRUE, slope=TRUE, cycle = TRUE, cycle.period = 365.25/52)
        print("right before predict")



        newdata1 <- SSModel(as.formula(paste0("rep(NA,h) ~ ", independent, 
                                              "+ 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<-x/100000
        print(x)
        fit_ucm<- ucm(formula = x~0, data = x, level = TRUE, slope=TRUE,cycle=TRUE,cycle.period=365.52/52)


            newdata1 <- SSModel(as.formula(paste0("rep(NA,h) ~ ",  
                                              " 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)

        fcst<-predict(fit_ucm$model, newdata=newdata1, n.ahead = h)
        fcst<-fcst*100000
        fcst
      }

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