%This version of Kalman is latest as of July 2005 %It corrects for missing values %It estimates the initx %Written by E. E. Holmes (eli.holmes@noaa.gov) function kalman=get_kalman_ests(data) %data is a row vector of raw counts %here I use Dennis et al. method to get some reasonable init values for mu and sigma2 dennis_ests = get_dennis_ests(data); muinit = dennis_ests.mu; sigma2init = 0.5 * dennis_ests.s2p; sigma2npinit = 0.5 * dennis_ests.s2p; myopt=optimset('Display','off'); %deal with 0s by adding +1 if(ismember(0,data)) data=data+1; end data(data==-98) = -99; %need to adjust for having added +1 to the -99s %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; initvals = [muinit log(max(0.0001,sigma2init)) log(max(0.0001,sigma2npinit)) y(1)]; V1 = .001; %generic small seems to work ok a=fminsearch('kalman_loglik_initx_free', initvals ,myopt,y,V1,0); %0 is a flag to say don't plot kalman.mu=a(1); kalman.s2p=exp(a(2)); kalman.s2s=exp(a(3)); kalman.initx=a(4); %x is true N estimate [kalman.negloglik kalman.x]= kalman_loglik_initx_free( a,y, V1, 0 ); %0 is just a flag to say don't plot