remltrend.m

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

Back to revision history for remltrend.m
This file is part of the project Teaching code for State-space models
function [muR,SEmuR,PvR,SvR] = remltrend( data )
% [muR,SEmuR,PvR,SvR] = remltrend( data )
%  function to estimate trend and Process variance using methods
%  presented in Staples et al
%
%  NOTE:  this function calls optimize.m function by Staples et al.
%  
%  muR, SEmuR, PvR, SvR are trend, standard error of trend,
%  process variance, non-process variance estimates
%  from Staples et al method
%
%  if either PvR or SvR are equal to 1.0000e-005, these are boundary
%    estimates for the parameters;  see Staples et al
%
%  data is a column vector of population estimates!!

    [years,rdata]=size(data);

%  w is vector of log differeces in population size
    w = log(data(2:years)) - log(data(1:years-1));
    [wr wc]= size(w);
    
    % construct initial estimates of V - cov matrix for w
    %  using method of moments
    sig1hat = var(w);
    covw = cov(w(2:wr),w(1:wr-1));
    sig2hat = covw(1,2);
    sigs = [sig1hat;sig2hat];
    V_hat = diag(sig1hat*ones(wr,1)) + diag(sig2hat*ones(wr-1,1),1)...
        + diag(sig2hat*ones(wr-1,1),-1);
    
    
    %  generate U matrix such that U'*X = 0 
    %  This annhilates fixed effect (mean) for REML estimation
    U = diag(-ones(wr,1)) + diag(ones(wr-1,1),-1);
    U = U(:,1:wr-1);
    
    % create time-series (z) with fixed mean annhilated
    z = U'*w;
    [zr zc]=size(z);
    
    %  conditions for optimization routing -- see MATLAB fmincon function
    %  necessary to restrict the parameter space such that V is invertable
    A = eye(2);
    A(1,1) = -1;
    A(3,:)=[-1 -2];
    A(4,:)=[-1 2];
    b = [0;0;-.00001;-.00001];
    
    %  REML procedure
    options = optimset('LargeScale','off','Display','off',...
        'MaxFunEvals',200,'MaxIter',200);
    %fmincon(FUN,XO,A,B,Aeq,Beq,LB,UB,NONLCON, OPTIONS, P1, P2...)
    x = fmincon('optimize',sigs,A,b,[],[],[0;-2*sig1hat],[2*sig1hat;0],[],options,z,U);
    
    %  model matrix
    X = ones(wr,1);
        
    %  REML estimates for variance paramters
    sig1 = x(1);
    sig2 = x(2);
    
    %  estimate of process variance
    k=[1 2];
    PvR = k*x;
    
    %  estimate of sampling variance
    SvR = -sig2;  
    
    %  calculate Variance for trend estimate
    c2 = sig2*ones(wr-1,1);
    V = diag(sig1*ones(wr,1)) + diag(c2,1) + diag(c2,-1);
    iV = inv(V);
    phi = inv(X'*iV*X);  % var(trend estimate)
   
    %   estimate of trend and SE trend
    muR = phi*X'*iV*w ;  
    SEmuR = sqrt(phi);
Sculpin 0.2 | xhtml | problems or comments? | report bugs