Lab3.m

Revision 1 - 5/31/07 at 3:43 pm by e2holmes

Back to revision history for Lab3.m
This file is part of the project Teaching code for State-space models
%Written by Eli Holmes July 2005
%This lab estimates the A2 IUCN Red List criteria: 80,50 or 20% decline in 10 yrs or 3 generations
% or probability of hitting CR, EN, VU criteria in 10 yrs or 3 generations'
%This lab estimates risk metrics assuming that s2s is extraneous variability and that we are 
%interested in modeling the risks of the unobserved x.  
%This lab also focuses on estimating % declines.  That way we don't have to factor in estimation of 
%x(end).  This is straight-forward but time-consuming and thus not ideal in a teaching situation.

%NOTE THIS IS A TEACHING TOOL; NOT CODED FOR REAL RISK ASSESSMENT
%Technical comments regarding the algorithms used are at the bottom of the script

function Lab3()

%Call getdata function to pick a data set
%Set up variables from the data
[data, dataname, datatype] = getdata(-99,20);

%plot diagnostics
diagnosticfig(data,dataname);

%Get the gibbs reps; use reml
load saved_gibbs_reml;
saved_gibbs = saved_gibbs_reml{datatype};
mu = saved_gibbs.mu;
s2p = saved_gibbs.s2p;
s2s = saved_gibbs.s2s;
chisqstat = saved_gibbs.chisqstat;

ansdone = 'N';
fignum = 2;
while(~(strcmp(ansdone,'Y') | strcmp(ansdone,'y')))
   %Get user inputs about what analyses to do
   nelevel = input('Choose 80%, 50% or 20% decline (enter 80, 50 or 20): ');
   nelevel = (100-nelevel)*.01; %change to proportion
   years = input('Choose extinction time horizon: ');
   
   %get the x estimate (x part of cda); remember this is logged
   %need the estimate of the x part of the CDA
   kalman = get_kalman_ests(data);
   Nend = exp(kalman.x(end)); %this is the ML estimate of x(end) from kalman filter
   
   ne=nelevel*Nend;
   nq=Nend;
   
   %Calculate extprob and decprob for each gibbs sample
   %the matlab functions work on vectors so no need to go through each sample one-by-one
   
   %DECPROB extinction prob at end of years      
   %risk.decprob.da is the probability that DA is below below ne at year proj
   risk.decprob.da=(1-normcdf( (log(nq/ne) + mu*years).*((s2p*years).^-0.5) ));
   
   %EXTPROB extinction prob during years
   %risk.extprob.da is based on the diffusion approximation for the DA (i.e. leaving out s2s).
   %it makes sense if the s2s is viewed as extraneous and not reflecting variability in the
   %total population
   tmp=2*log(nq/ne)*abs(mu)./s2p;
   tmp=tmp/700; %this is a trick to get rid of NAs when tmp is big
   tmp(find(tmp<1))=1;
   G = normcdf( (-log(nq/ne) + abs(mu)*years)./sqrt(s2p*years)) +...
      (exp((1./tmp).*(2*log(nq/ne)*abs(mu)./s2p)).*...
      normcdf( (-log(nq/ne) - abs(mu)*years)./sqrt(s2p*years)).^(1./tmp)).^tmp;
   probext = (ne/nq).^(2*mu./s2p);
   probext(mu<0)=1;
   risk.extprob.da = G.*probext;
   risk.everextinct.da = probext;
   
   disp('Getting median time to extinct.  Takes time.');
   %MEDIAN TIME TO EXTINCTION
   yearsvec = 1:100;
   tmp=2*log(nq/ne)*abs(mu)./s2p;
   tmp=tmp/700; %this is a trick to get rid of NAs when tmp is big
   tmp(find(tmp<1))=1;
   tmp=ones(length(yearsvec),1)*tmp;
   G = normcdf( (-log(nq/ne) + yearsvec'*abs(mu))./sqrt(yearsvec'*s2p)) +...
      (exp((1./tmp).*(ones(length(yearsvec),1)*(2*log(nq/ne)*abs(mu)./s2p))).*...
      normcdf( (-log(nq/ne) - yearsvec'*abs(mu))./sqrt(yearsvec'*s2p)).^(1./tmp)).^tmp;
   yearmat = yearsvec'*ones(1,length(mu));
   tmp = yearmat.*(G<.5);
   risk.mediantime.da=max(tmp);
   
   alpha = chi2inv(.95,3); %3 parameters; this is a bit harsh since there are not 3 orthogonal parameters
   [sorted_chi2, sorti] = sort(chisqstat);
   sorted_prob = risk.extprob.da(sorti);
   like_ext = [sorted_prob(1)   max(sorted_prob(find(sorted_chi2
Sculpin 0.2 | xhtml | problems or comments? | report bugs