R ::预测双因素预测

时间:2017-11-18 12:55:49

标签: r forecasting

我需要根据产品和商场线进行预测。 我的数据集的一小部分。

date        mall    product price
01.01.2017  mall1   prod1   94
01.01.2017  mall1   prod1   65
01.01.2017  mall1   prod1   50
01.01.2017  mall1   prod1   92
01.01.2017  mall1   prod2   97
01.01.2017  mall1   prod2   80
01.01.2017  mall1   prod2   51
01.01.2017  mall1   prod2   90
01.01.2017  mall1   prod3   52
01.01.2017  mall1   prod3   73
01.01.2017  mall1   prod3   59
01.01.2017  mall1   prod3   85
01.01.2017  mall2   prod1   56
01.01.2017  mall2   prod1   60
01.01.2017  mall2   prod1   89
01.01.2017  mall2   prod1   87
01.01.2017  mall2   prod2   77
01.01.2017  mall2   prod2   79
01.01.2017  mall2   prod2   99
01.01.2017  mall2   prod2   59
01.01.2017  mall2   prod3   98
01.01.2017  mall2   prod3   50
01.01.2017  mall2   prod3   54
01.01.2017  mall2   prod3   98
02.01.2017  mall1   prod1   60
02.01.2017  mall1   prod1   68
02.01.2017  mall1   prod1   65
02.01.2017  mall1   prod1   81
02.01.2017  mall1   prod2   74
02.01.2017  mall1   prod2   63
02.01.2017  mall1   prod2   88
02.01.2017  mall1   prod2   71
02.01.2017  mall1   prod3   67
02.01.2017  mall1   prod3   73
02.01.2017  mall1   prod3   62
02.01.2017  mall1   prod3   57
02.01.2017  mall2   prod1   51
02.01.2017  mall2   prod1   65
02.01.2017  mall2   prod1   100
02.01.2017  mall2   prod1   67
02.01.2017  mall2   prod2   74
02.01.2017  mall2   prod2   70
02.01.2017  mall2   prod2   60
02.01.2017  mall2   prod2   97
02.01.2017  mall2   prod3   90
02.01.2017  mall2   prod3   100
02.01.2017  mall2   prod3   72
02.01.2017  mall2   prod3   50

对于每个商场的每个产品,我需要提前两天做预测。 当我在R搜索图书馆时,我找到了这个论坛 并找到了library :: forecast,具有ets函数。 那么如何编写为每个商场的每个产品执行预测的循环或功能。 理想情况下,输出必须是

date        mall    product price
03.01.2017  mall1   prod1   pred.value
03.01.2017  mall1   prod2   pred.value
03.01.2017  mall1   prod3   pred.value
03.01.2017  mall1   prod4   pred.value
03.01.2017  mall2   prod1   pred.value
03.01.2017  mall2   prod2   pred.value
03.01.2017  mall2   prod3   pred.value
03.01.2017  mall2   prod4   pred.value
04.01.2017  mall1   prod1   pred.value
04.01.2017  mall1   prod2   pred.value
04.01.2017  mall1   prod3   pred.value
04.01.2017  mall1   prod4   pred.value
04.01.2017  mall2   prod1   pred.value
04.01.2017  mall2   prod2   pred.value
04.01.2017  mall2   prod3   pred.value
04.01.2017  mall2   prod4   pred.value

任何帮助都很有价值。

1 个答案:

答案 0 :(得分:2)

基本上,您提前两天预测(产品数量)x(商场数量)变量。您的所有数据都限于每个产品,每个商场,每天的产品价格。

您需要做的第一件事是指定一组预测模型,您将以某种方式比较这些模型以确定如何生成预测。您可以使用ARIMA类型模型或非参数方法(如支持向量回归)将当前价格与过去的价格相关联。

假设您想使用ARIMA类型的模型,并希望比较ARMA(1,1)和AR(2)模型。我们的想法是在最后选择一小部分数据集。比如说,你保留了数据集的最后20%。您先取80%减去最后两天,估计该数据的AR(2)和ARMA(1,1)。然后,您可以使用它来预测您遗漏的20%的第一天。然后,将窗口的末端移动一天。如果要始终将估计值保持在相同数量的数据点上,则还可以丢弃第一个观察值。您再次估算所有模型并生成第二个预测。您为所有模型生成所有这些预测。

然后,由于您知道实现了哪些值,因此您可以在最后20%的数据集中为每个模型计算提前2天的预测误差。您可以测量均方误差,平均绝对误差,正确符号预测的百分比,在预测值周围的间隔内出现的误差百分比,就像您可以使用样本生成各种其他性能统计度量一样那些错误。每个这样的统计数据都可以帮助您对所有模型进行排名 - 如果您有许多统计数据,您可以根据需要使用蜘蛛图表可视化模型的执行情况。

现在,您如何编码?我模拟数据并提供种子,以便您可以看到每个部分的工作原理。基本上,您选择一个子样本,并为每个模型估计模型,预测和收集该子样本的错误。如果你想让事情变得更复杂,你可以在循环中添加另一个层以通过许多AR(p)和ARMA(p,q)模型,收集说,BIC值,并将预测产生为最小BIC值。您可以编码AR模型的最小二乘估计,而不是生成迭代预测('预测'使用ARIMA模型的结构通过递归方程生成预测)您可以生成直接预测。直接预测意味着你的开始落后于预测的范围 - 在这里,你会得到y_ {t + 2} =常数+ phi_1 y_t + ... + phi_p y_ {tp} + e_ {t + h},所以你跳过y_ {t + 1}。

AR模型的直接预测往往略好一些。对于ARMA,我不建议去p,q> 1用于预测。 ARMA(1,1)是无限MA和AR的一阶近似,因此它捕获复杂(但线性)的响应。显然,您可以使用像' e1071'如果你愿意,可以训练支持向量机。它带有一个调整函数来调整超参数和内核参数,以及子采样和预测函数来做出选择和产生预测 - 而且,在代码范围内,它并不比你看到的更复杂。

而且,如果你没有考虑它,一旦你有一些预测模型,你可以使用预测的平均值,预测的中位数或预测的优化凸组合作为预测模型 - 往往是一旦你有几个模型可供比较,那就是最好的,而且不是更难或更长。

library(forecast)

set.seed(1030)
e <- rnorm(n=1000, sd=1, mean=0)  # Create errors for simulation
y <- array(data=0, dim=c(1000,1)) # Create vector to hold values
phi <- 0.8

# Simulate an AR(1) process
for (i in 2:length(y)){
  y[i,1] <- phi*y[i-1,1] + e[i]
}

# Now, we'll use only  the last half of the sample. It doesn't matter that
# we started at 0 because an AR(1) procees with abs(phi) < 1 is ergodic and
# stationnary.
y <- y[501:1000,1]

# Now we have data, we can estimate a model and produce an out-of-sample
# exercise:
poos <- c(250:length(y))                      # We use the last half
forecast_ar <- array(NA, dim=c(length(poos))) # Same size as poos
forecast_arma <- forecast_ar
error <- forecast_ar
error_arma <- error

for (i in poos){
  # AR model
  a <- Arima(y = y[1:(i-2)],          # Horizon = 2 periods
             order = c(1,0,0),
             seasonal = c(0,0,0),
             include.constant = TRUE) # We estimate an AR(1) model
  forecast_ar[i] <- forecast(a, h=2)$mean[2]
  error[i] <- y[i] - forecast_ar[i]

  # ARMA model
  a <- Arima(y = y[1:(i-2)],          # Horizon = 2 periods
             order = c(1,0,1),
             seasonal = c(0,0,0),
             include.constant = TRUE) # We estimate an ARMA(1,1) model
  forecast_arma[i] <- forecast(a, h=2)$mean[2]
  error_arma[i] <- forecast_arma [i]
}