時系列 x(s) のARモデルによる予測は,以下の式で与えられる。
次のプログラムでは,3つの正弦波に少し正規白色雑音を加えた時系列を例として,まず,その時系列に対してYule-Walker法によるARモデルの推定を行っている。また,そのスペクトルを求めて,Welch法によるFFTスペクトルと比較している。さらに,そのARモデルによる予測を行って,与えられた時系列と予測した時系列がどれほど良く一致するか比較している。
オリジナルのプログラムは, こちらから,ダウンロード
%
% < AR_model identification >
%
Fs = 200; T = 1; N = Fs*T;
t = (0:1/Fs:T-1/Fs);
rn = 0.02*randn(size(t));
%
% ----------------------signal---------------------------
x = sin(2*pi*2*t) + sin(2*pi*10*t) + sin(2*pi*25*t) + rn;
% -------------FFT spectrum (Welch's method)-------------
[Pxx,f] = psd(x,256,Fs,hanning(256),128,'none');
% -------------------------------------------------------
%
% AR model estimation
%
M = 4; % order of AR model <---かえてみよう
[a,e] = aryule(x,M); % Yule-Walker method
% e: variance of prediction error
% [a,e] = arburg(x,M); % Burg method
Pxx_ar = e*abs(freqz(1,a,N/2,Fs)).^2; % spectrum (AR model)
f_ar = (0:1/T:Fs/2-1/T);
%
subplot(311);plot(f,10*log10(Pxx),'-b',f_ar,10*log10(Pxx_ar),':r');
legend('Pxx (FFT spectrum)','Pxx (AR spectrum)')
ylabel('Magnitude (dB)'); xlabel('Frequency (Hz)');
%
% prediction by the AR model
%
y = zeros(1,N);
a(1) = [];
for I=M+1:N
for J=1:M
y(I)=y(I)-a(J)*x(I-J);
end
end
% ------------------------------
xest = y(M+1:N);
t(1:M) = [];
x(1:M) = [];
subplot(312);plot(t,x,'-b',t,xest,':r');ylabel('Amplitude')
axis([0,T,-3,3]);legend('x (obserbed)','x (predicted)')
subplot(313);plot(t,x-xest);
axis([0,T,-0.5,0.5]);legend('x-xest')
ylabel('Prediction Error'); xlabel('Time (sec)');
% ------------------------------
まず実行してみて,このプログラムの内容をよく理解してください。
さて,モデルの次数はどれぐらいが良いでしょうか?
最適なARモデル,つまり最適な次数をどのように決定したらよいであろうか?
次数Mを大きくすれば,予測誤差の分散σ^2は,どんどん小さくなっていく。だからといって,Mは大きいほど良いと考えるのは正しくない。なぜなら,我々は,観測された時系列,つまりあるメカニズムから確率的に生起された1つの標本 x(s) に対してモデルのあてはめを行っているにすぎない。たまたまそのときのノイズの現れ方まで正確に表現できるようにと,無用に大きな次数にすると,そのメカニズムから生成された別の標本に対しては,かえって予測が悪くなってしまうのである。(つまり我々は得られた時系列を説明するモデルが必要なのではなく,その時系列を生成するメカニズムのモデルが欲しいのだ!)
最適なモデル次数を選択する基準のひとつにAIC(Akaike's Information Criterion)がある。M次ARモデルに対するAICは,次式で計算することができ,この値が小さいものほど良いモデルと見なせる。(AICの理論的な詳細については,テキスト8章を各自勉強してください。)
上の例題プログラムを,AICを計算して最適次数Mが決定できるように変更しなさい。もちろん,その最適モデルにおけるスペクトルや時系列予測の状況は,元のプログラムと同様に図示されるようにすること。
作成したプログラムとスペクトルや時系列予測の図を印刷して,来週の授業時間までに提出してください。
Yule-Walker法によるARモデルのあてはめは,MATLABでは,単に
a=aryule(x,M)
とするだけで済んでしまう。しかし,京大生なら,どういう計算を行っているのか理解しておこう。演習の前に少し解説する予定です。 まず,Yule-Walker法は,基本的に以下ような計算を行っている。
r = xcorr(x,'biased'); % autocorrelation R(-N+1) 〜 R(-1),R(0) 〜 R(N-1)
つまり,自己共分散関数('biased':データの無いところを0と見なして計算する自己共分散関数の推定値で,準正定値性をもつ)を求め,行列の形に書くと以下のようになる
r(1:length(x)-1) = []; % R(0) 〜 R(N-1)
ay2 = levinson(r,M)
Yule-Walker方程式をその係数行列のToeplitz性をいかしたLevinsonのアルゴリズムによって解くのである。
同じことは,次のような計算(最小二乗型一般逆行列)によっても実現できる。
Cfull = convmtx(x,M) ; % convolution matrix of x
つまり,われわれは,つぎの観測方程式がおおよそ満足されるようにAR係数を定めたいのである。
G = Cfull;
d = [x([2:N]);zeros(M,1)]; % add M zeros to (N+1)th through (N+M)th row
a = G\d; % generalized inverse : inv(G'*G)*(G'*d)
ay1 = [1 -a']
観測データの無いところは0として,この方程式を最小二乗法的に解くのが上に示したコードであり,それがすなわちYule-Walker方程式を解くことと同じになる。
Yule-Walker方程式を効率よく解く方法であるLevinson-Durbinのアルゴリズムを書き下せば,以下のようになる。講義で解説したことをMATLABで書くと,こんなコードになるのですが,理解できますか? Levinson-Durbinのアルゴリズムの詳しい解説はこちら
% Levinson-Durbin algorithm
%
var = r(1); % initial var: variance of prediction error ; R(0)
ref = [1]; % ref: reflection coefficients (-AR coefficients)
cor = [r(1)]; % cor: autocorrelation vector ; R(0)
for k = 1:M % iteration
ref = [ref;0]; % add a zero element to ref vector
cor = [cor;r(k+1)]; % add a element R(k) to cor vector
am = (ref'*flipud(cor)) / var; % PARCOR coefficient
ref = ref - am*flipud(ref); % new ref
var = var*(1-am^2); % new var
end
ay3 = ref'
%