カルマン、Matlab、および状態空間モデル

Kuznetsovinは最近、経枈孊の時系列を分析するためのPythonの䜿甚に関する投皿を投皿したした。 蚈量経枈孊の「䞻力補品」がモデルずしお遞ばれたした。これは、おそらく䞀時デヌタの最も䞀般的なモデルの1぀であるARIMAです。 同時に、ARIMAのようなモデルの䞻な欠点は、非定垞シリヌズでの䜜業には適しおいないこずです。 たずえば、トレンドたたは季節性がデヌタに存圚する堎合、数孊的期埅はシリヌズの異なる郚分で異なる意味を持ちたす- それは良くありたせん。 これを回避するために、ARIMAは゜ヌスデヌタを操䜜する぀もりはありたせんが、それらの違いいわゆる「違いを取る」からの違いを䜿甚したす。 すべおうたくいきたすが、ここでは2぀の問題が発生したす-a系列の差を取るこずで重芁な情報を倱う可胜性があり、b系列、デヌタをコンポヌネントコンポヌネントに分解する機䌚が倱われる-傟向、サむクルなど したがっお、この蚘事では、ロシア語の翻蚳である状態空間モデルSSMずいう別の分析方法を玹介したいず思いたす。



ご泚意
この分野の倚くの英語の名前に぀いおは、翻蚳が利甚できないか、翻蚳者によっお異なるか、たずもな瀟䌚でそれを䜿甚するこずはたったく䞍可胜であるかのいずれかです。 したがっお、英語版では倚くの名前が付けられたす。 興味のある方のために、SSMのモデリングに関する最高の本の 1぀。 たた、ロシア語の翻蚳のトピックに関する良い本はほずんどないこずが刀明したした。 オプションずしお-アレクサンダヌ・ツィプラコフの䜜品は 、別の蚘事ずしお出版されおいたすが、実際には非垞に簡略化されたバヌゞョンの本のコピヌです。




それでは始めたしょう。



1.初期デヌタ分析



この郚分は、プロセスの最も重芁な郚分の1぀です。なぜなら、今間違えた堎合、残りの䜜業はすべお時間の無駄になる可胜性があるからです。 前の蚘事で䜿甚したモスクワ地域の倉庫矀の1぀で、商品の出荷に関するデヌタを開きたす。 プロットしたしょう



第䞀に、玄300日のオヌダヌのトレンドずサむクルが明らかにありたす。 チャヌトを閉じたす。 煙を持っお行きたしょう。 来お、もう䞀床開いお、数字そのものを芋おみたしょう。 出荷日は2009幎9月1日の圢匏で瀺されおいるため、Excelで開き、曜日を衚瀺するためにデヌタを[$ -F800] dddd、mmmm dd、yyyyの圢匏に転送するず、通垞、土曜日に出荷の倀がはるかに少なくなりたす週の残りより。 たずえば、チャヌト1に2週間が瀺されおいたす。䞀般的に、ロヌダヌ叔父のVasyaは土曜日の早い時間に家を出おサッカヌを芳戊しおいたす。そのため、7日間の季節性を持぀マむクロサむクルの存圚をさらに考慮する必芁がありたす。 ずころで、前の蚘事のように週間隔にデヌタを転送するのではなく、毎日のデヌタを匕き続き䜿甚したす。



図衚1




2.状態空間モヌド



ここで、最小限の理論、より詳现に、すべおの匏が由来する理由ず堎所を本で読むこずができるか、コメントで答えたす。

ある時系列があるずしたしょう 、この堎合、商品の出荷に関するデヌタ。 前の蚘事でkuznetsovinが正しく指摘したように、デヌタは1の統合次数の次に明らかに非定垞であり、ARIMA手続きでは系列の区別が必芁になりたす。 ただし、Harvey [1993]に埓っおこれを行いたくないので、このシリヌズは芳枬䞍胜なコンポヌネントを含むモデル芳枬䞍胜なコンポヌネントモデルずしお衚珟できるず仮定したす。



どこで -時間tに芳枬された系列。芳枬䞍胜なコンポヌネントで構成されたす傟向 サむクル 季節倉数 この堎合、1週間に盞圓、および゚ラヌ 通垞、ホワむトノむズずしお分垃しおいたす 。



トレンドは、ロヌカルの線圢トレンドのモデルずしお構築するこずにより倚様化できたす。



2はトレンド自䜓であり、3はトレンドスロヌプであり、それぞれに゚ラヌがありたす。 このようなモデルは、ドリフトランダムりォヌクから統合ランダムりォヌクモデルたで、トレンドモデリングに倚くのオプションを提䟛したす。 倚くの蚈量経枈孊者は、2の゚ラヌを陀去しお、滑らかで滑らかなトレンドを取埗し、すべおのランダム゚ラヌをトレンドスロヌプに割り圓おたす。



確率的サむクルは、䞉角関数ずそれらの導関数の合蚈ずしおモデル化されたす



どこで ラゞアンで枬定されるサむクル呚波数を瀺したす それぞれサむクル期間 。 あなたが気分ず䜙分な時間を持っおいる堎合、あなたは呚波数が時間ずずもに倉化するず仮定するこずができたす 、しかし目を閉じお、サむクルが完党に静止しおいるず仮定したす。 枛衰係数は、サむクルが合理的な制限を超えないようにする責任がありたす。 。



そしお最埌に、呚期s = 7の週次マむクロサむクルも、䞉角関数の合蚈に基づいお構築されたす。





珟圚、䞊蚘のすべおの匏を、カルマンフィルタヌに適したいわゆる構造圢匏に敎理する必芁がありたす。

枬定匏は、芳察するデヌタを瀺しおいたす。



および遷移方皋匏-構成する倉数のダむナミクスを説明したす 、しかしそれらは衚瀺されたせんいわゆる非芳枬倉数たたは朜圚倉数





私たちの堎合、方皋匏2-6で定矩された10の朜圚倉数がありたす。





次に、䞊蚘のすべおの匏を行列圢匏に倉換したす。

7の遷移行列





8の朜圚倉数のダむナミクスのこのような匱いマトリックス





すべおの状態のすべおの゚ラヌのベクトル2-6



行列を䜿甚しおダむナミクスの方皋匏8に組み蟌たれおいたす 。



そしお最埌に、8のすべおの゚ラヌず摂動のバリ゚ヌションのマトリックス





3.フィルタヌずカルマンスムヌザヌ



さお、これでカルマンを吞う準備ができたした。 倉数指定の名前ず姓をわずかに倉曎しない限り、フィルタヌアルゎリズムに぀いおは既に耇数回 蚘述しおいたす。 したがっお、非垞に短い時間、玄40分間、理論に぀いおは説明したせん。 だから目に芋える倉数がありたす 、および非衚瀺のセット 、8-14でダむナミクスず構造を考え出し、カルマンフィルタヌを䜿甚しおオりムで蚈算しようずしたす。 朜圚状態は目に芋えないため、モデルはあたり正確ではない可胜性があり、異なる枬定゚ラヌが必ず存圚したす。 䌚うこずはたずありたせんが、芳枬デヌタ1、..、t-1に基づく時間tでの数孊的期埅のみです。 ばら぀きがある 。



初期倀を仮定する アルゎリズムの実装の実際の郚分では、䞊限から倀を蚭定するだけです、カルマンフィルタヌは䞀連の反埩で構成されたす。



どこで -倉動を䌎う1回限りの予枬の゚ラヌ 、 -カルマンゲむンなど。 䞀般的に、理論はアフリカでも同じです-物理孊ずゞオロケヌションの䞡方で。 著者のリク゚ストにより、倉数の指定のみが倉曎されたす。



状態ベクトルの蚈算に加えお、゚ラヌの倉動、サむクル呚波数、サむクル枛衰パラメヌタヌなどの個々のモデルパラメヌタヌを芋぀けるこずにも関心がありたす。 目的のパラメヌタヌのベクトルを次のように呌び出したす 。 次に そしお ガりスに埓っお分垃するず、デヌタのパラメヌタヌの察数尀床関数は次のようになりたす。





以来 そしお 次に、カルマンフィルタヌの結果を䜿甚しお、フィルタヌ゚ラヌに基づいお尀床関数を蚈算できたす。



この関数を最倧化するこずにより、必芁なパラメヌタヌの掚定倀を芋぀けるこずができたす 。 実際には、関数を最小化するこずは垞に容易であるため、22でマむナス蚘号を远加したした。これを最小化したす。



さお、もう䞀぀のwunderwaffeに぀いおのいく぀かの蚀葉-Kalman smootherKalman smoother、[Durbin、J. and Koopman、2003]、これはただHabréで蚀及されおいないようです。 䞀般に、考え方は䌌おおり、カルマンフィルタヌのみが埌続の各倀を蚈算したす 前のデヌタ1..t-1に基づく時刻tで  。 Kalman Smootherは少し読み、すでにすべおのデヌタがあるず仮定しお、明確にするこずを可胜にしたす 時系列党䜓を芋る 、぀たり、簡単な蚀葉で、圌は蚈算したす 。 すでにすべおの芳枬倀があり、将来の掚定倀に関心がない堎合、これはうたく機胜したすが、系列のダむナミクスを構成する朜圚倉数の正確な倀をドレスアップする方が適切です。



カルマン平滑化は逆再垰です。



は、平滑化された状態倀のベクトルです 分散が最小になりたす 。 平滑化再垰は時間t = Nで始たり、ベクトルにれロ倀を蚭定するこずにより逆方向に始たりたす およびその分散 。 予枬゚ラヌ倀 その分散 カルマンゲむン 最初の実行で駆動されるフィルタヌから取埗されたす。



䞀般的に、理論に぀いおは長い間曞くこずができたすが、テストするには手がかゆくなりたす。 それでは、実蚌的な唯物論に移りたしょう。



4.回垰



私はMatlabaの以䞋のプログラムの最適性ず速床のふりをしたせん。私は本圓の溶接工ではありたせん。すべおのコヌドは自分のために曞かれたした。 審矎的ではないが、安䟡で信頌性が高く実甚的。 たた、フィルタヌおよびスムヌゞングのコヌドは、さたざたな初期化オプションなどのために蚘述されおいるため、いくぶん冗長です。 コヌドの䞀郚を捚おようずするず、マトリックスずルヌプでMatlabがクラッシュするこずが避けられなかったため、すべおをそのたたにしおおくこずにしたした。



すべおが次のように機胜したす。

  1. メむンプログラムotgr_ssm.mはデヌタをダりンロヌドし、 ssmopt構造を準備したす。 この構造には、コヌド内のさたざたな堎所に送信される倚くの貎重なメモず重芁な倉数が曞き蟌たれたす。 出荷の最埌の70の倀10週間は、予枬ずの比范のために確保されたす。予枬は、最埌に必ず䜜成されたす。
  2. デヌタは察数尀床関数最倧化ルヌチンにアップロヌドされたす。 埌者の手順は蚈量経枈孊でよく䜿甚されるため、メむンコヌドを散らかさないように、別の関数mle_my.mによっお䞀般的な圢匏ですばやく膝の䞊に曞かれたした。
  3. 求められるパラメヌタヌには状態の分散が含たれるため、それらは厳密に正でなければならず、数倀最適化䞭に垞に取埗されるずは限りたせん。 したがっお、ポヌンをメガネに倉曎するず、すべおの入力分散倀は次のように倉換されたす 、および枛衰係数は範囲で正芏化されたす どうやっお 。 さお、出力では、それらは適切な倀に倉換されたす- バリ゚ヌションず 枛衰係数甚。 倀ssmopt.transは、倉換する必芁があるか1しないか0、どの方向「in」たたは「out」を瀺すかを瀺したす。 これはすべお、別のtransform.m関数で発生したす
  4. mle_my.mは、 kfmy2.mを䜿甚しおカルマンフィルタヌ15-22を実行するオブゞェクト関数f_obj.mを呌び出し、察数尀床関数22の倀を蚈算し、2回起きないようにカルマンスムヌザヌ23 -27 ksmy2.mを䜿甚したす 。 これはすべおmle_my.mに戻り 、関数の最倧倀22に達したかどうかをチェックしたす。 ある堎合は、すべお手順5に進みたす。ない堎合は、手順2〜4を繰り返したす。

    最初のフィルタヌの実行は、次の仮定から始たりたす。 。 倚くの倉数があるので、ここで詊しおみおください。6次元関数のグロヌバルな最倧倀を探しおいるため、倚くの局所的な極倀が可胜です。 良い方法では、察数関数の可胜な倀のグラフを䜜成し、可胜な極倀を芋るこずができたす。
  5. 結果-芋぀かったパラメヌタヌずグラフを衚瀺したす。 同時に、70日間の予枬を蚈算し、 frcst.mを䜿甚しお実際のデヌタず比范したす


実際には、コヌド

otgr_ssm.m
clear all; clc; close all; format long; %------------------- 1. Load and prepare data ------------------------------ load otgruzka.mat; % Structure ssmopt contains several important records used throughout the code ssmopt.frcst=70; % forecast length yend=y(end-ssmopt.frcst+1:end); % saved last observation for the forecast comparison y=y(1:end-ssmopt.frcst); ssmopt.N=length(y); ssmopt.trans=1; % transform estimated parameters to preserve positiveness of variances ssmopt.sv=[5e+8;500;5e+8;5e+8;0.05;0.9]; % starting values ssmopt.mle='f_obj'; % name of the objective function for the maximization ssmopt.sv=transform(ssmopt.sv,'in',ssmopt); ssmopt.filter='kfmy2'; % name of the function computing Kalman Filter ssmopt.smooth='ksmy2'; % name of the function computing Kalman Smoother %------------------- 2. Estimate the model ------------------------------ result=mle_my(y,ssmopt); % call Maximum Likelihood maximization function b=transform(result.b,'out',ssmopt); % transform parameters back % recompute data based on the correct non-transformed parameters ssmopt.trans=0; ssmopt.sv=b; [LH,KF_out,Ksm_out] = feval(ssmopt.mle,b,y, ssmopt); % Recover filtered states series - trend, cycle, and seasonal a_trend=KF_out.Afilt(1,:); a_cycle=KF_out.Afilt(3,:); a_seas=KF_out.Afilt(5,:)+KF_out.Afilt(7,:)+KF_out.Afilt(9,:); y_filt=a_trend+a_cycle+a_seas; % build the estimated filtered series Y % Recover smoothed states series - trend, cycle, and seasonal a_trendsm=Ksm_out.Asm(1,:); a_cyclesm=Ksm_out.Asm(3,:); a_seassm=Ksm_out.Asm(5,:)+Ksm_out.Asm(7,:)+Ksm_out.Asm(9,:); y_smooth=a_trendsm+a_cyclesm+a_seassm; % build the estimated smoothed series Y result=mle_my(y,ssmopt); % find correct Hessian for non-transformed parameters %------------------- 3. Compute estimation statistics ------------------------------ %Find standard errors, and p-values se=sqrt(abs(diag(inv(result.hessian)/ssmopt.N))); % se(b) tstat=b./se; % t-statistics pval=2*(1-tcdf(abs(tstat),ssmopt.N-length(ssmopt.sv))); % p-value % Display output fprintf('Estimated parameters and p-values:\n'); out=[b pval] period=2*pi/b(end-1) % Compute R-squared resid=y-y_filt; % estimation errors SSE=resid*resid'; % Sum of Squared Errors SST=(y-mean(y))*(y-mean(y))'; % Sum of Squares Total R2=1-SSE/SST % R-squared' %------------------- 4. Make Forecast ------------------------------ af0=KF_out.Afilt(:,end-ssmopt.frcst); [yf,af]=frcst(b,y,ssmopt, af0); %------------------- 5. Plot results ------------------------------ %p=ssmopt.N; p=600; t=[1:1:p]; figure(1) plot(t,y(1:p),'k',t,y_filt(1:p),'b',t,y_smooth(1:p),'r--') title('Original, Filtered, and Smoothed data') legend('y(t)','y filtered','y smoothed'); figure(2) plot(t,y(1:p),'k',t,a_trend(1:p),'b',t,a_trendsm(1:p),'r--') title('Original data, Filtered and Smoothed trend') legend('y(t)','Filtered trend','Smoothed trend'); figure(3) plot(t,a_cycle(1:p),'b',t,a_cyclesm(1:p),'r--') title('Filtered and Smoothed cycle') legend('Filtered cycle','Smoothed cycle'); figure(4) % Filtered + smoothed seasonal plot(t,a_seas(1:p),'b',t,a_seassm(1:p),'r--') title('Filtered and Smoothed weekly seasonal') legend('Filtered seasonal','Smoothed seasonal'); t=[1:1:ssmopt.frcst]; figure(5) plot(t,yend,'b',t,yf,'r--') title('Original data and Forecast') legend('Original data','Forecast'); RMSE=sqrt(sum((yend - yf).^2)/ssmopt.frcst) % Root Mean Squared Error
      
      







mle_my.m
 function result_mle=mle_my(y,mleopt); warning off; %---------------- 1. Set-up minimization options ---------------- options=optimset('fminunc'); options=optimset('LargeScale', 'off' , ... 'HessUpdate', 'bfgs' , ... 'LineSearchType', 'quadcubic' , ... 'GradObj' , 'off' , ... 'Display','off' , ... 'MaxIter' , 1000 , ... 'TolX', 1e-12 , ... 'TolFun' , 1e-12, ... 'DerivativeCheck' , 'off' , ... 'Diagnostics' , 'off' , ... 'MaxFunEvals', 1000); %---------------- 2. Run minimization ---------------- [b,fval,exitflag,output,grad,hessian]=fminunc(mleopt.mle,mleopt.sv,options,y,mleopt); warning on; result_mle.b=b; result_mle.fval=fval; result_mle.output=output; result_mle.hessian=hessian;
      
      







f_obj.m
 function [obj,KF_out,Ksm_out]=f_obj_tr(b,y,ssmopt); %---------------- 1. Recover parameters ------------------------------------ b=transform(b,'out',ssmopt); s2_irr=b(1); s2_tr=b(2); s2_cyc=b(3); s2_seas=b(4); freq=b(5); rho=b(6); %---------------- 2. Build the model ------------------------------------ ssmopt.ssmodel.states=10; ssmopt.ssmodel.Z=[1 0 1 0 1 0 1 0 1 0]; T1 = [1 1 0 0; 0 1 0 0; 0 0 rho*cos(freq) rho*sin(freq); 0 0 -rho*sin(freq) rho*cos(freq)]; T2=[cos(2*pi/7) sin(2*pi/7) 0 0 0 0;... -sin(2*pi/7) cos(2*pi/7) 0 0 0 0;... 0 0 cos(4*pi/7) sin(4*pi/7) 0 0;... 0 0 -sin(4*pi/7) cos(4*pi/7) 0 0;... 0 0 0 0 cos(6*pi/7) sin(6*pi/7);... 0 0 0 0 -sin(6*pi/7) cos(6*pi/7)]; ssmopt.ssmodel.T = [T1 zeros(rows(T1),cols(T2));zeros(rows(T2),cols(T1)) T2]; ssmopt.ssmodel.R=eye(10); ssmopt.ssmodel.R(1,1)=0; H=s2_irr; Q=zeros(10,10); Q(2,2)=s2_tr; Q(3,3)=s2_cyc; Q(4,4)=s2_cyc; Q(5,5)=s2_seas; Q(6,6)=s2_seas; Q(7,7)=s2_seas; Q(8,8)=s2_seas; Q(9,9)=s2_seas; Q(10,10)=s2_seas; %---------------- 3. Suggest starting conditions for the states ------------------------ a0=[y(1);0;0;0;0;0;0;0;0;0]; P0=eye(ssmopt.ssmodel.states)*1e+10; %---------------- 4. Run Kalman filter ------------------------ KF_out = feval(ssmopt.filter,y, ssmopt, Q, H, a0, P0); obj=KF_out.LH; %---------------- 5. Run Kalman smoother ------------------------ if nargout>2 ssmopt.ssmodel.num_etas=3; % number of the state variances (required for Kalman smoother) Ksm_out = feval(ssmopt.smooth,KF_out, ssmopt); end
      
      







kfmy2.m
 % Kalman filter % y[t] = Z*alpha[t] + eps, eps ~ N(0,H). % alpha[t] = T*alpha[t-1] + R*eta, eta ~ N(0,Q). % v[t]=y[t]-E(y[t]) = y[t]-Z*a[t] % F[t]=var(v[t]) function KF_out = kfmy_koop(y, ssmopt, Q, H, a, P); N=ssmopt.N; m=ssmopt.ssmodel.states; %---------------- 1. Recover parameters and prepare matrices ---------------- T=ssmopt.ssmodel.T; Z=ssmopt.ssmodel.Z; R=ssmopt.ssmodel.R; KF_out.Vmat=zeros(1,N); KF_out.Fmat=zeros(1,N); KF_out.Afilt=zeros(m,N); KF_out.Pfilt=zeros(m,m,N); KF_out.Kmat=zeros(m,N); KF_out.Lmat=zeros(m,m,N); LHmat=zeros(1,N); if ~isfield(ssmopt,'exactcheck'); ssmopt.exactcheck=1; % set exact filter initialization by default end; %---------------- 2. Set default starting values for a and P , if none provided ---------------- Pinf=eye(m); if nargin < 6 if ssmopt.exactcheck==1 P=zeros(m,m); else P=eye(m)*1000000000; end end if nargin < 5 a=[y(1); zeros(m-1,1)]; end KF_out.Afilt(:,1)= a; KF_out.Pfilt(:,:,1) = P; d=0; %---------------- 3. Exact Filtering ---------------- if ssmopt.exactcheck==1 evals=10; % number of time steps to evaluate until Pinf converges to zero KF_out.exact.F1=zeros(1,evals); KF_out.exact.F2=zeros(1,evals); KF_out.exact.L1=zeros(m,m,evals); KF_out.exact.Pinf=zeros(m,m,evals); KF_out.exact.Pinf(:,:,1)=Pinf; for i=1:evals if sum(sum(Pinf))<1e-20; d=i-1; % time point after which Pinf-->0, and after which we may start regular Kalman filter break; else if sum(Pinf*Z')>0 % Pinf is not singular F1=inv(Z*Pinf*Z'); F2=-F1*(Z*P*Z'+H)*F1; K=T*Pinf*Z'*F1; K1=T*(P*Z'*F1+Pinf*Z'*F2); L=TK*Z; L1=-K1*Z; P=T*Pinf*L1' + T*P*L' + R*Q*R'; Pinf=T*Pinf*L'; else F1=Z*P*Z'+H; F2=F1; K=T*P*Z'/F1; L=TK*Z; L1=L; P=T*P*L' + R*Q*R'; Pinf=T*Pinf*T'; end v=y(i) - Z*a; a=T*a+K*v; %save filtered estimates KF_out.Afilt(:,i+1)=a; KF_out.Pfilt(:,:,i+1)=P; KF_out.Vmat(i)=v; KF_out.Fmat(i)=F1; KF_out.Kmat(:,i)=K; KF_out.Lmat(:,:,i)=L; LHmat(i) = -0.5*(log(2*pi*F1) + v^2/F1); %save exact values for smoother KF_out.exact.F1(i)=F1; KF_out.exact.F2(i)=F2; KF_out.exact.L1(:,:,i)=L1; KF_out.exact.Pinf(:,:,i+1)=Pinf; end end end %---------------- 4. Regular Filtering ---------------- for i=d+1:N v=y(i) - Z*a; f=Z*P*Z' + H; K=T*P*Z'/f; L=TK*Z; a=T*a+K*v; P=T*P*L'+R*Q*R'; if i<N KF_out.Afilt(:,i+1)=a; KF_out.Pfilt(:,:,i+1)=P; end KF_out.Vmat(i)=v; KF_out.Fmat(i)=f; KF_out.Kmat(:,i)=K; KF_out.Lmat(:,:,i)=L; LHmat(i) = -0.5*(log(2*pi*f) + v^2/f); end %---------------- 5. Prepare output ---------------- KF_out.LH=-sum(LHmat); KF_out.Q=Q; KF_out.H=H; KF_out.exact.d=d; end
      
      







ksmy2.m
 function [Ksm_out, Kdism_out] = ksmy2(KF_out, ssmopt); [m,N]=size(KF_out.Afilt); meta=ssmopt.ssmodel.num_etas; %---------------- 1. Recover filtered matrices ---------------- Fmat=KF_out.Fmat; Vmat=KF_out.Vmat; Pfilt=KF_out.Pfilt; Afilt=KF_out.Afilt; Q=KF_out.Q; H=KF_out.H; %---------------- 2. Recover Model structure ---------------- Z=ssmopt.ssmodel.Z; T=ssmopt.ssmodel.T; R=ssmopt.ssmodel.R; Asm=zeros(m,N); Psm=zeros(m,m,N); rmat=zeros(m,N); Nmat=zeros(m,m,N); Eps=zeros(1,N); Eta=zeros(meta,N); Kmat=KF_out.Kmat; Lmat=KF_out.Lmat; if ~isfield(KF_out,'exact'); KF_out.exact.d=0; end d=KF_out.exact.d; if KF_out.exact.d>0 L1=KF_out.exact.L1; F1=KF_out.exact.F1; F2=KF_out.exact.F2; Pinf=KF_out.exact.Pinf; end %---------------- 3. Regular Smoothing for t=N..d+1 observations ---------------- for i=N:-1:d+1 r=Z'/Fmat(i)*Vmat(i) + Lmat(:,:,i)'*rmat(:,i); N=Z'/Fmat(i)*Z + Lmat(:,:,i)'*Nmat(:,:,i)*Lmat(:,:,i); Asm(:,i)=Afilt(:,i) + Pfilt(:,:,i)*r; Psm(:,:,i)=Pfilt(:,:,i)-Pfilt(:,:,i)*N*Pfilt(:,:,i); if i>1 rmat(:,i-1)=r; Nmat(:,:,i-1)=N; end if nargout>1 Eps(i)=H*(1/(Fmat(i))*Vmat(i)-Kmat(:,i)'*rmat(:,i)); Eta(:,i)=Q*R'*rmat(:,i); end end %---------------- 4. Exact Smoothing for t=d..1 observations ---------------- if KF_out.exact.d>0 r1=zeros(m,1); N1=zeros(m,m); N2=zeros(m,m); for i=d:-1:1 if sum(Pinf(:,:,i)*Z')>0 %cond(Pinf)<1e+12 % Pinf is not singular r1=Z'*F1(i)*Vmat(i) + Lmat(:,:,i)'*r1 + L1(:,:,i)'*rmat(:,i); N2=Z'*F2(i)*Z + Lmat(:,:,i)'*N2*Lmat(:,:,i) + Lmat(:,:,i)'*N1*L1(:,:,i) + L1(:,:,i)'*N1*Lmat(:,:,i) + L1(:,:,i)'*Nmat(:,:,i)*L1(:,:,i); N1=Z'*F1(i)*Z + Lmat(:,:,i)'*N1*Lmat(:,:,i) + L1(:,:,i)'*Nmat(:,:,i)*Lmat(:,:,i); r=Lmat(:,:,i)'*r1; N=Lmat(:,:,i)'*Nmat(:,:,i)*Lmat(:,:,i); if nargout>1 Eps(i)=-H*Kmat(:,i)'*rmat(:,i); Eta(:,i)=Q*R'*rmat(:,i); end else % Pinf is singular r1=T'*rmat(:,i); N2=T'*N2*T; N1=T'*N1*Lmat(:,:,i); r=Z'/(Fmat(i))*Vmat(i) + Lmat(:,:,i)'*rmat(:,i); N=Z'/(Fmat(i))*Z + Lmat(:,:,i)'*Nmat(:,:,i)*Lmat(:,:,i); if nargout>1 Eps(i)=H*(1/Fmat(i)*Vmat(i) - Kmat(:,i)'*rmat(:,i)); Eta(:,i)=Q*R'*rmat(:,i); end end if i>1 rmat(:,i-1)=r; Nmat(:,:,i-1)=N; end Asm(:,i)=Afilt(:,i) + Pfilt(:,:,i)*r + Pinf(:,:,i)*r1; Psm(:,:,i)=Pfilt(:,:,i)-Pfilt(:,:,i)*N*Pfilt(:,:,i) - (Pinf(:,:,i)*N1*Pfilt(:,:,i))' - Pinf(:,:,i)*N1*Pfilt(:,:,i) - Pinf(:,:,i)*N2*Pinf(:,:,i); end end %---------------- 5. Prepare output ---------------- Ksm_out.Asm=Asm; Ksm_out.Psm=Psm; Ksm_out.Kmat=Kmat; Ksm_out.Lmat=Lmat; Ksm_out.Nmat=Nmat; Ksm_out.rmat=rmat; Kdism_out.Eps=Eps; Kdism_out.Eta=Eta;
      
      







transform.m
 function b=transform(b,howto,ssmopt); k=length(b); if strcmp(howto,'in') % in-transformation if ssmopt.trans==0 % no transformation b=b; end; if ssmopt.trans==1 % transformation to preserve the positiveness of variances b(1:k-1,:)=log(b(1:k-1,:)); b(k)=log(1/b(k)-1); end; else % out-transformation if ssmopt.trans==0 % no transformation b=b; end; if ssmopt.trans==1 b(1:k-1,:)=exp(b(1:k-1,:)); b(k)=1/(1+exp(b(k))); end; end
      
      







5.結果



芋぀かった評䟡のp倀は括匧内に瀺されおいたす

芳枬された系列の誀差の分散 1.77E + 0090.00
トレンド゚ラヌ分散 348.730.00
サむクル分散 6.07E + 0080.00
季節成分誀差の分散 3.91E + 0060.00
サむクル頻床 3.91E + 0060.00
サむクル期間日数 362.60.00
ルヌプ枛衰係数 0.8910.00
R二乗回垰 0.78


6.チャヌト



わかりやすくするため、グラフは最初の600日間のみ衚瀺され、シリヌズ党䜓ではネタバレの䞋に隠れおいたす。

a。 生、フィルタヌ、および平滑化されたデヌタ



行党䜓








b。 ゜ヌスデヌタ、フィルタヌ凊理された傟向、平滑化された傟向

ご芧のように、カルマンフィルタヌは以前の倀に基づいお傟向を掚枬しようずしおいるため、関係者のラむンに合わせお倉動したすが、デヌタがさらに進む堎所を掚枬しようずしお少し遅れたす。 Kalmanはシリヌズ党䜓をよりスムヌズに「芋る」ため、トレンドはより滑らかで萜ち着いたように芋えたす。



行党䜓








c。 フィルタヌ凊理および平滑化されたルヌプ

結果の衚からわかるように、平均サむクルの長さは玄362日、たたはほが1幎ですだれが驚くでしょう。 たた、朜圚倉数の初期倀をれロに蚭定し、1e + 10のオヌダヌの非垞に倧きな分散を蚭定するため、フィルタヌが最初にどのように調敎を開始し、デヌタを完党に倱うかを芋るこずができたす。 ただし、通垞、フィルタヌをリズムに合わせるには、最初の数回の詊行で十分です。 ずころで、この䜜業では、フィルタヌの正確な初期化正確な初期化を䜿甚したした。これにより、フィルタヌ凊理された倀がデヌタをすばやく取埗できるようになりたす。



行党䜓








d。 フィルタヌ凊理および平滑化された毎週の季節芁因

出荷数は埐々に増加しおおり、毎日のボラティリティは増加しおいたす。



行党䜓








6.予枬



取埗したパラメヌタヌに基づいお、フィルタヌ凊理された状態の最新の倀を䜿甚しお、70日間10週間の予枬を䜜成し、既存のデヌタず比范したす。 䞀般的に、予枬は芋栄えがよく、それが生呜を䞎えるフィルタヌの圹割です。 曜日ごずのボラティリティの掚枬は特に喜ばしいこずです。 構築された予枬の党䜓の長さをよく芋お、想像力を有効にするず、幎間出荷サむクルの䞋で予枬がどのように曲がるかを芋るこずができたす。 予枬が機胜しなかった唯䞀の瞬間は26〜32日です。 しかし、明らかに出荷がほが毎週䜎䞋し、その埌すぐに急激なゞャンプが発生したした。このようなケヌスはシリヌズの最初に䞀床しか発生しなかったため、予枬するこずはほずんど䞍可胜でした。 䞀般的に、萜ちたのは曇りからです。



モデルを比范する堎合、予枬RMSEは1.112e + 005です。



たあ、それだけです。



ご泚意
状態空間モデルは、蚈量経枈孊においお䟡倀のあるものず芋なされるべきではありたせん。 それどころか、それらはより倚くの特定のモデルの䞀般化されたバヌゞョンを衚したす。 たずえば、MA1プロセス



SSM圢匏で簡単に想像できたす。



たたはARMA2,1プロセス



SSM圢匏でパック





関連文献
  • Durbin、J。、およびKoopman、状態空間法によるSJ時系列分析。 オックスフォヌドオックスフォヌド倧孊出版局、2001。
  • Durbin、J。、およびKoopman、SJ「状態空間時系列分析のためのよりシンプルで効率的なシミュレヌション」Biometrika vol。 89、第3号、2002幎。
  • Harvey、AC、およびJaeger、A。「トレンド陀去、定型化された事実およびビゞネスサむクル。」Journal of Applied Econometrics8、1993。
  • Harvey、AC「予枬、構造時系列モデル、およびカルマンフィルタヌ」 ケンブリッゞケンブリッゞ倧孊出版局、1989幎。





All Articles