毎日、毎週、毎年の周期性を持つ時間ごとの時系列の予測


12

主な編集:Dave&Nickの対応に感謝します。良い知らせは、ループが機能するようになったことです(原則として、バッチ予測に関するHydnman教授の投稿から借用しました)。未解決のクエリを統合するには:

a)auto.arimaの最大反復回数を増やすにはどうすればよいですか。外生変数が多数あるため、auto.arimaは最終モデルに収束する前に最大反復回数に達しているようです。これを誤解している場合は訂正してください。

b)Nickからの1つの回答は、時間間隔の私の予測はそれらの時間間隔のみから導き出され、その日の早い段階での発生に影響されないことを強調しています。このデータを処理することから、本能は、これがしばしば重大な問題を引き起こすべきではないことを教えてくれますが、これをどのように処理するかについての提案を受け入れます。

c)Daveは、予測変数を取り巻くリードタイムとラグタイムを特定するには、より高度なアプローチが必要であることを指摘しました。Rのこれに対するプログラムによるアプローチの経験はありますか?もちろん制限はあると思いますが、できる限りこのプロジェクトを進めたいと思っています。これが他の人にも役立つことは間違いありません。

d)新しいクエリですが、当面のタスクに完全に関連しています-注文を選択するときにauto.arimaはリグレッサを考慮しますか?

来店を予測しようとしています。移動する休日、うるう年、散発的なイベント(本質的には外れ値)を説明する機能が必要です。これに基づいて、私はARIMAXが私の最善の策であると収集し、外因性変数を使用して、複数の季節性と前述の要因を試してモデル化します。

データは1時間ごとに24時間記録されます。これは私のデータにゼロの量があるため、特に訪問数が非常に少ない1日の時間帯に問題があることが判明しています。また、営業時間は比較的不安定です。

また、3年以上の履歴データを持つ1つの完全な時系列として予測する場合、計算時間は膨大です。毎日の時間を別々の時系列として計算することで、それがより速くなると考えました。そして、忙しい時間帯でこれをテストすると、より高い精度が得られるようですが、早朝/後期の時間で問題になることが判明しましたt常に訪問を受ける。auto.arimaを使用するとプロセスにメリットがあると思いますが、最大反復回数に達する前にモデルに収束できないようです(そのため、手動での適合とmaxit句を使用しています)。

訪問数= 0の場合の外生変数を作成して、「欠落」データを処理しようとしました。繰り返しますが、これは、訪問がない唯一の時間である1日の店舗が閉まっているときだけ、忙しい1日の時間帯に最適です。これらの例では、外生変数は前向きに予測するためにこれを正常に処理するようであり、以前に閉じられた日の影響を含みません。ただし、店が開いているが、常に訪問を受けるとは限らない静かな時間を予測することに関して、この原則を使用する方法がわかりません。

Rでのバッチ予測についてのHyndman教授の投稿を利用して、24シリーズを予測するループを設定しようとしていますが、午後1時以降は予測したくなく、その理由を理解できません。「optim(init [mask]、armafn、method = optim.method、hessian = TRUE、:non-finite finite-difference value [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の使用に厳密に制限しています...

また、私はこれらのフォーラムに非常に慣れていない-私は可能な限り完全な説明を提供し、私が行った以前の研究を実証し、再現可能な例を提供することを試みた。これで十分だと思いますが、投稿を改善するために他に提供できることがあれば、お知らせください。

編集:ニックは、毎日の合計を最初に使用するよう提案しました。私はこれをテストしましたが、外生変数は毎日、毎週、毎年の季節性を捉える予測を生成することを付け加えておきます。これは、別のシリーズとして各時間を予測することを考えた他の理由の1つですが、ニックも述べたように、任意の日の午後4時の私の予測は、その日の前の時間の影響を受けません。

編集:09/08/13、ループの問題は、私がテストに使用した元の注文に関係しています。私はもっ​​と早くこれを見つけたはずであり、auto.arimaがこのデータを処理することをより緊急にすべきです-上記のa)およびd)のポイントを参照してください。


また、季節性を考慮してフーリエを使用してみましたが、同じエラー「optim(init [mask]、armafn、method = optim.method、hessian = TRUE、:non-finite finite-difference value [1]のエラー」が返されました。他の外生変数なしでそれ自体が行列として使用される場合でも、なぜそうなるのかについて誰かが説明を手伝ってくれませんか?
krcooke

データを再アップロードできますか?
MyHeadHurts 2014年

回答:


4

残念ながら、RとSPSSに制限されているため、ミッションは失敗する運命にあります。関係する可能性のある各イベント/休日/外生変数のリードとラグの関係構造を特定する必要があります。SPSSが実行できない可能性のあるタイムトレンドを検出する必要があります。統合された.reconciled予測を提供するために、毎日のトレンド/予測を時間ごとの予測のそれぞれに組み込む必要があります。パラメータの変更と分散の変更に注意する必要があります。お役に立てれば。私たちはこの種のデータを何年もの間自動的にモデル化してきましたが、もちろんオプションのユーザー指定の制御に従います。

編集:OPが要求したように、ここで典型的な分析を提示します。忙しい時間帯なら1つ取って、毎日のモデルを開発しました。完全な分析では、予測を調整するために、24時間すべてが開発され、さらに毎日のモデルも作成されます。以下はモデルの部分的なリストですここに画像の説明を入力してください。重要なリグレッサに加えて(実際のリードとラグの構造は省略されていることに注意してください)、季節性、レベルの変化、毎日の影響、毎日の影響の変化、および履歴と一致しない異常な値を反映する指標がありました。モデルの統計はここに画像の説明を入力してくださいです。次の360日間の予測のプロットがここに表示されますここに画像の説明を入力してください。実際/適合/予測グラフは結果をきれいに要約しますここに画像の説明を入力してください。非常に複雑な問題(この問題のような!)に直面した場合、多くの勇気、経験、およびコンピューター生産性の助けを借りて現れる必要があります。問題は解決可能ですが、必ずしも基本的なツールを使用することで解決できるわけではないことを経営陣に伝えてください。以前のコメントは非常に専門的であり、個人的な充実と学習に向けられているため、これがあなたの努力を続けるための励みになることを願っています。追加のソフトウェアを検討する際には、この分析の期待値を把握し、それをガイドラインとして使用する必要があると付け加えます。おそらく、この困難なタスクの実行可能なソリューションに向けて「ディレクター」を導くために、より大きな声が必要です。

1日の合計と24時間ごとの各モデルを確認した後、訪問数は深刻な減少傾向にあることを間違いなく反映します。見込みのある購入者によるこの種の分析は購入ではないことを示唆しますが、販売者はこの非常に否定的な予測に基づいてビジネスを販売するための努力を倍増するのが賢明です。


こんにちは、デイブ。時間を割いて私の質問を読んで回答してくれてありがとう。あなたのソフトウェアが他の選択肢を超えていることを理解していますが、残念ながら当面は私には選択肢ではありません。Rの機能を知っていると、私がすでに行ったことを改善するために私に提供できるアドバイスはありますか?よろしく
お願いします

@krcooke適切な応答を特定するために、各リグレッサの周りの訪問と代替リード/ラグの間の相互相関を調べることができます。一部のリグレッサは特定の時間に役立つかもしれないが、他の人には役に立たない可能性があるというニックに完全に同意します。 1時間ごとに個別にモデル化する場合があります.4種類の外れ値(パルス、レベルシフト、季節パルス、時間トレンド)の検出は、因果関係があり、SPSSではおそらく利用できない場合、SASでは使用できません。データをダウンロードしてAUTOBOXを使用します。私たちは常に、分析を強化するために、あなたのような「厳しいデータ」を探しています。
IrishStat 2013

こんにちは、デイブ。リグレッサの分析に関して私ができることを見ていきます。私が使用したリグレッサは非常に「標準的」であり、そのようなすべてのストアに影響を与える可能性が高いと感じました。Nickのコメントの例として、ジュビリーバンクホリデーの週末を使用しました。これはおそらくリグレッサの使用から利益を得るでしょうが、今のところは含まれていません。そして、私はあなたがデータで何ができるかを見ることに非常に興味があります!再度、感謝します。
krcooke 2013

7
残念ながら、RとSPSSに制限されているため、ミッションは失敗する運命にあります。」-このコメントは、残念ながら遠すぎます。任意のチューリング完全言語は、それがスイッチをひっくり返す&完全レゴで実装されていることにより、マシンコードにのみ、プログラム可能であったとしても、他に記述された任意のアルゴリズムを実装することができます。別の計算で実行できない計算に実装できる計算はありません。AUTOBOXの魔法のプロパティを主張しているのでない限り、「バニラディストリビューションの関数として既に利用可能」のような違いを、おそらくあなたが言っていることはおそらく信じています。
Glen_b-2013

@Glen_b私が言ったかもしれないことは、あなたが使用しているバニラディストリビューションの火力は、新しい手順を書くための多くの時間がなければ、当面の問題を解決するには不十分であるということです。
IrishStat 2013

10

これは単なるコメントの束にすぎませんが、そのフォーマットには長すぎます。私は時系列のアマチュアにすぎませんが、いくつかの簡単な提案があります。

  1. あなたはここで注文を受けているかもしれませんが、これはあなたが達成することを期待していること、そしてあなたにとって最も重要なことに関して、いくらかの研ぎが必要だと思います。訪問数の予測は、残念ながらあいまいな目標です。たとえば、午後4時で、訪問を1時間先に予測するとします。前のシリーズ全体の処理を組み込んだスーパーモデルが本当に必要ですか?これは、実際の実用的および/または科学的な目標を考慮した結果である必要があります。これは、上司またはクライアントによって規定されている場合もあれば、研究者として独自の場合もあります。異なる目的のために異なるモデルが必要になる可能性が高いと思います。

  2. 時系列を分離することは、それがどれほどの意味を持っているかをあまり考慮せずに計算を削減するという考えによって推進されているようです。つまり、午後4時に何が起こっているのかを予測するために、今日以前の情報を使用しない(しない)ということです。多くの話し合いが必要なようです。

  3. あなたは明らかに時系列の学習者です(そして私は自分自身を標準に置いています)が、これほど大きな問題から始める学習者はいないはずです。本当に!多くのデータがあり、いくつかのスケールで周期性があり、営業時間と休日の不規則性があり、外生変数があります。非常に難しい問題を選びました。(傾向についてもどうですか?)言うのは簡単ですが、これまでのところ明らかに成功しています。まず、問題の非常に単純化されたバージョンに取り組み、より単純なモデルに適合させる方法の感触を得なければならない場合があります。すべてを大きな複雑なモデルに投入することは明らかにうまく機能せず、根本的に単純なものが求められているように見えるか、プロジェクトが野心的すぎる可能性があるという認識です。


こんにちはニック、1-確かに私は注文を受けています!目標は、モデルが大幅に予測し過ぎたり(スタッフの時間が無駄になる)、予測しすぎたり(スタッフが圧倒されないように)しないようにモデルを構築することです。2-私はこれを検討しましたが、私がこの方法で何を得る/失うかを理解するために深く掘り下げます。1つのシリーズとして予測することは、あなたが言うように「スーパーモデル」に似ているように見えました。3-私はこれが非常に困難であることを認識しており、現時点では自分の体重を上回っていますが、ここでも私に役立つより簡単な解決策に完全にオープンです。ニックさん、どうもありがとうございました。
krcooke 2013

より単純な解決策と言えば、去年のジュビリー週末の期間が今年(同じ期間)を過大予測するような方法で指数平滑法を実行することはできませんでした。含まれている異常値の種類のため、私は絶対に外生変数を使用する必要があると感じました。私が探求できる他のアイデアはありますか?
krcooke 2013

私が言えることは、もし私が命令を受けていて、あなたがここで与えた情報を正確に持っていたら、私が何をすべきかです。私の本能は、最初に毎日の合計に集計し、それらを処理することです。それは十分に難しいです。ここで批判的になる方がはるかに簡単です...
Nick Cox

こんにちはニック、私のせい、私はこれを試したことをすでに述べていたはずです。毎日の合計では、結果は妥当であるように見えました。あなたとデイブの両方が述べたように、ここで考慮すべきことははるかに多いので、キーワードは合理的です。興味がある場合は、毎日のデータを再実行して、毎週、毎月、および毎年の季節性を捉えていることを実証できます。そのため、1時間ごとに毎日のシリーズとして予測することを考えました。
krcooke 2013

最初の投稿で述べたように、私が抱えていた問題の1つは、auto.arimaが収束する前に最大反復回数に達することです。そのため、Arima()で非常に一般化されたパラメーターを使用しています。これをどのように克服できるかについてのガイダンスは大歓迎です!
krcooke 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.