Mercurial > hg > ltpda
diff m-toolbox/classes/@pest/mcmcPlot.m @ 0:f0afece42f48
Import.
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Wed, 23 Nov 2011 19:22:13 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/m-toolbox/classes/@pest/mcmcPlot.m Wed Nov 23 19:22:13 2011 +0100 @@ -0,0 +1,223 @@ + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% DESCRIPTION: simple tool that plots mcmc pest objects +% +% CALL: mcmcPlot(pest_obj,pl) +% +% Parameters: - pest_obj: pest object +% - pl: plist +% +% example: - mcmcPlot(p,plist('plotmatrix',true,'burnin',5000,'pdfs',true,'chain',[1 2 3 4 5 6])) +% +%<a href="matlab:utils.helper.displayMethodInfo('pest', 'mcmcPlot')">ParametersDescription</a> +% +% Nikos Oct 2011 +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function varargout = mcmcPlot(varargin) + + %%% Check if this is a call for parameters + if utils.helper.isinfocall(varargin{:}) + varargout{1} = getInfo(varargin{3}); + return + end + + import utils.const.* + utils.helper.msg(msg.PROC3, 'running %s/%s', mfilename('class'), mfilename); + + % Collect input variable names + in_names = cell(size(varargin)); + for ii = 1:nargin,in_names{ii} = inputname(ii);end + + % Collect all AOs and plists + [pests, pest_invars] = utils.helper.collect_objects(varargin(:), 'pest', in_names); + pl = utils.helper.collect_objects(varargin(:), 'plist', in_names); + + % Decide on a deep copy or a modify + p = copy(pests, nargout); + + % combine plists + pl = parse(pl, getDefaultPlist()); + BurnIn = find(pl, 'burnin'); + nbins = find(pl, 'nbins'); + paramarray = find(pl, 'chain'); + %colorm = find(pl, 'colormap'); + + if ~all(isa(pests, 'pest')) + error('### mcmcPlot must be only applied to pest objects.'); + end + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + outfigs = []; + N = numel(p); + + if (BurnIn == 1 && ((find(pl, 'plotmatrix')))) + utils.helper.msg(msg.IMPORTANT, sprintf(['The burn-in field is left empty or equal to one. For '... + 'better and more accurate display the burn-in section of the chains should be discarded.'])); + elseif (BurnIn == 1 && ((find(pl, 'pdfs')))) + utils.helper.msg(msg.IMPORTANT, sprintf(['The burn-in field is left empty or equal to one. For '... + 'better and more accurate display the burn-in section of the chains should be discarded.'])); + end + + for numpest=1:N + + % compute PDF + chain=p(numpest).chain(:,2:size(p(numpest).chain,2)); + p(numpest).computePdf(plist('BurnIn',BurnIn,'nbins',nbins)); + + if isempty(paramarray) + % plot chain field (skip 1st column where the Loglikelihood is stored) + outfigs = [outfigs ; figure]; + data = plot(chain); + else + ch = p(numpest).chain(:,paramarray); + outfigs = [outfigs ; figure]; + data = plot(ch); + end + + if (find(pl, 'plotmatrix')); + chn = p(numpest).chain(BurnIn:size(chain,1),2:size(p(numpest).chain,2)); + outfigs = [outfigs ; figure]; + plotmatrix(chn); + end + + if (find(pl, 'results')); + chainn = chain(BurnIn:size(chain,1),:); + utils.helper.msg(msg.IMPORTANT, sprintf('Results:')); + for ii = 1:(size(chainn,2)) + mu = mean(chainn(:,ii)); + sigma = std(chainn(:,ii)); + res = [mu sigma]; + utils.helper.msg(msg.IMPORTANT, sprintf(' %d \t',res)); + end + end + + if (find(pl, 'pdfs')); + outfigs = [outfigs ; figure]; + + if ~(find(pl, 'plotmatrix')) + chn = p.chain(BurnIn:size(p.chain(:,:),1),:); + end + + a=p(numpest).pdf; + a(:,1) = []; + a(:,1) = []; + + for kk =1:size(chn,2) + subplot(2,4,kk) + x = linspace(min(a(:,2*kk-1)),max(a(:,2*kk-1)),10); + h = bar(a(:,2*kk-1),a(:,2*kk)); + hold on; + y=normpdf(x,mean(chn(:,kk)),std(chn(:,kk))); + s=sum(y); + y=y/s; + plot(x,y,'r-','LineWidth',2); + hold off; + + shading interp % Needed to graduate colors + + ch = get(h,'Children'); + fvd = get(ch,'Faces'); + fvcd = get(ch,'FaceVertexCData'); + n = 10; + [zs, izs] = sortrows(a(:,2*kk),1); + k = 128; % Number of colors in color table + colormap(summer(k)); % Expand the previous colormap + shading interp % Needed to graduate colors + for i = 1:n + color = floor(k*i/n); % Interpolate a color index + row = izs(i); % Look up actual row # in data + fvcd(fvd(row,1)) = 1; % Color base vertices 1st index + fvcd(fvd(row,4)) = 1; + fvcd(fvd(row,2)) = color; % Assign top vertices color + fvcd(fvd(row,3)) = color; + end + set(ch,'FaceVertexCData', fvcd); % Apply the vertex coloring + set(ch,'EdgeColor','k') % Give bars black borders + end + + + + end + + + end + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + if nargout == 0 + out = outfigs; + else + error('### mcmcPlot cannot be used as a modifier!'); + end + + % Set outputs + if nargout > 0 + varargout{1} = out; + end + +end + + +%-------------------------------------------------------------------------- +% Get Info Object +%-------------------------------------------------------------------------- +function ii = getInfo(varargin) + if nargin == 1 && strcmpi(varargin{1}, 'None') + sets = {}; + pl = []; + else + sets = {'Default'}; + pl = getDefaultPlist; + end + % Build info object + ii = minfo(mfilename, 'pest', 'ltpda', utils.const.categories.helper, '$Id: computePdf.m,v 1.2 2011/06/06 14:02:12 nikos Exp $', sets, pl); +end + + +%-------------------------------------------------------------------------- +% Get Default Plist +%-------------------------------------------------------------------------- +function plout = getDefaultPlist() +persistent pl; +if exist('pl', 'var')==0 || isempty(pl) + pl = buildplist(); +end +plout = pl; +end + +function pl = buildplist() +pl = plist(); + +p = param({'chain',['Insert an array containing the parameters to plot. If left empty,'... + 'then by default will plot the chains of every parameter. (note: The loglikelihood is stored '... + 'in the first column)']}, paramValue.DOUBLE_VALUE([])); +pl.append(p); + +p = param({'BurnIn',['Number of samples (of the chains) to be discarded for the computation of the PDFs of the parameters. Also used'... + 'for producing the plotmatrix figure.']}, paramValue.DOUBLE_VALUE(1)); +pl.append(p); + +p = param({'nbins','Number of bins of the pdf histogram computed for every parameter (used again for the computation of the PDFs of the parameters)'}, paramValue.DOUBLE_VALUE(10)); +pl.append(p); + +p = param({'plotmatrix','Boolean to determine if a plotmatrix is desired'}, {1, {false,true}, paramValue.OPTIONAL}); +pl.append(p); + +p = param({'pdfs','Boolean to determine if a plot of the PDFs of each parameter is desired'}, {1, {false,true}, paramValue.OPTIONAL}); +pl.append(p); + +%p = param({'colormap','Choose a default matlab colormap for the parameter histogarms.'}, paramValue.DOUBLE_VALUE(summer)); +%pl.append(p); + +p = param({'results',['Set to "true" if a table of the results of the estimated parameters is desired.'... + 'The results are printed on screen in 2 columns: the 1st contains the mean value'.... + 'and the second the sigma. Burn-in field is requiered.']}, {1, {false,true}, paramValue.OPTIONAL}); +pl.append(p); + +end +