Processing math: 100%
 

MATLABで『時系列解析入門』4章


非専門家が書いています. 十分に批判的に読んで頂くようお願いいたします. 間違い・疑問点などあれば, ぜひコンタクトフォームへ連絡いただけると幸いです.

最尤法によるコーシー分布のパラメータの推定

最尤法を用いて, コーシー分布に対するパラメータ推定を行う. データは, 以下の10点 ( yn,n=1,2,,10 ) .

MATLAB
  1. d = [-1.10 -0.40 -0.20 -0.02 0.02 0.71 1.35 1.46 1.74 3.89]';

コーシー分布のPDFとこのデータに対する尤度, 対数尤度 ( 定数項除く ) は,

f(yμ,τ2)=1πτ(yμ)2τ2L(μ,τ2)=10n=11πτ(ynμ)2τ2(μ,τ2)=10log(τ)10n=1log{(ynμ)2τ2}

最適化は, 今回メインテーマではないので, Optimization Toolboxで楽をする.

MATLAB
  1. d = [-1.10 -0.40 -0.20 -0.02 0.02 0.71 1.35 1.46 1.74 3.89]'; % データ
  2. % 対数尤度をデータを含む函数として定義, 最小化問題にするためにマイナスをつけた.   
  3. f = @(x, d) -5*log(x(2)) + sum(log((d - x(1)).^2 + x(2))); 
  4. fun = @(x)f(x, d); % データは定数として無名函数を再定義
  5. options = optimoptions('fminunc','Algorithm','quasi-newton'); % 最適化のオプション, 準ニュートン法を指定
  6. options.Display = 'iter';  % イテレーション毎に情報を出力希望
  7. x0 = [0, 1];  % 初期値
  8. [x, fval, exitflag, output] = fminunc(fun, x0, options);  % 最適化開始
  9.  
  10. % 結果
  11. Iteration Func-count f(x) Step-size optimality
  12. 0 3 7.74278 2.11
  13. 1 9 7.26691 0.186365 0.471
  14. 2 12 7.22646 1 0.29
  15. 3 15 7.19786 1 0.244
  16. 4 18 7.19271 1 0.0627
  17. 5 21 7.19224 1 0.00731
  18. 6 24 7.19224 1 0.000651
  19. 7 27 7.19224 1 4.7e-05
  20. 8 30 7.19224 1 1.97e-06
  21.  
  22. Local minimum found.
  23.  
  24. >> x
  25. x = 0.2675 0.6052

教科書の表4.3と同じ結果となった. パラメータに関する導関数が0となっていることなども本当は確認すべきだろう. また, 最適化パフォーマンスを上げるために導関数やヘシアンをMATLABに陽に与える方法については, コチラ.

太陽黒点数データに最適なBox-Cox変換をAICにより選ぶ

AIC ( 赤池情報量基準 )

AIC=2(ˆθ)+2k
ここで, (ˆθ) は最大対数尤度, k はパラメータ数である.

Box-Cox 変換

Box-Cox 変換は以下の式で与えられる.

zn={λ1(yλn1)(λ0)logyn(λ=0)   
つまり,
  • λ=1 なら逆数,
  • λ=0 なら対数,
  • λ=0.5 なら平方根,
  • λ=1.0 なら現データ,
をとる.

次の図は, 太陽黒点数データのヒストグラム ( 左図 ) , 対数をとったあとのヒストグラム ( 右図 ) である. どちらも, 到底正規分布しているとは言えないが, λ をうまくとってBox-Cox変換すれば正規分布させれそうである.

name
MATLABコード MATLAB
  1. d = sunspot;
  2. t = tiledlayout(1, 2); t.Padding = 'compact'; t.TileSpacing = 'compact';
  3. nexttile
  4. histogram(d)
  5. title('$\lambda = 1.0$','Interpreter','latex')
  6.  
  7. nexttile
  8. histogram(log(d))
  9. title('$\lambda = 0.0$','Interpreter','latex')

注意

いかに, 太陽黒点数の原データ ( 左図 ) と底を10とした対数をとった図 ( 右図 ) を示す. 右図が教科書の図4.4と一致していることから, この教科書では, 底として10を使っているようである. 一方Box-Cox変換で使われている対数の底は e が一般できであるようなので, 以下, Box-Cox変換では e を底とする.

また, 太陽黒点数のデータには0が含まれている ( x軸55くらい, 右図ではNaNとなり表示されていない ) . しかし, 教科書の図4.4では, 底が10の対数で0.1となっている. それに合わせて, 以下でも値が0の点を1.2589 ( =100.1 ) でおきかえた. なお, 0以下の値を含むデータにBox-Cox変換は適用できない.

name

いくつかMATLAB函数を用意する

最大対数尤度を返す函数

データを渡すと, 正規分布にあてはめたときの最尤パラメータ ( ˆμ,^σ2 ) を計算し, そのパラメータのときの対数尤度, つまり最大対数尤度を返す函数.

Likelihood=Nn=1N(μ,σ2)
(ˆμ,^σ2)=N2log2πNlogˆσ12^σ2n=1N(yiˆμ)2

MATLAB
  1. function l = maxLogLikelihood4normal(d)
  2.  
  3. N = length(d);
  4. mu = mean(d);
  5. sigma2 = var(d, 1); % 最尤推定量なのでNでわる!
  6.  
  7. % calc loglilelihood
  8.  
  9. A = -0.5 * N * log(2*pi);
  10. B = -N * log(sqrt(sigma2));
  11. C = -0.5 * sum((d - mu).^2) / sigma2;
  12. l = A + B + C;
  13.  
  14. end

Box-Cox変換を行いAICを返す函数

パラメータ λ とデータを渡すと, Box-Cox変換を行いAIC ( 教科書でいう AICz ) を返す函数.

MATLAB
  1. function [z, AICz] = myBoxcox(d, lambda)
  2.  
  3. if lambda ~= 0
  4. z = (d.^lambda - 1)/lambda;
  5. j = -2 * sum(log(abs(d .^ (lambda-1))));
  6. else
  7. z = log(d);
  8. j = -2 * sum(-log(abs(d)));
  9. end
  10.  
  11. l = maxLogLikelihood4normal(z);
  12. AIC = -2*l +2*2;
  13. AICz = AIC + j;
  14.  
  15. end

λ 選択

λ を-1から1まで0.2刻みで変えて, AICをみてみる.

MATLAB
  1. d = sunspot;
  2. d(d==0) = 10^0.1;
  3.  
  4. lambdas = -1:0.2:1;
  5. aics = zeros(1, length(lambdas));
  6. for I = 1:length(lambdas)
  7. [z, AICz] = myBoxcox(d, lambdas(I));
  8. aics(I) = AICz;
  9. end
  10.  
  11. bar(lambdas, aics)
  12. xlabel('$\lambda$','Interpreter','latex')
  13. ylabel('AIC')
  14. ylim([2000 3000])
  15. xticks(lambdas)
name

教科書と結構違う結果となってしまった. 計算を間違えたかと思って, 実際にBox-Cox変換を行い, ヒストグラムをみてみた. 僕の計算だと λ=0.4 が選ばれて, 教科書では λ=0.2 が選ばれている.

name

λ=0.4 がよいように見える. どういうことなんだ.

一応自分の或るデータでもやってみた. λ=1.5 が選ばれた.

name

原データと, 変換後のデータ, それぞれのヒストグラムを見比べてみる. 正規分布に近づいてるんじゃないですか? でっぱりがめちゃくちゃきになるけど.

name

Yeo–Johnson transformation

Box-Cox変換は正数データにしか適用できなかった. この欠点を修正したYeo–Johnson transformationというものがあるらしい[1].

ψ(λ,x)={{(x+1)λ1}/λ(x0,λ0)log(x+1)(x0,λ=0){(x+1)(2λ)1}/(2λ)(x<0,λ2)log(x+1)(x<0,λ=2)   

主な参考文献


[1] In‐Kwon Yeo, Richard A. Johnson: Biometrika, Volume 87, Issue 4, December 2000, Pages 954–959,

この記事のTOP    BACK    TOP