Я использую ucm
в R. Есть аргумент формулы для этого. У меня есть переменная ответа y
и два предиктора с именем "abc def" and jkl
. Я хочу, чтобы формула выглядела как y ~ abc def + jkl
. Но пробел между ab c и def является проблемой. Как указать формулу, чтобы R понимал, что ab c def - это только одно имя? Прямо сейчас я получаю ошибку "Error in terms.formula(formula) : '.' in formula and no 'data' argument"
, когда задаю формулу, как показано ниже.
ucm_Forecast=function(x,h,xreg){
if (ncol(xreg)>=1){
xregFit=data.frame(xreg[1:length(x),])
x<-x/10000
d<-cbind(data.frame(x=x),xregFit)
fit_ucm=ucm(**x~.**,data=d, level = TRUE, slope=TRUE, cycle = TRUE, cycle.period = 365.25/52)
print("right before predict")
indep <- paste(names(d)[2:ncol(d)], 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)
fcst<-predict(fitucm$model, n.ahead = h)
fcst<-fcst*10000
fcst
}
return(fcst)
}
Отредактированный код в соответствии с ответом r2evans приведен ниже. Теперь я получаю ошибку
Error in eval(predvars, data, env) :
object 'abc.def' not found
Called from: eval(predvars, data, env)
Отредактированный код
ucm_Forecast=function(x,h,xreg){
print("h=")
print(h)
if (ncol(xreg)>=1){
xregFit=data.frame(xreg[1:length(x),])
# xregFcst=data.frame(xreg[(length(x)+1):nrow(xreg),])
#
# colnames(xregFit)=colnames(xreg)
# colnames(xregFcst)=colnames(xreg)
x<-x/10000
d<-cbind(data.frame(x=x),xregFit)
#fit_ucm=ucm(x~.,data=d, level = TRUE, slope=TRUE, cycle = TRUE, cycle.period = 365.25/52)
independent <- paste0("`", names(d)[-1], "`", collapse = " + ")
#d<-cbind(as.data.frame(x),xreg[1:length(x),])
fit_ucm<- ucm(as.formula(paste("`",names(d[1]),"` ~", independent)), data = d, level = TRUE, slope=TRUE, cycle = TRUE, cycle.period = 365.25/52)
#fit_ucm<- ucm(formula=x~Shipping_Days+Orders_Min_2_Weeks+Orders_Pre_1_Weeks, data = d, level = TRUE, slope=TRUE, cycle = TRUE, cycle.period = 365.25/52)
# fit_ucm<- ucm(as.formula(paste0(names(d[1]),"~.")), data = d, level = TRUE, slope=TRUE, cycle = TRUE, cycle.period = 365.25/52)
print("right before predict")
indep <- paste(names(d)[2:ncol(d)], 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)
fcst<-predict(fitucm$model, n.ahead = h)
fcst<-fcst*10000
fcst
}
return(fcst)
}
Я поставил check.names = FALSE, но я все еще получаю другую ошибку.
Error in `[.data.frame`(data, , as.character(dep.var)) :
undefined columns selected
Called from: `[.data.frame`(data, , as.character(dep.var))
Вот код.
ucm_Forecast=function(x,h,xreg){
print("h=")
print(h)
if (ncol(xreg)>=1){
xregFit=data.frame(xreg[1:length(x),],check.names=FALSE)
print( colnames(xregFit))
x<-x/10000
d<-cbind(data.frame(x=x),xregFit)
independent <- paste0("`", names(d)[-1], "`", collapse = " + ")
print("dfgh")
**The statement below errors out**
fit_ucm<- ucm(as.formula(paste("`",names(d[1]),"` ~", independent)), data = d, level = TRUE, slope=TRUE, cycle = TRUE, cycle.period = 365.25/52)
print("right before predict")
indep <- paste(names(d)[2:ncol(d)], 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)
fitucm<- ucm(formula = x~0, data = x, level = TRUE, slope=TRUE)
fcst<-predict(fitucm$model, n.ahead = h)
fcst<-fcst*10000
fcst
}
return(fcst)
}