我使用:
将csv文件读入数据帧dataxlsx <- read.csv(file.choose(), header = T)
数据帧如下:
Year Month Period X410 X430 X431
2005 1 1 3467748 4434879 1345638
2005 2 2 3626338 4311150 1167523
. . . . . .
2015 7 127 2374105 1514540 1399804
我正在尝试运行我创建的称为HWplot的函数来预测输入的数据并运行预测,以及输出预测的图。
我使用了ggplot2, tseries, forecast包。
HWplot <- function(dataxlsx, n.ahead=12, CI=.95, error.ribbon='green', line.size=1) {
hw_object<-HoltWinters(dataxlsx)
forecast<-predict(hw_object, n.ahead=24, prediction.interval=T, level=0.95)
for_values<-data.frame(time=round(time(forecast), 3), value_forecast=as.data.frame(forecast)$fit, dev=as.data.frame(forecast)$upr-as.data.frame(forecast)$fit)
fitted_values<-data.frame(time=round(time(hw_object$fitted), 3), value_fitted=as.data.frame(hw_object$fitted)$xhat)
actual_values<-data.frame(time=round(time(hw_object$x), 3), Actual=c(hw_object$x))
graphset<-merge(actual_values, fitted_values, by='time', all=TRUE)
graphset<-merge(graphset, for_values, all=TRUE, by='time')
graphset[is.na(graphset$dev), ]$dev<-0
graphset$Fitted<-c(rep(NA, NROW(graphset)-(NROW(for_values) + NROW(fitted_values))), fitted_values$value_fitted, for_values$value_forecast)
graphset.melt<-melt(graphset[, c('time', 'Actual', 'Fitted')], id='time')
p<-ggplot(graphset.melt, aes(x=time, y=value)) + geom_ribbon(data=graphset, aes(x=time, y=Fitted, ymin=Fitted-dev, ymax=Fitted + dev), alpha=.2, fill=error.ribbon) + geom_line(aes(colour=variable), size=line.size) + geom_vline(x=max(actual_values$time), lty=2) + xlab('Time') + ylab('Value') + theme(legend.position='bottom') + scale_colour_hue('')
return(p)
}
我面临的问题是,我不能分割这个数据帧,以便将HWplot函数应用于数据的单独列(预测X410, X430, X431等)。我将使用在列中具有不同数量的X###代码的数据帧,因此我也需要R脚本来合并动态数量的列。
最终的游戏是从数据框架的不同列运行这些预测,并将预测和图形输出到excel工作簿,其中列的名称作为每个工作表的名称。
旁注:HWplot函数在只有一列指标的数据帧时工作,但是不能与多列指标一起工作。
我尝试过的所有应用函数族都不起作用,拆分函数也不起作用。
希望这有意义-如果有人需要澄清,请告诉我。
R- blogs中的"Batch Forecasting in R"博文很好地解释了如何做到这一点。
http://www.r-bloggers.com/batch-forecasting-in-r-2/