Forecasting

以每日、每周和每年的周期預測每小時時間序列

  • August 8, 2013

主要編輯:到目前為止,我要非常感謝 Dave 和 Nick 的回复。好消息是我讓循環開始工作了(原理是從 Hydnman 教授關於批量預測的帖子中藉用的)。要合併未完成的查詢:

a) 如何增加 auto.arima 的最大迭代次數 - 似乎有大量外生變量 auto.arima 在收斂到最終模型之前達到了最大迭代次數。如果我對此有誤解,請糾正我。

b) 尼克的一個回答強調,我對每小時間隔的預測僅來自這些每小時間隔,不受當天早些時候發生的事件的影響。我處理這些數據的直覺告訴我,這通常不會引起重大問題,但我願意接受有關如何處理此問題的建議。

c) Dave 指出,我需要一種更複雜的方法來識別預測變量周圍的超前/滯後時間。有沒有人對 R 中的編程方法有任何經驗?我當然希望會有限制,但我想盡可能地採取這個項目,我不懷疑這對這裡的其他人也一定有用。

d) 新查詢但與手頭的任務完全相關 - auto.arima 在選擇訂單時是否考慮回歸量?

我正在嘗試預測對商店的訪問。我需要能夠解釋移動假期、閏年和零星事件(基本上是異常值);在此基礎上,我認為 ARIMAX 是我最好的選擇,它使用外生變量來嘗試對多重季節性以及上述因素進行建模。

數據以每小時間隔 24 小時記錄。這被證明是有問題的,因為我的數據中有大量的零,尤其是在一天中訪問量非常少的時候,有時在商店剛開業時根本沒有。此外,營業時間相對不穩定。

此外,當預測為具有 3 年以上歷史數據的完整時間序列時,計算時間很長。我認為通過將一天中的每個小時作為單獨的時間序列計算會使其更快,並且在一天中的繁忙時間進行測試時似乎會產生更高的準確性,但再次證明會成為早/晚時間的問題t 始終如一地接受訪問。我相信這個過程會從使用 auto.arima 中受益,但它似乎無法在達到最大迭代次數之前收斂到模型上(因此使用手動擬合和 maxit 子句)。

我試圖通過為何時訪問 = 0 創建一個外生變量來處理“丟失”數據。同樣,這對於一天中唯一沒有訪問的時間是當天商店關閉的繁忙時間非常有用;在這些情況下,外生變量似乎成功地處理了這一問題以進行前瞻性預測,而不包括前一天關閉的影響。但是,我不確定如何使用此原則來預測商店營業但並不總是接待訪問的安靜時間。

在 Hyndman 教授關於 R 中批量預測的帖子的幫助下,我試圖建立一個循環來預測 24 個系列,但它似乎不想預測下午 1 點以後的時間,也不知道為什麼。我得到“優化錯誤(init [mask],armafn,method = optim.method,hessian = TRUE,:非有限有限差分值[1]”但由於所有系列的長度相同,我基本上使用相同的矩陣,我不明白為什麼會這樣。這意味著矩陣不是滿秩的,不是嗎?在這種方法中如何避免這種情況?

https://www.dropbox.com/s/26ov3xp4ayig4ws/Data.zip

date()

#Read input files
INPUT <- read.csv("Input.csv")
XREGFDATA <- read.csv("xreg.csv")

#Subset time series data from the input file
TS <- ts(INPUT[,2:25], f=7)


fcast <- matrix(0, nrow=nrow(XREGFDATA),ncol=ncol(TS))

#Create matrix of exogenous variables for forecasting.
xregf <- (cbind(Weekday=model.matrix(~as.factor(XREGFDATA$WEEKDAY)),
                   Month=model.matrix(~as.factor(XREGFDATA$MONTH)),
               Week=model.matrix(~as.factor(XREGFDATA$WEEK)),
                   Nodata=XREGFDATA$NoData,
               NewYearsDay=XREGFDATA$NewYearsDay,
                   GoodFriday=XREGFDATA$GoodFriday,
               EasterWeekend=XREGFDATA$EasterWeekend,
                   EasterMonday=XREGFDATA$EasterMonday,
               MayDay=XREGFDATA$MayDay,
                   SpringBH=XREGFDATA$SpringBH,
               SummerBH=XREGFDATA$SummerBH,
                   Christmas=XREGFDATA$Christmas,
               BoxingDay=XREGFDATA$BoxingDay))
#Remove intercepts
xregf <- xregf[,c(-1,-8,-20)]

NoFcast <- 0

for(i in 1:24) {

 if(max(INPUT[,i+1])>0) {

 #The exogenous variables used to fit are the same for all series except for the
 #'Nodata' variable. This is to handle missing data for each series
  xreg <- (cbind(Weekday=model.matrix(~as.factor(INPUT$WEEKDAY)),
                    Month=model.matrix(~as.factor(INPUT$MONTH)),
                Week=model.matrix(~as.factor(INPUT$WEEK)),
                    Nodata=ifelse(INPUT[,i+1] < 1,1,0),
                    NewYearsDay=INPUT$NewYearsDay,
                GoodFriday=INPUT$GoodFriday,
                    EasterWeekend=INPUT$EasterWeekend,
                EasterMonday=INPUT$EasterMonday,
                    MayDay=INPUT$MayDay,
                SpringBH=INPUT$SpringBH,
                    SummerBH=INPUT$SummerBH,
                Christmas=INPUT$Christmas,
                    BoxingDay=INPUT$BoxingDay))
 xreg <- xreg[,c(-1,-8,-20)]

 ARIMAXfit <- Arima(TS[,i], 
                    order=c(0,1,8), seasonal=c(0,1,0),
                    include.drift=TRUE,
                    xreg=xreg,
                    lambda=BoxCox.lambda(TS[,i])
                    ,optim.control = list(maxit=1500), method="ML")  


 fcast[,i] <- forecast(ARIMAXfit, xreg=xregf)$mean

} else{
 NoFcast <- NoFcast +1
}
}

#Save the forecasts to .csv
write(t(fcast),file="fcasts.csv",sep=",",ncol=ncol(fcast))


date()

我非常感謝對我的處理方式提出建設性的批評,以及對讓這個腳本正常工作的任何幫助。我知道還有其他可用的軟件,但我嚴格限制在此處使用 R 和/或 SPSS…

另外,我對這些論壇很陌生——我試圖提供盡可能完整的解釋,展示我之前所做的研究,並提供一個可重複的例子;我希望這已經足夠了,但請讓我知道我是否可以提供任何其他內容來改進我的帖子。

編輯:尼克建議我先使用每日總計。我應該補充一點,我已經對此進行了測試,並且外生變量確實產生了捕捉每日、每周和每年季節性的預測。這是我認為將每個小時作為一個單獨的系列進行預測的其他原因之一,正如尼克也提到的那樣,我對任何一天下午 4 點的預測都不會受到當天前幾個小時的影響。

編輯:09/08/13,循環的問題只是與我用於測試的原始訂單有關。我應該早點發現這一點,並更加迫切地嘗試使用 auto.arima 來處理這些數據 - 請參閱上面的 a) 和 d) 點。

不幸的是,您的任務注定要失敗,因為您僅限於 R 和 SPSS。您需要確定每個可能發揮作用的事件/假期/外生變量的領先和滯後關係結構。您需要檢測 SPSS 無法做到的可能的時間趨勢。您需要將每日趨勢/預測合併到每個小時預測中,以提供合併後的預測。您需要關注更改參數和更改方差。希望這可以幫助。多年來,我們一直在以自動方式對此類數據進行建模,當然要遵守可選的用戶指定控件。

編輯:按照 OP 的要求,我在這裡提出了一個典型的分析。如果在繁忙的時間裡,我會拿一個並開發一個日常模型。在完整的分析中,將開發所有 24 小時以及每日模型以協調預測。以下是模型的部分列表在此處輸入圖像描述。除了顯著的回歸變量(注意實際的超前和滯後結構已被省略)之外,還有一些指標反映了季節性、水平變化、每日影響、每日影響的變化以及與歷史不一致的異常值。模型統計量為在此處輸入圖像描述。此處顯示了未來 360 天的預測圖在此處輸入圖像描述。實際/擬合/預測圖表巧妙地總結了結果在此處輸入圖像描述.當面對一個極其複雜的問題(比如這個!)時,需要有很多勇氣、經驗和計算機生產力輔助工具。只需告知您的管理層問題是可以解決的,但不一定通過使用原始工具來解決。我希望這能鼓勵您繼續努力,因為您之前的評論非常專業,面向個人充實和學習。我要補充一點,人們需要知道這種分析的預期價值,並在考慮其他軟件時將其用作指導。也許您需要更大的聲音來幫助指導您的“主管”找到可行的解決方案來應對這項具有挑戰性的任務。

在查看了每日總計和每個 24 小時模型之後,我肯定會反映訪問量正在嚴重下降!潛在買家的這種分析表明不購買,而賣家明智地根據這種非常負面的預測加倍努力出售業務。

引用自:https://stats.stackexchange.com/questions/66825

comments powered by Disqus