RでARIMAXモデルを適合させる方法は?


33

毎時測定の4つの異なる時系列があります。

  1. 家の中の熱消費
  2. 家の外の温度
  3. 日射
  4. 風速

家の中の熱消費量を予測できるようにしたい。年間および日単位の両方で、明確な季節的傾向があります。異なるシリーズの間には明確な相関関係があるため、ARIMAXモデルを使用してそれらを近似します。これは、パッケージTSAの関数arimaxを使用して、Rで実行できます。

私はこの関数に関するドキュメントを読み、伝達関数を読み込もうとしましたが、これまでのところ、私のコードは:

regParams = ts.union(ts(dayy))
transferParams = ts.union(ts(temp))
model10 = arimax(heat,order=c(2,1,1),seasonal=list(order=c(0,1,1),period=24),xreg=regParams,xtransf=transferParams,transfer=list(c(1,1))
pred10 = predict(model10, newxreg=regParams)

私に与えます: ここに画像の説明を入力してください

ここで、黒い線は実際の測定データであり、緑の線は私の比較モデルです。それは良いモデルではないだけでなく、明らかに何かが間違っています。

ARIMAXモデルと伝達関数に関する知識が限られていることを認めます。関数arimax()では(理解している限り)、xtransfは(伝達関数を使用して)メインの時系列を予測するために使用する外因性の時系列です。しかし、実際にはxregとxtransfの違いは何ですか?

より一般的には、私が間違ったことは何ですか?lm(heat〜temp radi wind * time)から得られるものよりも良いフィット感を得ることができるようにしたいと思います。

編集: コメントのいくつかに基づいて、転送を削除し、代わりにxregを追加しました。

regParams = ts.union(ts(dayy), ts(temp), ts(time))
model10 = arimax(heat,order=c(2,1,1),seasonal=list(order=c(0,1,1),period=24),xreg=regParams)

ここで、dayyは「年間通算日」であり、timeはその日の時間です。温度は再び外の温度です。これにより、次の結果が得られます。

ここに画像の説明を入力してください

それは良いですが、私が期待していたものとはほぼ異なります。

回答:


34

ARIMAモデルを使用して、2つのレベルの季節性を持つシリーズをモデリングするのに少し苦労するでしょう。これを正しく行うには、正しく設定することに大きく依存します。単純な線形モデルを検討しましたか?ARIMAモデルよりもはるかに高速で簡単に適合できます。また、異なる季節性レベルにダミー変数を使用すると、かなり正確です。

  1. 1時間ごとのデータがあると想定しているため、TSオブジェクトが24の頻度で設定されていることを確認してください。
  2. ダミー変数を使用して、季節性の他のレベルをモデル化できます。たとえば、年の月を表す0/1ダミーのセットが必要な場合があります。
  3. xreg引数にダミー変数を含め、共変量(温度など)を含めます。
  4. ベースRの関数arimaを使用してモデルを近似します。この関数は、xreg引数を使用してARMAXモデルを処理できます。
  5. 予測パッケージのArimaおよびauto.arima関数を試してください。auto.arimaは、arimaモデルに適したパラメーターを自動的に見つけるため、便利です。ただし、データセットに収まるには永遠に時間がかかります。
  6. 季節性の各レベルのダミー変数を使用して、arimaパッケージのtslm関数を試してください。これは、Arimaモデルよりもはるかに速く適合し、状況によってはより適切に機能する場合もあります。
  7. 4/5/6が機能しない場合、伝達関数について心配し始めます。歩く前にクロールする必要があります。
  8. 将来の予測を計画している場合は、まずxreg変数を予測する必要があります。これは季節のダミーにとっては簡単ですが、良い天気予報を立てる方法について考える必要があります。たぶん、履歴データの中央値を使用しますか?

これが私がこれにどのようにアプローチするかの例です:

#Setup a fake time series
set.seed(1)
library(lubridate)
index <- ISOdatetime(2010,1,1,0,0,0)+1:8759*60*60
month <- month(index)
hour <- hour(index)
usage <- 1000+10*rnorm(length(index))-25*(month-6)^2-(hour-12)^2
usage <- ts(usage,frequency=24)

#Create monthly dummies.  Add other xvars to this matrix
xreg <- model.matrix(~as.factor(month))[,2:12]
colnames(xreg) <- c('Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')

#Fit a model
library(forecast)
model <- Arima(usage, order=c(0,0,0), seasonal=list(order=c(1,0,0), period=24), xreg=xreg)
plot(usage)
lines(fitted(model),col=2)

#Benchmark against other models
model2 <- tslm(usage~as.factor(month)+as.factor(hour))
model3 <- tslm(usage~as.factor(month))
model4 <- rep(mean(usage),length(usage))

#Compare the 4 models
library(plyr) #for rbind.fill
ACC <- rbind.fill(  data.frame(t(accuracy(model))),
                    data.frame(t(accuracy(model2))),
                    data.frame(t(accuracy(model3))),
                    data.frame(t(accuracy(model4,usage)))
                )
ACC <- round(ACC,2)
ACC <- cbind(Type=c('Arima','LM1','Monthly Mean','Mean'),ACC)
ACC[order(ACC$MAE),]

fit()関数とは何ですか。これを使用すると、predict(model10、newxreg = regParams)よりもはるかに良い結果が得られます。
utdiscant

@utdiscant:predict()予測に使用されfitted()ますが、モデルは履歴期間に適合します。より具体的なヘルプが必要な場合は、再現可能な例をいくつかのコードとともに投稿してください。
ザック

@utdiscant:また、dayyをxregとして使用すると、1日あたり24の観測しか得られないため、過剰適合のリスクがあります。年の月を使用すると、より良い予測結果が得られる場合があります。
ザック

@utdiscant:さらに、時間ベースのxregはダミー変数である必要があります。これをモデル化する方法は、heat時間とともに直線的に増加し、時間が1に戻ったときに下にジャンプすることです。ダミー変数を使用すると、時間ごとに効果が得られます。サンプルコードを実行し、xregオブジェクトの作成方法に注意を払ってください。
ザック

statsおよびforecastパッケージのARIMA関数の欠点の1つは、プローバー伝達関数に適合しないことです。stats::arima関数のドキュメントには、次のように記述されています。xreg項が含まれる場合、線形回帰(include.meanがtrueで差異がない場合は定数項を使用)はエラー項のARMAモデルに適合します。したがって、伝達関数を実際に適合させる必要がある場合、TSA::arimax関数がに入る方法であるように見えRます。
クリストファー

8

しばらくの間、Rを使用して負荷予測を行ってきましたが、forecastパッケージとその貴重な関数(などauto.arima)を使用することをお勧めします。

次のコマンドでARIMAモデルを作成できます。

model = arima(y, order, xreg = exogenous_data)

yあなたのpredictand(私は仮定dayy)、orderモデルの順序が(季節性を考慮して)とexogenous_dataなど、あなたの温度、日射量、機能がauto.arima最適なモデル次数を見つけるために役立ちます。「予測」パッケージに関する簡単なチュートリアルは、こちらにあります


予測されるのは熱(家の熱消費量)です。
utdiscant

3

私は個人的に伝達関数を理解していないが、私はあなたが得たと思うxtransfし、xreg逆。少なくともRのベースarimaではxreg、外生変数が含まれています。私の印象では、伝達関数はwhatではなく、どのように(遅延データが将来の値に影響する)を表します

伝達関数が必要な場合はxreg、おそらく外生変数に使用してみます。問題は、モデルは毎日ですが、データには毎日と年間の両方の季節性があるため、最初の違い()がそれを処理するかどうかは今のところわかりません。(確かに、毎日の季節性のみを考慮したモデルから魔法の通年の予測を取得することはありません。)arimaarimaxorder=(*, 1, *)

PSあなたは何timeを使っていますlmか?リテラルのクロック時間または1アップの観測数?私はあなたが(混合効果モデル使って何かを得ることができると思いlmerlme4私が正しく、時系列に起こるであろう自己相関を占めていることをやっているかどうかを考え出していないものの、パッケージを)。考慮されていない場合、そうではありlmませんが、あなたは面白いフィットを得るかもしれませんが、あなたの予測がどれほど正確であるかというあなたの概念はあまりにも楽観的です。


私は測定の時間と測定の「年の日」の両方を持っています。
utdiscant
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.