手作業によるARIMA推定


15

ARIMAモデリング/ Box Jenkins(BJ)でパラメーターがどのように推定されるかを理解しようとしています。残念ながら、私が遭遇した本のいずれも、対数尤度推定手順などの推定手順を詳細に説明していません。私は非常に役立つウェブサイト/教材を見つけました。以下は、上記のソースからの方程式です。

LLθ=n2ログ2πn2ログσ2t=1net22σ2

自分でARIMA / BJの推定を学びたいです。そこで、を使用して手作業でARMAを推定するコードを記述しました。以下は私がRでやったことです、RR

  • ARMAをシミュレートしました(1,1)
  • 上記の方程式を関数として書きました
  • シミュレートされたデータと最適関数を使用して、ARおよびMAパラメーターを推定しました。
  • また、statsパッケージでARIMAを実行し、ARMAパラメーターを手作業で行ったものと比較しました。 以下は比較です:

比較

**以下は私の質問です:

  • 推定変数と計算変数の間にわずかな違いがあるのはなぜですか?
  • ARIMAはRバックキャストで機能しますか、または推定手順はコードで以下に概説されているものとは異なりますか?
  • 観測1でe1またはエラーを0として割り当てましたが、これは正しいですか?
  • また、最適化のヘッセ行列を使用して予測の信頼限界を推定する方法はありますか?

いつものようにあなたの助けに感謝します。

コードは次のとおりです。

## Load Packages

library(stats)
library(forecast)

set.seed(456)


## Simulate Arima
y <- arima.sim(n = 250, list(ar = 0.3, ma = 0.7), mean = 5)
plot(y)

## Optimize Log-Likelihood for ARIMA

n = length(y) ## Count the number of observations
e = rep(1, n) ## Initialize e

logl <- function(mx){

  g <- numeric
  mx <- matrix(mx, ncol = 4)

  mu <- mx[,1] ## Constant Term
  sigma <- mx[,2] 
  rho <- mx[,3] ## AR coeff
  theta <- mx[,4] ## MA coeff

  e[1] = 0 ## Since e1 = 0

  for (t in (2 : n)){
    e[t] = y[t] - mu - rho*y[t-1] - theta*e[t-1]
  }

  ## Maximize Log-Likelihood Function 
  g1 <-  (-((n)/2)*log(2*pi) - ((n)/2)*log(sigma^2+0.000000001) - (1/2)*(1/(sigma^2+0.000000001))*e%*%e)

  ##note: multiplying Log-Likelihood by "-1" in order to maximize in the optimization
  ## This is done becuase Optim function in R can only minimize, "X"ing by -1 we can maximize
  ## also "+"ing by 0.000000001 sigma^2 to avoid divisible by 0
  g <- -1 * g1

  return(g)

}

## Optimize Log-Likelihood
arimopt <- optim(par=c(10,0.6,0.3,0.5), fn=logl, gr = NULL,
                 method = c("L-BFGS-B"),control = list(), hessian = T)
arimopt

############# Output Results###############
ar1_calculated = arimopt$par[3]
ma1_calculated = arimopt$par[4]
sigmasq_calculated = (arimopt$par[2])^2
logl_calculated = arimopt$val
ar1_calculated
ma1_calculated
sigmasq_calculated
logl_calculated

############# Estimate Using Arima###############
est <- arima(y,order=c(1,0,1))
est

1
と関係は何ですか?コードには「」がありません。おそらく?もしそうなら、の計算に明らかなバグがあるでしょう。答えは少ししか変わりませんが、これらも不要にする必要があります。小さな場合、このパラメーターの誤った値を報告することを保証します。TnTT=n+1g1+0.000000001σ
whuber

方程式を変更し、コードの内容を反映しました。私は確かにそれが0で原因割り切れに「NaNを」生じ、また、ログ(0)の問題が原因でしょうbecuase私は0.000000001を削除することができる方法はないよ
予報

2
正確な尤度の概念があります。MAエラーの最初の値(質問の1つ)などの初期パラメーターの知識が必要です。通常、実装は初期値の扱い方に関して異なります。私が通常していることは(多くの本では言及されていませんが)、初期値に対してもMLを最大化することです。
カグダスオズゲンク

3
Tsayから、次のを見て、それはすべてのケースをカバーしていないが、私にとっては非常に便利だったしてください:faculty.chicagobooth.edu/ruey.tsay/teaching/uts/lec8-08.pdf
Cagdas Ozgenc

1
初期値が指す@CagdasOzgencが違いの原因です。コメントを回答として投稿する場合は、コメントを回答として受け入れることができます。
予測者

回答:


6

正確な尤度の概念があります。MAエラーの最初の値(質問の1つ)などの初期パラメーターの知識が必要です。通常、実装は初期値の扱い方に関して異なります。私が通常していることは(多くの本では言及されていませんが)、初期値に対してもMLを最大化することです。

Tsayの次の記事をご覧ください。すべてのケースを網羅しているわけではありませんが、私にとっては非常に役立ちました。

http://faculty.chicagobooth.edu/ruey.tsay/teaching/uts/lec8-08.pdf


3

arima関数のヘルプページを読みましたか?関連する抜粋は次のとおりです。

正確な尤度は、ARIMAプロセスの状態空間表現、およびカルマンフィルターによって検出されたイノベーションとその分散を介して計算されます。差分ARMAプロセスの初期化は定常性を使用し、Gardner et alに基づいています。(1980)。差異のあるプロセスの場合、非定常コンポーネントには拡散事前分布が与えられます(カッパによって制御されます)。拡散事前分布(少なくとも1e4のカルマンゲインを持つことで決定)によってまだ制御されている観測値は、尤度計算から除外されます。(これは、除外された観測値が正確に差分によってドロップされたものである場合、欠損値がない場合のarima0と同等の結果を提供します。)

パラメーターも関連していますmethod=c("CSS-ML", "ML", "CSS")

近似方法:最尤法または条件付き平方和を最小化します。デフォルトでは(欠損値がない場合)、条件付き二乗和を使用して開始値を検索し、次に最尤法を検索します。

結果はarima関数によって生成された結果とそれほど変わらないので、間違いなくすべてが正しくなりました。

2つの最適化手順の結果を比較する場合は、開始値が同じであり、同じ最適化方法が使用されていることを確認する必要があることに注意してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.