自己回帰式は、変数の原系列を特定のモデルで変換し、ホワイト・ノイズに近い性質をもつ残差を導くという役割を果たす。
実際の時系列分析においては真のフィルターは未知だから、自己回帰式の推定を行い、残差がホワイト・ノイズの条件を満たすかどうか検討する。
時系列の平均や誤差の分散が観測期間の途中で変化することを構造変化(structural change)という。
鉱工業生産指数(IIP)の月次成長率についてAR(2)を推定した結果は次のようになる。
# IIPデータの読み込み
iip <- read.csv("iip.csv")
head(iip)
## yyyymm iip
## 1 197801 63.0
## 2 197802 62.4
## 3 197803 63.9
## 4 197804 63.9
## 5 197805 64.1
## 6 197806 64.4
# データをts型に変換
x <- ts(data = iip$iip, start = c(1978, 1), frequency = 12)
# 鉱工業生産指数の連続型成長率の標本AC関数と2シグマ
r <- diff(log(x)) #連続型成長率
acf(r, lag.max = 20, ci.type = "ma")
# AR(2)の推定
ar2 <- arima(r, order = c(2, 0, 0))
# 残差のプロット
par(family = "HiraginoSans-W3") #日本語が文字化けしないようにおまじない
ts.plot(ar2$residuals, gpars=list(xlab="年月", ylab="残差", lty=3, col=3))
2シグマを超える残差を調べる。
# 2シグマ
twosigma <- 2*sqrt(ar2$sigma2)
twosigma
## [1] 0.03601337
# 2シグマを超える残差(異常値)のインデックスを抽出
i.outlier <- abs(ar2$residuals) > twosigma
i.outlier
## Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 1978 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 1979 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 1980 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 1981 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 1982 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 1983 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 1984 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 1985 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 1986 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 1987 FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
## 1988 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 1989 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 1990 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 1991 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 1992 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
## 1993 FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 1994 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 1995 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 1996 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 1997 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 1998 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 1999 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 2000 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 2001 TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 2002 FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 2003 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 2004 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 2005 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 2006 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 2007 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 2008 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE
## 2009 TRUE TRUE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 2010 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 2011 FALSE FALSE TRUE FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
## 2012 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 2013 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 2014 FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 2015 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 2016 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## 2017 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# 年月ラベルを作成
date <- seq(as.Date("1978-02-01"), as.Date("2017-12-01"), by = "month")
# 年月と残差のデータフレーム
zansa <- data.frame(date = format(date, "%Y-%m"), residuals = ar2$residuals)
head(zansa)
## date residuals
## 1 1978-02 -0.010566482
## 2 1978-03 0.022383563
## 3 1978-04 0.000470380
## 4 1978-05 -0.001010678
## 5 1978-06 0.003734482
## 6 1978-07 0.004847762
# 2シグマを超える年月と残差の値
zansa[i.outlier, ]
## date residuals
## 113 1987-06 0.03732241
## 176 1992-09 0.03943973
## 182 1993-03 -0.04436986
## 276 2001-01 -0.04475336
## 292 2002-05 0.04050402
## 370 2008-11 -0.07178681
## 371 2008-12 -0.08403957
## 372 2009-01 -0.08506241
## 373 2009-02 -0.07946025
## 375 2009-04 0.05445839
## 398 2011-03 -0.18140191
## 400 2011-05 0.08941582
## 401 2011-06 0.03767297
## 435 2014-04 -0.04458957
残差系列から計算した標本AC関数について統計的な検定を行う。
上記の四半期GDPの対数系列のAR(1)から計算された残差のACプロットは次のようになる。
# 残差のACプロット
acf(ar2$residuals, lag.max = 20)
自己回帰式の選択においては、原系列に関する標本AC関数のみならず標本PAC関数が分析に用いられたが、診断検定では残差に関する標本AC関数飲みが使われる。
# 残差のPACプロット
pacf(ar2$residuals, lag.max = 20)
診断検定では、推定された時系列過程の残差から計算された標本AC係数の平方和として計算されるふろしき統計量 が重要である。
R
では関数Box.test
を使ってふろしき検定を行うことができる。
# ふろしき検定
k <- 8 #次数
Box.test(ar2$residuals, k, type = "Box-Pierce", fitdf = 2)
##
## Box-Pierce test
##
## data: ar2$residuals
## X-squared = 4.2202, df = 6, p-value = 0.6469
Box.test(ar2$residuals, k, type = "Ljung-Box", fitdf = 2)
##
## Box-Ljung test
##
## data: ar2$residuals
## X-squared = 4.2899, df = 6, p-value = 0.6375
fitdf = 2
で自由度を\(k\)から2引いている。残差を回帰診断するため、\(Q^{*}\)統計量とその\(p\)値を8ラグ分まで示す。
# k=1から8までのLjung-Box検定統計量とp値
Q_LB <- numeric(8)
p_LB <- numeric(8)
for (k in 1:8) {
LB <- Box.test(ar2$residuals, k, type = "Ljung-Box", fitdf = 2)
Q_LB[k] <- LB$statistic
p_LB[k] <- LB$p.value
}
## Warning in pchisq(STATISTIC, lag - fitdf): 計算結果が NaN になりました
data.frame(k = 1:8, Q_LB, p_LB)
## k Q_LB p_LB
## 1 1 0.02148020 NaN
## 2 2 0.02159477 0.0000000
## 3 3 1.21303727 0.2707314
## 4 4 1.23327120 0.5397573
## 5 5 1.49840263 0.6826391
## 6 6 2.08325407 0.7204495
## 7 7 3.28200962 0.6565971
## 8 8 4.28994128 0.6375034
時系列分析においては、観測される変数\(X_{t}\)についての自己回帰のみでなく、ノイズの移動平均が分析に利用される。
R
などの分析ソフトを利用すれば低次のMA過程は字数を指定するだけで推定できる。前回、AR過程が定常性の条件を満たせば時系列変数をノイズ\(\epsilon_{t}\)だけの1次式として表現できることを示した。 \[ \begin{align} X_t &= \mu + \phi X_{t-1} + \epsilon_{t} \\ &= \epsilon_t + \phi \epsilon_{t-1} + \phi^2 \epsilon_{t-2} + \cdots \end{align} \] 同様に、ノイズの1次式であるMA過程を、時系列変数\(X_{t}\)だけの1次式として表現することができる。
鉱工業生産指数の月次成長率に関する4次の移動平均式MA(4)の推定結果を示す。
arima
関数を使って簡単にMAモデルを最尤法により推定できる。
order
の最後の数値にMAの次数を指定する。# MA(4)の推定
ma4 <- arima(r, order = c(0,0,4))
ma4
##
## Call:
## arima(x = r, order = c(0, 0, 4))
##
## Coefficients:
## ma1 ma2 ma3 ma4 intercept
## -0.0127 0.1325 0.0405 0.0104 0.0011
## s.e. 0.0457 0.0457 0.0447 0.0429 0.0010
##
## sigma^2 estimated as 0.0003236: log likelihood = 1244.93, aic = -2477.85
最高次の項ma4
が有意でないので、次数を下げて推定を繰り返す。
# MA(3)の推定
ma3 <- arima(r, order = c(0,0,3))
ma3
##
## Call:
## arima(x = r, order = c(0, 0, 3))
##
## Coefficients:
## ma1 ma2 ma3 intercept
## -0.0125 0.1316 0.0401 0.0011
## s.e. 0.0456 0.0450 0.0447 0.0010
##
## sigma^2 estimated as 0.0003236: log likelihood = 1244.9, aic = -2479.8
# MA(2)の推定
ma2 <- arima(r, order = c(0,0,2))
ma2
##
## Call:
## arima(x = r, order = c(0, 0, 2))
##
## Coefficients:
## ma1 ma2 intercept
## -0.0172 0.1350 0.0011
## s.e. 0.0455 0.0451 0.0009
##
## sigma^2 estimated as 0.0003242: log likelihood = 1244.5, aic = -2480.99
# MA(1)の推定
ma1 <- arima(r, order = c(0,0,1))
ma1
##
## Call:
## arima(x = r, order = c(0, 0, 1))
##
## Coefficients:
## ma1 intercept
## -0.0053 0.0011
## s.e. 0.0406 0.0008
##
## sigma^2 estimated as 0.0003302: log likelihood = 1240.13, aic = -2474.25
log likelihood
はMA(4)が最も大きい。項数が増えることに対するペナルティを入れたAICを比較する。
# AICの比較
AIC(ma1, ma2, ma3, ma4)
## df AIC
## ma1 3 -2474.251
## ma2 4 -2480.994
## ma3 5 -2479.795
## ma4 6 -2477.854
推定結果を用いた診断は、自己回帰の場合と変わらない。
まず、フィット値と残差のプロットを見てみる。
# 成長率とフィット値のプロット
par(family = "HiraginoSans-W3") #日本語が文字化けしないようにおまじない
ts.plot(r, r - ma2$residuals, gpars=list(xlab="年月", ylab="成長率", lty=c(1:2), col=c(1:2))) #成長率とフィット値
# 残差のプロット
par(family = "HiraginoSans-W3") #日本語が文字化けしないようにおまじない
ts.plot(ma2$residuals, gpars=list(xlab="年月", ylab="残差", lty=3, col=3))
残差が2シグマを超える場合を調べる。
# 2シグマ
twosigma <- 2*sqrt(ma2$sigma2)
twosigma
## [1] 0.03601049
# 2シグマを超える残差(異常値)のインデックスを抽出
i.outlier <- abs(ma2$residuals) > twosigma
# 年月と残差のデータフレーム
zansa <- data.frame(date = format(date, "%Y-%m"), residuals = ma2$residuals)
# 2シグマを超える年月と残差の値
zansa[i.outlier, ]
## date residuals
## 25 1980-02 0.03632681
## 113 1987-06 0.03695657
## 176 1992-09 0.03855896
## 182 1993-03 -0.04462793
## 276 2001-01 -0.04505106
## 292 2002-05 0.04024675
## 370 2008-11 -0.07199758
## 371 2008-12 -0.08545244
## 372 2009-01 -0.08569674
## 373 2009-02 -0.08049433
## 375 2009-04 0.05350490
## 398 2011-03 -0.18116492
## 400 2011-05 0.08980717
## 401 2011-06 0.03930056
## 435 2014-04 -0.04452816
次に、残差の標本AC関数と標本PAC関数を見てみる。
# 残差のACプロット
acf(ma2$residuals, lag.max = 20)
# 残差のPACプロット
pacf(ma2$residuals, lag.max = 20)
最後に、8次までのふろしき検定の結果を見る。
# k=1から8までのLjung-Box検定統計量とp値
Q_LB <- numeric(8)
p_LB <- numeric(8)
for (k in 1:8) {
LB <- Box.test(ar2$residuals, k, type = "Ljung-Box", fitdf = 2)
Q_LB[k] <- LB$statistic
p_LB[k] <- LB$p.value
}
## Warning in pchisq(STATISTIC, lag - fitdf): 計算結果が NaN になりました
data.frame(k = 1:8, Q_LB, p_LB)
## k Q_LB p_LB
## 1 1 0.02148020 NaN
## 2 2 0.02159477 0.0000000
## 3 3 1.21303727 0.2707314
## 4 4 1.23327120 0.5397573
## 5 5 1.49840263 0.6826391
## 6 6 2.08325407 0.7204495
## 7 7 3.28200962 0.6565971
## 8 8 4.28994128 0.6375034
AR過程において誤差項がMAであるモデルを自己回帰移動平均(auto-regressive moving average:ARMA)という。
最も簡単な例として、1次のARおよび1次のMA部分をもつARMA過程は次のようになる。 \[ X_{t} + \phi X_{t-1} = \mu + \epsilon_{t} + \theta \epsilon_{t-1} \]
ARMA過程では、今期の変数値(\(X_{t}\))は、過去の値(\(X_{t-1}, X_{t-2}, \ldots\))の1次式と今期以前の誤差項(\(\epsilon_{t-1}, \epsilon_{t-2}, \ldots\))の1次式として表現される。
AR過程がMA化でき、MA過程がAR化できるように、ARMA過程をMA過程やAR過程に変換することもできる。
こうして求められた時系列過程は無限の項を含むから、MA(\(\infty\))やAR(\(\infty\))のように次数を明記して示すことが適切である。
一般のARMA過程は次のようになる。 \[ X_{t} + \phi_{1} X_{t-1} + \phi_{2} X_{t-2} + \cdots + \phi_{p} X_{t-p} = \mu + \epsilon_{t} + \theta_{1} \epsilon_{t-1} + \cdots + \theta_{q} \epsilon_{t-q} \]
ARMA(\(p,q\))を過去のノイズの1次式で表現するためには、AR部分の係数を用いた多項式 \[ 1 + \phi_{1}x^{1} + \phi_{2}x^{2} + \cdots + \phi_{p}x^{p} = 0 \] の根の絶対値が1より大でないといけない。
一方、ARMA(\(p,q\))の自己回帰への書き直しが可能であるためには、MA部分の係数を用いた多項式 \[ 1 + \theta_{1}x^{1} + \theta_{2}x^{2} + \cdots + \theta_{q}x^{q} = 0 \] の根の絶対値が1より大でないといけない。
AR(2,2)の推定結果を示す。
# ARMA(2,2)の推定
arma22 <- arima(r, order = c(2, 0, 2))
arma22
##
## Call:
## arima(x = r, order = c(2, 0, 2))
##
## Coefficients:
## ar1 ar2 ma1 ma2 intercept
## 0.3308 0.0897 -0.3437 0.0485 0.0011
## s.e. 0.3190 0.2701 0.3200 0.2685 0.0010
##
## sigma^2 estimated as 0.0003234: log likelihood = 1245.07, aic = -2478.14
AR部分の多項式\(1+\phi_{1}x + \phi_{2}x^{2} = 0\)の根を求める。
polyroot
を用いる。polyroot(c(1, 0.5, 0.6))
で\(1 + 0.5x + 0.6x^{2}\)の根を求めることができる。# AR多項式の根
root <- polyroot(c(1, arma22$coef[1], arma22$coef[2]))
root
## [1] -1.84332+2.783228i -1.84332-2.783228i
round(abs(root), digits = 3) #根の絶対値
## [1] 3.338 3.338
同様にMA部分の多項式\(1+\theta_{1}x + \theta_{2}x^{2} = 0\)の根を求め、反転可能性条件を確認する。
# MA多項式の根
round(abs(polyroot(c(1, arma22$coef[3], arma22$coef[4]))), digits = 3) #根の絶対値
## [1] 4.543 4.543
ARMA(2,2)よりも少ない次数を推定し、AR(2)とMA(2)も含めてAICを比較する。
# ARMA(2,1)の推定
arma21 <- arima(r, order = c(2, 0, 1))
arma21
##
## Call:
## arima(x = r, order = c(2, 0, 1))
##
## Coefficients:
## ar1 ar2 ma1 intercept
## 0.3166 0.1371 -0.3294 0.0011
## s.e. 0.2667 0.0467 0.2685 0.0010
##
## sigma^2 estimated as 0.0003234: log likelihood = 1245.05, aic = -2480.11
# ARMA(1,2)の推定
arma12 <- arima(r, order = c(1, 0, 2))
arma12
##
## Call:
## arima(x = r, order = c(1, 0, 2))
##
## Coefficients:
## ar1 ma1 ma2 intercept
## 0.3821 -0.3941 0.1348 0.0011
## s.e. 0.3530 0.3512 0.0472 0.0010
##
## sigma^2 estimated as 0.0003235: log likelihood = 1245.01, aic = -2480.02
# ARMA(1,1)の推定
arma11 <- arima(r, order = c(1, 0, 1))
arma11
##
## Call:
## arima(x = r, order = c(1, 0, 1))
##
## Coefficients:
## ar1 ma1 intercept
## -0.8553 0.8181 0.0011
## s.e. 0.1080 0.1177 0.0008
##
## sigma^2 estimated as 0.0003285: log likelihood = 1241.35, aic = -2474.7
# AR(2)の推定
ar2 <- arima(r, order = c(2, 0, 0))
# MA(2)の推定
ma2 <- arima(r, order = c(0, 0, 2))
# AICの比較
AIC(ar2, ma2, arma11, arma12, arma21, arma22)
## df AIC
## ar2 4 -2480.918
## ma2 4 -2480.994
## arma11 4 -2474.696
## arma12 5 -2480.023
## arma21 5 -2480.107
## arma22 6 -2478.135
MA(2)の定常性の条件と反転可能性条件を確認する。
# MA(2)のMA特性式の根
round(abs(polyroot(c(1, ma2$coef[1], ma2$coef[2]))), digits = 3) #根の絶対値
## [1] 2.722 2.722
上記で行った残差の診断から、MA(2)は診断検定をパスする。
時系列モデルの古典的な分析では、次のように次数を選択する。
1では、次の理論的な性質が背後にある。
PACはAR過程の次数を決める際に、ACはMA過程の次数を決める際に、それぞれ重要な情報を与える。
経済変数に関するデータ分析でも、標本ACおよびPAC関数を次数を選ぶ際の基準に用いるが、上記のように明確には次数を選べない。 そこで、以下の手順に従って次数を選択することが推奨される。
時系列分析が統計ソフトを使って容易にできるようになった現状では、ARMA式の推定結果にもとづいて時系列過程の選択を進めていくことが実際的である。
R
では、forecast
パッケージのauto.arima
関数を用いて、最小AIC規準の次数選択を行うことができる。# パッケージの読み込み
library(forecast)
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
# ARMA過程の次数選択
fit <- auto.arima(r, d=0, max.p=4, max.q=4, seasonal = F, ic = "aic", stepwise = T, trace = T)
##
## Fitting models using approximations to speed things up...
##
## ARIMA(2,0,2) with non-zero mean : -2477.915
## ARIMA(0,0,0) with non-zero mean : -2476.234
## ARIMA(1,0,0) with non-zero mean : -2473.599
## ARIMA(0,0,1) with non-zero mean : -2474.251
## ARIMA(0,0,0) with zero mean : -2476.538
## ARIMA(1,0,2) with non-zero mean : -2478.84
## ARIMA(0,0,2) with non-zero mean : -2480.994
## ARIMA(0,0,3) with non-zero mean : -2479.805
## ARIMA(1,0,1) with non-zero mean : -2474.434
## ARIMA(1,0,3) with non-zero mean : -2477.428
## ARIMA(0,0,2) with zero mean : -2481.588
## ARIMA(0,0,1) with zero mean : -2474.542
## ARIMA(1,0,2) with zero mean : -2479.533
## ARIMA(0,0,3) with zero mean : -2480.491
## ARIMA(1,0,1) with zero mean : -2474.623
## ARIMA(1,0,3) with zero mean : -2477.98
##
## Now re-fitting the best model(s) without approximations...
##
## ARIMA(0,0,2) with zero mean : -2481.59
##
## Best model: ARIMA(0,0,2) with zero mean
d = 0
:差分を取らないmax.p = 4
とmax.q = 4
:ARとMAの最高次数を4seasonal = F
:季節調整は行わない(F
はFALSE
の略)ic = "aic"
:最小AIC規準stepwise = F
:選択するモデルが少なくなるように段階的に選択する
stepwise = T
とすると、指定した最高次数以下のすべてのモデルを比較するので、特に季節調整のあるモデルを含む場合に時間がかかる。trace = T
:比較されたARMAモデルのリストが表示される。選択されたモデルを表示する。
# 選択されたモデルの表示
summary(fit)
## Series: r
## ARIMA(0,0,2) with zero mean
##
## Coefficients:
## ma1 ma2
## -0.0148 0.1371
## s.e. 0.0455 0.0450
##
## sigma^2 estimated as 0.0003265: log likelihood=1243.79
## AIC=-2481.59 AICc=-2481.54 BIC=-2469.07
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set 0.0009701102 0.01803164 0.01166214 NaN Inf 0.6433995 0.003341196