【问题标题】:R - Pivot the Forecast ResultR - 透视预测结果
【发布时间】:2016-11-10 13:13:18
【问题描述】:

我有以下源数据:

根据过去 156 周,我想对未来 52 周进行预测。以下代码工作正常

my.ds <- myDS[1, -c(3,4,5,6)] #reading my source file
my.start <- myDS[1, c(3)]
my.product <- myDS[1, c("Product")]
my.product <- myDS[1, c("Location")]
my.result <- melt(my.ds, id = c("Product","Location"))
my.result[order(my.result$variable),]
my.ts <- ts(my.result$value, frequency=52, start=c(my.start,1))
my.fc <- forecast(my.ts, h=52)
my.fc

预测给了我以下输出:

         Point Forecast        Lo 80     Hi 80       Lo 95     Hi 95
2003.000      1637.7675    -8.610502  3284.146  -880.15039  4155.685
2003.019      1453.9059  -195.169681  3102.981 -1068.13753  3975.949
2003.038      8668.6921  7016.923492 10320.461  6142.53000 11194.854
2003.058      5851.0741  4196.616771  7505.531  3320.79997  8381.348
2003.077      4333.9240  2676.782333  5991.066  1799.54453  6868.303
2003.096      4284.5899  2624.768291  5944.412  1746.11178  6823.068

我现在想做的是:

  1. 将产品和位置重新添加到此结果集中
  2. 添加一个计算列:(Hi 95) - (Point Forecast)(我也需要这个 Point Forecast 列)
  3. 如下所示将表格转回

在这里尝试重塑,但由于结果似乎不是表格格式,因此不确定如何执行。

Link to download source file in csv

【问题讨论】:

  • myDS 是什么??
  • 先行数据对象的结构是什么 - my.resultmy.ts?与 my.fc 相同的行/列长度?
  • @Sotos myDS 是 CSV 文件中的源数据集。
  • 使用as.data.frame 应用于my.fc。之后reshapedplyr会根据需要修改数据框。

标签: r reshape forecasting


【解决方案1】:

以下确实给出了我想要的输出:

library(forecast)
library(reshape)
library(plyr)

#exclude non required columns
my.ds <- myDS[, -c(3,4,5,6)]
#set the required date, Product, Location
my.start <- myDS[1, c(3)]
my.product <- myDS[1, c("Product")]
my.location <- myDS[1, c("Location")]
#unpivot the table
my.result <- melt(my.ds, id = c("Product","Location"))
#run forecasting
# set the CIs we want to use here, so we can reuse this vector
cis <- c(80, 95)
# generate the forecast using those ci levels
my.ts <- ts(my.result$value, frequency=52, start=c(my.start,1))
f <- forecast(my.ts, h=52, level=cis)
# make a data frame containing the forecast information, including the index
z <- as.data.frame(cbind(seq(1:52),
                     f$mean,
                     Reduce(cbind, lapply(seq_along(cis), function(i)   cbind(f$lower[,i], f$upper[,i])))))
# give the columns better names
names(z) <- c("index", "mean", paste(rep(c("lower", "upper"), times =   length(cis)), rep(cis, each = 2), sep = "."))
# manipulate the results as you describe
zw <- z %>%
  # keep only the variable you want and its index
  mutate(sssf = upper.95 - mean) %>%
  select(index, mean, sssf) %>%
  # add product and location info
  mutate(product = my.product,
     location = my.location) %>%
# rearrange columns so it's easier to read
select(product, location, index, mean, sssf)
zw <- melt(zw, id.vars = c("product", "location", "index"), measure.vars = c("mean","sssf"))
data.set <- cast(zw, product + location ~ index + variable, value = "value")

【讨论】:

    猜你喜欢
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多