このブログでは過去にも説明しましたが、ここで改めて、「長時間相関過程」(long-range dependent process、あるいは、long-range correlated process)を、時系列モデリングで古典的に用いられてきた移動平均過程(moving average process; MA process)と、自己回帰過程(autoregressive process; AR process)を使って考えてみます。
1.MA過程とAR過程の関係
時系列の特性を数式に表すときの基本モデルとして、MA(移動平均)過程とAR(自己回帰)過程があります。
- MA(Moving Average)過程では、現在の値
は、時々刻々生じるランダムなゆらぎ(ノイズ)
の加重平均で表されます。つまり、
ここで は平均0、分散一定の白色雑音(white noise)です。白色雑音とは、時間的な相関をまったく持たない、純粋なランダムなゆらぎのことです。上の式の
(係数の長さ)は、次数と呼ばれ、
次のMA過程は、MA(q)過程と表現します。
- AR(AutoRegressive)過程では、現在の値
は、過去の各時点の観測値
の線形結合とノイズの和で表されます。つまり、
これは、過去の値と線形の関係で決定論的に依存する部分 と、予測不可能なランダムな要因で駆動される部分
から構成されています。上の式の
(係数の長さ)は、次数と呼ばれ、
次のAR過程は、AR(p)過程と表現します。
式を見れば、MA過程は「過去のノイズの影響」を記述するモデルであり、AR過程は「過去のデータ自体の影響」を記述するモデルのように感じられます。両者は一見すると異なる種類の過程のように見えますが、実際には数学的に密接な関係があり、無限級数を用いることで MA過程をAR表現に変換したり、逆に AR過程をMA表現に変換することも可能です。
例として、AR(1)過程をMA過程に書き換えてみます。AR(1)過程は、
と表され、 は平均0、分散
の白色雑音、
は自己回帰係数です。安定な過程である(発散しない)ためには
である必要があります。この式を後退演算子
を用いて書くと
となります。
の条件の下で、
が成り立つため(等比級数の和の公式を思い出してください)、上の式の両辺に左から をかけると
となります。これを後退演算子 を使わずに表現すれば
という無限次の移動平均過程(MA(∞)過程)が得られます。したがって、AR(1)過程のMA表現における係数は
であり、これらは指数関数的(exponential)に減衰します。つまり、古いノイズの影響は急速に小さくなり、AR(1)過程は短時間相関しか持ちません。指数的減衰とべき的減衰の違いについては、過去の記事(下記のリンク)も参考にしてください。
長期記憶過程は「ちりも積もれば無限大」ってこと - ケィオスの時系列解析メモランダム
一般に、AR過程は、無限次のMA過程に書き直せます。差分方程式を使った時系列モデリングの世界では、MA過程として表現できるものが線形過程ですので、AR過程も、今回扱うARFIMA過程も、線形過程です。「長時間相関は非線形」などという記述をたまに見ますが、そうとは言い切れないので注意してください。
2.MA過程とAR過程のパワースペクトルの計算
MA過程とAR過程は、線形な確率過程ですので、その特性は、パワースペクトル(power spectrum)により完全に特徴付けられます。パワースペクトルは、「各周波数成分がどれくらいの強さ(パワー)を持っているか」を示す関数です。確率過程と、周期成分の関係がイメージできない人もいるかもしれませんが、その場合は過去の記事(下記のリンク)を参考にしてください。
《過去記事まとめ》フーリエ変換とパワースペクトル推定:パワースペクトルは時系列の「DNA」 - ケィオスの時系列解析メモランダム
ここでは、MA過程とAR過程のパワースペクトルが簡単に(知識がないと難しく感じるかも)、あるいは、公式的に計算できることを説明します。
まず、MA(1)過程を例にとると、
のフーリエ変換を考えると、そのスペクトル密度関数(パワースペクトル)は
となります。ここで、 はノイズ成分
の分散です。
一般に、MA(q)過程のスペクトルは
と表されます。つまり、MA過程の係数 とノイズ成分
の分散
が決まれば、パワースペクトルが計算できます。時系列からこれらのパラメタを推定することが、時系列モデリングを使った時系列解析の目的です。
一方、AR(p) 過程のスペクトルは、分母に多項式が現れます:
以上からわかるように、MAモデルは分子側に多項式があり、ARモデルは分母側に多項式があります。両者には、分子と分母の違いがあるので、何か全然違うもののような印象を与えます。
後退演算子Bを用いた表現
ここでは、パワースペクトルを公式的に計算しやすくするために、後退演算子(backward shift operator)を導入します。後退演算子 は、時系列を1ステップ前にずらす作用を持ち、次のように定義されます:
この演算子を用いると、MA(q)過程とAR(p)過程はそれぞれ次のように書けます。
- MA(q)過程(Moving Average process)
は、後退演算子を用いて、
と表現することができます。さらに、
のように置けば、MA(q)過程は、
と表すことができます。
- AR(p)過程(AutoRegressive process)
は後退演算子を用いて、
と表現することができます。さらに、
のように置けば、AR(p)過程は、
と表すことができます。
このように、MA過程とAR過程はともに「多項式演算子」を使って統一的に表現できます。MA過程ではノイズ側に多項式演算子 が作用し、AR過程ではデータ側に多項式演算子
が作用しています。
この記法を使うと、パワースペクトルも非常に簡潔に、公式的に書けます。つまり、
となります。
この式は、ARMA過程(Autoregressive Moving Average process)と呼ばれる過程の一般形です。MAモデルでは 、ARモデルでは
となり、どちらもこの式に含まれることがわかります。
3.長時間相関を示す ARFIMA(0,d,0) 過程のパワースペクトルの漸近形
ARFIMA(Autoregressive Fractionally Integrated Moving Average)過程は、ARやMAを一般化したモデルで、「分数階差分」という考えを取り入れています。ARFIMA(0,d,0) 過程は次のように定義されます:
ここで、 は先ほど導入した後退演算子であり、
は「分数階の差分」を表すパラメータで、0 < d < 0.5 の範囲では定常で、長時間相関(long-range dependence)を示します。
このとき、上で紹介した公式を使えば、パワースペクトルは、
となります。
0に近い小さな周波数 のとき、
なので、
となることがわかります。
つまり、この過程は、低周波領域で 型のパワースペクトルを示す長時間相関過程になっています。
4.ARFIMA(0, d, 0) 過程の MA表現と AR表現
ARFIMA(0,d,0) 過程は、MA過程、あるいは、AR過程としての表現することができます。これらの2つの表現のどちらかを使えば、ARFIMA(0,d,0) 過程のサンプル時系列を生成することができます。
ここで、 はガンマ関数(階乗を一般化した関数)です
係数 の大きさは
が大きくなるにつれて次のように漸近的に減少します。
- AR表現(自己回帰形) ARFIMA(0, d, 0)過程は、次のような無限次の自己回帰過程としても表すことができます。
係数 は
が大きいとき、次のように漸近近似できます。

5.まとめ
今回の記事では、時系列モデルの基本であるMA(移動平均)過程とAR(自己回帰)過程を出発点として、それらを統一的に理解するための数式表現やパワースペクトルの関係を確認しました。両者は一見まったく異なるモデルのように見えますが、後退演算子(backward shift operator; B)を導入すると、どちらも多項式演算子で表される同一の枠組みに含まれることがわかります。この演算子表現により、ARとMAを組み合わせたARMA過程や、その一般化であるARFIMA過程を自然に導入できます。
特に、ARFIMA(0, d, 0)過程は、分数階差分 を導入することで、過去の影響が指数関数的ではなく、べき乗的にゆっくりと減衰することを表現できるモデルです。MA表現の係数
は漸近的に
に従い、過去の影響の蓄積が無限になる効果を持ちます。この「無限に蓄積する記憶」が、長時間相関(long-range dependence; LRD)の本質です。
パワースペクトルの観点から見ると、ARFIMA(0, d, 0) 過程は低周波数領域で という 1/f 型スペクトルを示し、時間スケールを超えてゆらぎが自己相似的に現れることを意味します。これは、自然界や生体信号、経済データなど、多くの現象に見られる「1/fゆらぎ(1/f fluctuation)」と深く関係しています。
(おまけ) Rで係数をプロット
長時間相関過程では、過去の値がどのように現在に影響を与えるかを見るために、ARFIMA(0,d,0)のMA表現とAR表現の係数をRでプロットしてみます。
############################################################
## ARFIMA(0,d,0) の MA係数 a_k と AR係数 φ_k をプロット
## それぞれに漸近形を点線で重ねる
############################################################
## ---- パラメータ設定 ----
d <- 0.30 # 0 < d < 0.5(定常・長時間相関)
K <- 1000 # 最大ラグ(大きめでも安定)
## ---- 係数の計算 ----
## a_k = Gamma(k+d) / [Gamma(k+1) * Gamma(d)]
ak_lgamma <- function(d, K) {
k <- 0:K
a <- numeric(K + 1)
a[1] <- 1.0
if (K >= 1) {
kk <- k[-1]
a[-1] <- exp(lgamma(kk + d) - lgamma(kk + 1) - lgamma(d))
}
a
}
## phi_k = (-1)^{k+1} * Gamma(k-d) / [Gamma(k+1) * Gamma(-d)]
phi_lgamma <- function(d, K) {
k <- 1:K
const <- -lgamma(-d)
(-1)^(k + 1) * exp(lgamma(k - d) - lgamma(k + 1) + const)
}
a <- ak_lgamma(d, K)
phi <- phi_lgamma(d, K)
## ---- 漸近形(理論定数を用いる)----
k_pos <- 1:K
a_asym <- (1 / gamma(d)) * (k_pos)^(d - 1) # a_k ~ k^{d-1}/Gamma(d)
phi_asymA <- (1 / abs(gamma(-d))) * (k_pos)^(-(d + 1)) # |phi_k| ~ k^{-(d+1)}/|Gamma(-d)|
## ---- 可視化 ----
op <- par(no.readonly = TRUE)
par(mfrow = c(1, 2), mar = c(5, 6.0, 3.0, 1))
## 左パネル:a_k の log-x プロット
plot(k_pos, a[k_pos + 1], pch = 16, log = "x", col = 2,
xlab = expression(k),
ylab = expression(a[k] == frac(Gamma(k + d), Gamma(k + 1) * Gamma(d))),
main = bquote(MA~coefficients~~a[k]~~"(ARFIMA(0," * .(d) * ",0))"))
lines(k_pos, a_asym, lty = 2, lwd = 2, col = 4) # 漸近形(破線)
legend("topright",
legend = c(expression(a[k]),
expression(a[k] %~~% k^{d-1} / Gamma(d))),
pch = c(16, NA), lty = c(NA, 2), lwd = c(1, 2),
col = c(2, 4), bty = "n", cex = c(1, 0.9))
## 右パネル:|phi_k| の log-x プロット(符号を点種で表現)
y_abs <- abs(phi)
pch_sig <- ifelse(phi > 0, 16, 1)
plot(k_pos, y_abs, log = "x", type = "p", pch = pch_sig, col = 2,
xlab = expression(k),
ylab = expression("|" * phi[k] * "|" == frac(Gamma(k - d),
Gamma(-d) * Gamma(k + 1)) ~ "(abs)"),
main = bquote(AR~coefficients~~phi[k]~~"(sign-coded)"))
lines(k_pos, phi_asymA, lty = 2, lwd = 2, col = 4) # |漸近形|(破線)
legend("topright",
legend = c(expression("|" * phi[k] * "| (positive)"),
expression("|" * phi[k] * "| (negative)"),
expression("|" * phi[k] * "|" %~~% k^{-(d+1)} / "|" * Gamma(-d) * "|")),
pch = c(16, 1, NA), lty = c(NA, NA, 2),
col = c(2, 2, 4), bty = "n", cex = 1, lwd = c(1, 1, 2))
par(op)