我需要根据产品和商场线进行预测。 我的数据集的一小部分。
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
任何帮助都很有价值。
答案 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]
}