надеюсь, что у вас все хорошо с блокировками (пишет из Испании). Я не совсем уверен в прогнозах, которые я получил, но вот что я понял, отлаживая ваш код.
В этой строке кода, создавая модель 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
. После того, как я все это отладил, я могу предложить два решения:
- Удалить компонент цикла функции
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
. Если у кого-то есть лучшая информация о том, как смоделировать каждый компонент, любая информация приветствуется.
Надеюсь, это поможет!