2017-11-18 150 views
2

我需要根據產品線和商場線進行預測。 我的數據集的一小部分。R :: forecast雙因子預測

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 ,並找到庫::預測,與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

你的訓練集有多長時間?直到你想預測什麼樣的時間?你的問題不清楚 – DataTx

+0

@DataTx,你爲什麼認爲我的問題不清楚,我明確寫到這是日常數據,而預測(Y)是提前2天,這是一組數據。你有什麼具體的不明白:) – varimax

回答

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] 
} 
+0

非常好,謝謝 – varimax