%Kalman Lab 1 demonstrates the kalman filter step by step for a simple CDA
%User inputs parameter values for the CDA
%Written by E. E. Holmes (eli.holmes@noaa.gov)
function kalman_lab1()
%get some data
[data, dataname] = getdata;
h=figure(1); %this will be a 4x1 plot
clf %clear figure
set(h,'Position',[676 131 668 768]);
%next for lines are to properly deal with missing data so that kalman filter knows they are missing
tmp = data;
tmp(data==-99) = 1;
y = log(tmp);
y(data==-99) = -99;
t = 1:length(data);
for (j = 1:3) %make plots with user input params 3x
subplot(4,1,j)
%get some user inputs
disp(' ');
disp(['Panel ' num2str(j)]);
mu = input('input mu: ');
s2 = input('input process error (not 0): ');
s2np = input('input non-process error (not 0): ');
initx = y(1); %for the purpose of this lab, init x set at y(1), but normally one minimizes for this
V1 = .01;
%These are the params set by the user; this defines a CDA
userparams = [mu log(s2) log(s2np) y(1)];
%now the kalman filter is used to fit this CDA to the data; gives the ML estimate of true values
%kalman_loglik gets passed
%userparams = CDA params; y = data; V1 = init var initx; 2 = yes plot
negloglik = kalman_loglik(userparams, y, V1,2 );
title(['CDA params = ' num2str([mu s2 s2np]) '; -log L = ' num2str(negloglik)]);
legend('ML fit');
if(j==2) ylabel('log data'); end
end
%for the last plot show the fit with the parameters that minimize the fit
subplot(4,1,4)
%set up reasonable starting values for the search
Nratios = data(2:end)./data(1:(end-1));
Nratios = Nratios( Nratios > 0 );
Nratios = log(Nratios);
muinit = mean(Nratios);
sigma2init = 0.5 * var(Nratios);
sigma2npinit = 0.5 * var(Nratios);
myopt=optimset('Display','off');
%fminsearch finds the parameters, a, that minimize the negative loglikelihood
initvals = [muinit log(max(0.0001,sigma2init)) log(max(0.0001,sigma2npinit)) y(1)]; %where to start the search
a=fminsearch('kalman_loglik', initvals ,myopt,y, V1, 0 );
%get the negloglik for the ML parameters; plot it
negloglik = kalman_loglik( a,y,V1, 2);
title(['MLE CDA params = ' num2str([a(1) exp(a(2)) exp(a(3))]) '; -log L = ' num2str(negloglik)]);
legend('Fit with ML parameters');
h=xlabel(dataname);
set(h,'FontSize',16);