未观察到的组件模型预测:predict.UCM不在rucm包中工作
我用ucm函数建立了一个模型。然而,当我试图预测未来时,它不允许我传递自变量未观察到的组件模型预测: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
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)