未观察到的组件模型预测:predict.UCM不在rucm包中工作

未观察到的组件模型预测:predict.UCM不在rucm包中工作,r,time-series,forecasting,R,Time Series,Forecasting,我用ucm函数建立了一个模型。然而,当我试图预测未来时,它不允许我传递自变量 library("rucm") library("lubridate") #Create Simulated Data Date<- as.Date(seq(from=as.Date('2012-01-01'),to=as.Date('2014-03-31'),by=1),"%Y-%m-%d") Actual <- sample(27:65,length(Date),replace = TRUE) DOW

我用ucm函数建立了一个模型。然而,当我试图预测未来时,它不允许我传递自变量

library("rucm")
library("lubridate")

#Create Simulated Data
Date<- as.Date(seq(from=as.Date('2012-01-01'),to=as.Date('2014-03-31'),by=1),"%Y-%m-%d")
Actual <- sample(27:65,length(Date),replace = TRUE)
DOW <- wday(Date)
Month <- month(Date)
DOM <- mday(Date)
Week <- week(Date)
Ya <- year(Date)
Ya <- ifelse(Ya=="2014",2,1)
a <- data.frame(Date,Actual,DOW,Month,DOM,Week,Ya)
a$Date<-as.Date(a$Date,"%Y-%m-%d")

abc <- cbind(Weekday=model.matrix(~as.factor(a$DOW)),
             Mont=model.matrix(~as.factor(a$Month)),
             Day=model.matrix(~as.factor(a$DOM)),a[,7,drop=FALSE],
             Weekofyear=model.matrix(~as.factor(a$Week)))

abc<-data.frame(abc)

abc<-data.frame(abc[,c(-1,-8,-20,-52)])

abc2 <- subset(abc,abc$Ya==1)
abc2 <- abc2[,-48]
abc3 <- subset(abc,abc$Ya==2)
abc3 <- abc3[,-48]

#train and insample MAPE
a1<-subset(a,a$Ya==1)
a2<-subset(a,a$Ya==2)
#build model
dat <- as.data.frame(cbind(a1[,2,drop=FALSE], abc2))
fo <- as.formula(paste("Actual ~ ", paste(names(dat)[2:42], collapse= "+")))
fit_train_ucm <- ucm(fo, data = dat, cycle = TRUE, cycle.period = 365)

#predict for future
predict(fit_train_ucm,n.ahead = 90,newdata = abc3)
更新: 根据GitHub软件包作者的建议,我使用了下面的代码(很抱歉,这不是很容易解释的,我确实尝试过编辑代码)

现在错误消息是

Error in eval(expr, envir, enclos) : object 'x' not found

这方面有什么帮助吗?

ucm中使用新数据进行预测的错误尚未纠正

这就是如何获得样本外时段的预测

indep <- paste(names(dat)[2:42], collapse= "+")
newdata1 <- SSModel(as.formula(paste0("rep(NA,nrow(abc3)) ~ ", indep, "+ SSMtrend(1, Q =  list(fit_train_ucm$est.var.level))",
               "+ SSMcycle(365, Q = fit_train_ucm$est.var.cycle)")), H = fit_train_ucm$irr.var, data=abc3)
pred<-predict(fit_train_ucm$model, newdata=newdata1)

indep这种在ucm中使用新数据进行预测的错误尚未纠正

这就是如何获得样本外时段的预测

indep <- paste(names(dat)[2:42], collapse= "+")
newdata1 <- SSModel(as.formula(paste0("rep(NA,nrow(abc3)) ~ ", indep, "+ SSMtrend(1, Q =  list(fit_train_ucm$est.var.level))",
               "+ SSMcycle(365, Q = fit_train_ucm$est.var.cycle)")), H = fit_train_ucm$irr.var, data=abc3)
pred<-predict(fit_train_ucm$model, newdata=newdata1)

indep只是将来有人会再次登陆此页面-作者维护的git repo上有一些更新,以简化的方式处理此问题。请

或者,粘贴可以从该提交中使用的函数:

predict.ucm <- function(object, n.ahead, newdata,...){

  #### Predict in sample ####

  if (missing(newdata)) {
    return(predict(object = object$model, n.ahead = n.ahead))
  } 

  #### Predict out of sample ####

  # Regression variables.
  model_variables <- paste0(names(object$est), collapse = " + ")

  # Trend

  # Case 1 no trend
  if (is.null(object$est.var.level) & is.null(object$est.var.slope)) { 
    model_trend <- ""
  }
  # Case 2 level and trend
  if (!is.null(object$est.var.level) & !is.null(object$est.var.slope)) { 
    model_trend <- "+ SSMtrend(degree = 2, Q = list(object$est.var.level, object$est.var.slope))"
  }
  # Case 3 level only / trend only is not allowed in R
  if (!is.null(object$est.var.level) & is.null(object$est.var.slope)) { 
    model_trend <- "+ SSMtrend(degree = 1, Q = list(object$est.var.level))"
  }

  # Seasonality
  if (!is.null(object$est.var.season)) {
    model_season <- sprintf("+ SSMseasonal(period = %s, Q = object$est.var.season)", 
                            object$call['season.length'] %>% as.character())
  } else { 
    model_season <- ""
  }

  # Cycle
  if (!is.null(object$est.var.cycle)) {
    model_cycle <- sprintf("+ SSMcycle(period = %s, Q = object$est.var.cycle)", 
                           object$call['cycle.period'] %>% as.character())
  } else { 
    model_cycle <- ""
  }

  # Combine all components into a formula
  model_formula <- as.formula(sprintf("rep(NA,nrow(newdata)) ~ %s %s %s %s",
                                      model_variables,
                                      model_trend,
                                      model_season,
                                      model_cycle
  ))

  # Build a SSM object for the prediction
  oos_data <- KFAS::SSModel(formula = model_formula, H = object$irr.var, data = newdata)

  # Return the predictions
  predict(object$model, newdata = oos_data)

}

predict.ucm只是将来有人会再次登陆此页面-作者维护的git repo上有一些更新,以简化的方式处理此问题。请

或者,粘贴可以从该提交中使用的函数:

predict.ucm <- function(object, n.ahead, newdata,...){

  #### Predict in sample ####

  if (missing(newdata)) {
    return(predict(object = object$model, n.ahead = n.ahead))
  } 

  #### Predict out of sample ####

  # Regression variables.
  model_variables <- paste0(names(object$est), collapse = " + ")

  # Trend

  # Case 1 no trend
  if (is.null(object$est.var.level) & is.null(object$est.var.slope)) { 
    model_trend <- ""
  }
  # Case 2 level and trend
  if (!is.null(object$est.var.level) & !is.null(object$est.var.slope)) { 
    model_trend <- "+ SSMtrend(degree = 2, Q = list(object$est.var.level, object$est.var.slope))"
  }
  # Case 3 level only / trend only is not allowed in R
  if (!is.null(object$est.var.level) & is.null(object$est.var.slope)) { 
    model_trend <- "+ SSMtrend(degree = 1, Q = list(object$est.var.level))"
  }

  # Seasonality
  if (!is.null(object$est.var.season)) {
    model_season <- sprintf("+ SSMseasonal(period = %s, Q = object$est.var.season)", 
                            object$call['season.length'] %>% as.character())
  } else { 
    model_season <- ""
  }

  # Cycle
  if (!is.null(object$est.var.cycle)) {
    model_cycle <- sprintf("+ SSMcycle(period = %s, Q = object$est.var.cycle)", 
                           object$call['cycle.period'] %>% as.character())
  } else { 
    model_cycle <- ""
  }

  # Combine all components into a formula
  model_formula <- as.formula(sprintf("rep(NA,nrow(newdata)) ~ %s %s %s %s",
                                      model_variables,
                                      model_trend,
                                      model_season,
                                      model_cycle
  ))

  # Build a SSM object for the prediction
  oos_data <- KFAS::SSModel(formula = model_formula, H = object$irr.var, data = newdata)

  # Return the predictions
  predict(object$model, newdata = oos_data)

}


predict.ucm这是不可复制的。请包括一些模拟数据或一个现有的随附数据集。@RomanLuštrik I刚刚添加了一些模拟数据。查找dropbox链接请在本文中包含数据,以便在脱机时不会丢失。Hi@RomanLuštrik我刚刚添加了该详细信息。请使您的示例可复制并可复制/粘贴。有关一些提示,请参阅。目前,我必须处理如何将数据导入到保存的变量。去掉中间人,准备数据集以便立即工作。这是不可复制的。请包括一些模拟数据或一个现有的随附数据集。@RomanLuštrik I刚刚添加了一些模拟数据。查找dropbox链接请在本文中包含数据,以便在脱机时不会丢失。Hi@RomanLuštrik我刚刚添加了该详细信息。请使您的示例可复制并可复制/粘贴。有关一些提示,请参阅。目前,我必须处理如何将数据导入到保存的变量。剪掉中间人,准备数据集以便立即工作。您好,您是否可以编辑此答案,将解决方法的详细信息包含在答案中,而不是要求访问者点击链接?这样,即使链接页面被更改或删除,答案仍然对访问者有用。阅读本文以进一步了解@josliber对链接的关注:-)@KRC事实上Github示例并不容易理解!我已经发布了我的所有代码,包括上述代码中的数据。您能否创建一个如何预测每日数据未来值的示例?谢谢我对答案进行了编辑,以展示如何使用预测功能。非常感谢!!UCM是一个非常有用的功能,感谢您构建了itHello的R版本,您是否可以编辑此答案,将解决方案的详细信息包含在答案中,而不是要求访问者点击链接?这样,即使链接页面被更改或删除,答案仍然对访问者有用。阅读本文以进一步了解@josliber对链接的关注:-)@KRC事实上Github示例并不容易理解!我已经发布了我的所有代码,包括上述代码中的数据。您能否创建一个如何预测每日数据未来值的示例?谢谢我对答案进行了编辑,以展示如何使用预测功能。非常感谢!!UCM是一个非常有用的函数,感谢您构建它的R版本
  # Using same dependent which was used initially to fit the estimates, instead of NA
  model_formula <- as.formula(paste0(
    object$model$terms[[2]],
    sprintf(
      " ~ %s %s %s %s",
      model_variables,
      model_trend,
      model_season,
      model_cycle
    )
  ))
  # Build a SSM object for the prediction
  oos_data <- KFAS::SSModel(formula = model_formula, H = object$irr.var, data = newdata)
  
  # Return the predictions for in sample only - hence removing newdata arg
  # predict(object$model, newdata = oos_data)
  predict(oos_data)