R Time Series Analysis 時系列解析(13) スペクトル分析
定常過程の母スペクトル
定常時系列を特徴を把握するための要素として、自己共分散およびそれを基準化した自己相関係数があった。定常過程の自己共分散に対して、次の無限級数を「自己共分散母関数」として定義する。
これをで割り、に(ただし、は周波数)を代入したものは系列のフーリエ変換となっている。(これをの母スペクトルと呼んでいる。) ※フーリエ変換はココがわかりやすいと思った。
つまり、自己共分散は、関数のフーリエ逆変換となっており、
と表せる。
さまざまなモデルの母スペクトル
ここまで登場した様々なモデルに対して、母スペクトルが求められる。まず、線形定常過程をMA(∞)で表現すると、
自己共分散母関数は次のように表せることが知られている(要確認)。
これをで割り、にを代入したものは、のフーリエ変換となっている。
一方、ARMA(p,q)モデルは次のように表せる。
ただし、
これを変形して、
よって、自己共分散系列のフーリエ変換は、
上記に倣えば、様々なモデルの母スペクトルを求められる。
ホワイトノイズの場合、なので、
AR(1)の場合、定常性の条件<1を満たせば、なので、
AR(2)の場合も、定常性の条件を満たせば(特性方程式の解の絶対値が1より小さければ)、
なので、
のように表せる。MA(1)やMA(2)、ARMA(1,1)でも同様。
母スペクトルでわかること
ここによると、「Aのフーリエ変換」とは「Aの周波数成分の分布を与える変換」という意味である(と理解している)。したがって、自己共分散系列のフーリエ変換はその周波数の分解を与えている。
- の値が増加するにつれて、が増加するのであれば、周波数の大きい成分の方が自己共分散系列への影響が大きい
- の値が減少するにつれて、が減少するのであれば、周波数の小さい成分の方が自己共分散系列への影響が大きい
と解釈が出来る。つまり、フーリエ変換の側から見ることで、ある系列の周波数成分の影響を確認することが出来る。
【疑問点】
読んだ本では、時系列そのものではなく、自己共分散系列のフーリエ変換を考察していたが、そもそも興味の対象は時系列そのものであるので、そちらのフーリエ変換を考えるべきだと感じた。わざわざ自己共分散系列について考える必要があるのであろうか。
Rで母スペクトルを描く
Rで母スペクトルの挙動を図示してみる。
#AR(1)モデルの母スペクトル ar1 <- function(sig2,phi) { w <- seq(0,pi,0.005*pi) y <- (sig2/(2*pi))*(1/(1+phi^2-2*phi*cos(w))) ttl <- paste("AR(1) : φ = ",phi) yl <- c(0,max(y)*1.05) plot(w,y,type="l",ylim=yl,main=ttl,axes=FALSE) lbl <- c("0","0.2pi","0.4pi","0.6pi","0.8pi","pi") axis(1,at=seq(0,pi,0.2*pi),label=lbl) axis(2) }
#AR(2)モデルの母スペクトル ar2 <- function(sgi2,phi1,phi2) { w <- seq(0,pi,0.005*pi) y1 <- (1+phi1^2+phi2^2)-2*phi1*(1-phi1)*cos(w) y2 <- -2*phi2*cos(2*w) y <- (sig2/(2*pi))*(1/(y1+y2)) ttl <- paste("AR(2) : φ1 = ",phi1," φ2 = ",phi2) yl <- c(0,max(y)*1.05) plot(w,y,type="l",ylim=yl,main=ttl,axes=FALSE) lbl <- c("0","0.2pi","0.4pi","0.6pi","0.8pi","pi") axis(1,at=seq(0,pi,0.2*pi),label=lbl) axis(2) }
#図示
par(mfrow=c(3,2)) ar1(1.2,0.8) ar1(1.2,0.3) ar1(1.2,-0.5) ar2(1.2,0.5,0.2) ar2(1.2,0.8,0.2) ar2(1.2,0.5,-0.3) par(mfrow=c(1,1))
結果がこれ。
AR(1)では係数φの正負で周波数成分の影響の大きさの傾向が異なることがわかる。また、AR(2)では係数φ1, φ2の絶対値が周波数成分の影響の大きさに影響しているように見える。
Spectrum関数で標本スペクトルを求める
Rには標本時系列[TeX:y]の標本のスペクトルを計算し、グラフに表示するspectrum関数というものがあるとのこと。引数methodの設定がポイント。
- method="pgram"とすると、ペリオドグラムから標本のスペクトルを計算する。
- method="ar"とすると、データにARモデルを当てはめて標本のスペクトルを計算する。(つまりは上記で行った計算プロセス)
ペリオドグラムとは、時系列[TeX:y_k]をフーリエ級数展開
[TeX:y_t = \sum_{k=0}^{[T/2] (a_k \cos \omega_k t + b_k \sin \omega_k t,(t=1,2,\cdots,T),\omega_k = \frac{2 \pi k}{T}]
したときに、各周波数成分[TeX:\omega_{k}]の強さを表すもので、次の通り。
[TeX: \begin{eqnarray}I(\omega_k)=\left\{ \begin{array}{ll}T a_{0}^2 & (k=0) \\ \frac{T}{2} (a_{k}^{2} + b_{k}^{2}) & (k=1,2,\cdots,[(T-1)/2]) \\ T a_{T/2}^{2} & (k = T/2 (When T is even) \\\end{array} \right.\end{eqnarray}]
実際に、サンプルでAR(1), AR(2)の系列を発生させて、そのスペクトルを求めてみる。なお、method="pgram"とした場合、ペリオドグラムは変動が大きいことから、平均移動の一種であるmodified Daniell smoothersで平滑化するためのオプションspansを指定する。(あとで調べよう)
#AR(1) φ=0.8 系列を作る yar108 <- arima.sim(n=100,list(ar=0.8),innov=rnorm(100,sd=1.4)) #AR(2) φ1=0.5,φ2=-0.3系列を作る yar2 <- arima.sim(n=100,list(ar=c(0.5,-0.3)),innov=rnorm(100,sd=1.4)) #spectrum()関数によるグラフを描く。 par(mfrow=c(2,2)) spectrum(yar108,method="pgram") spectrum(yar108,method="pgram",spans=c(5,5)) spectrum(yar108,method="ar") spectrum(yar2,method="pgram",spans=c(5,5)) par(mfrow=c(1,1))
右側の青い線が気になるが、、、そのうち調べよう。