⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 coda.m

📁 计量工具箱
💻 M
字号:
function result = coda(draws,vnames,info,fid)% PURPOSE: MCMC convergence diagnostics, modeled after Splus coda% ------------------------------------------------------% USAGE:              coda(draws,vnames,info,fid)%        or: result = coda(draws)% where: draws = a matrix of MCMC draws (ndraws x nvars)%       vnames = (optional) string vector of variable names (nvar x 1)%         info = (optional) structure setting input values%       info.q = Raftery quantile           (default = 0.025) %       info.r = Raftery level of precision (default = 0.01)%       info.s = Raferty probability for r  (default = 0.950)%       info.p1 = 1st % of sample for Geweke chi-sqr test (default = 0.2)%       info.p2 = 2nd % of sample for Geweke chi-sqr test (default = 0.5)%           fid = file id for printing to a file, e.g. fid = fopen('cout','w');% ------------------------------------------------------% NOTES: you may supply only some of the info-structure arguments%        the remaining ones will take on default values% ------------------------------------------------------ % RETURNS: output to command window if nargout = 0%          autocorrelation estimates%          Rafterty-Lewis MCMC diagnostics%          Geweke NSE, RNE estimates%          Geweke chi-sqr prob on means from info.p1 vs info.p2%          a results structure if nargout = 1%          result.ndraw    = # of draws%          result.nvar     = # of variables%          result.p1       = p1 input argument (or default)%          result.p2       = p2 input argument (or default)%          result.q        = Raftery q-value%          result.r        = Raftery r-value%          result.s        = Raftery s-value%          result(i).pmean = posterior mean for variable i%          result(i).pstd  = posterior std deviation%          result(i).nse   = nse assuming no serial correlation for variable i%          result(i).rne   = rne assuming no serial correlation for variable i%          result(i).nse1  = nse using 4% autocovariance tapered estimate%          result(i).rne1  = rne using 4% autocovariance taper%          result(i).nse2  = nse using 8% autocovariance taper%          result(i).rne2  = rne using 8% autocovariance taper%          result(i).nse3  = nse using 15% autocovariance taper%          result(i).rne3  = rne using 15% autocovariance taper%          result(i).nburn = number of draws required for burn-in%          result(i).nprec = number of draws required to achieve r precision%          result(i).kthin = skip parameter for 1st-order Markov chain%          result(i).irl   = I-statistic from Raftery and Lewis (1992)%          result(i).kind  = skip parameter sufficient to get independence chain%          result(i).nmin  = # draws if the chain is white noise%          result(i).n     = nburn + nprec%          result(i).auto1 = autocorrelation at lag 1%          result(i).auto5 = autocorrelation at lag 5%          result(i).auto10= autocorrelation at lag 10%          result(i).auto50= autocorrelation at lag 50%% -------------------------------------------------------% SEE ALSO: gmoment, apm, raftery% -------------------------------------------------------% REFERENCES: Geweke (1992), `Evaluating the accuracy of sampling-based% approaches to the calculation of posterior moments', in J.O. Berger,% J.M. Bernardo, A.P. Dawid, and A.F.M. Smith (eds.) Proceedings of% the Fourth Valencia International Meeting on Bayesian Statistics,% pp. 169-194, Oxford University Press% Also: `Using simulation methods for Bayesian econometric models: % Inference, development and communication', at: www.econ.umn.edu/~bacc% Best, N.G., M.K. Cowles, and S.K. Vines (1995)  CODA: Manual% version 0.30. Biostatistics Unit, Cambridge U.K. http://www.mrc-bsu.cam.ac.uk% -----------------------------------------------------------------% written by:% James P. LeSage, Dept of Economics% University of Toledo% 2801 W. Bancroft St,% Toledo, OH 43606% jpl@jpl.econ.utoledo.edunum_draws = length(draws);if num_draws < 500error('coda: at least 500 draws are required');end;if nargout == 1 % don't print, return a structure    pflag = 1;else    pflag = 0; % print to the command windowend;if nargin == 4    if ~isstruct(info)        error('coda: must supply options as a structure');    end;nflag = 0; [vsize junk] = size(vnames); % user may supply a blank vnames argument   if vsize > 0   nflag = 1; % we have variable names            end;fields = fieldnames(info);nf = length(fields);q = 0.025; r = 0.01; s = 0.95;p1 = 0.2; p2 = 0.5;for i=1:nf    if strcmp(fields{i},'q')        q = info.q;    elseif strcmp(fields{i},'r')        r = info.r;    elseif strcmp(fields{i},'s')        s = info.s;    elseif strcmp(fields{i},'p1')        p1 = info.p1;    elseif strcmp(fields{i},'p2');        p2 = info.p2;    end;end;elseif nargin == 3    if ~isstruct(info)        error('coda: must supply options as a structure');    end;nflag = 0; [vsize junk] = size(vnames); % user may supply a blank vnames argument   if vsize > 0   nflag = 1; % we have variable names            end;fields = fieldnames(info);nf = length(fields);q = 0.025; r = 0.01; s = 0.95;p1 = 0.2; p2 = 0.5;fid = 1;for i=1:nf    if strcmp(fields{i},'q')        q = info.q;    elseif strcmp(fields{i},'r')        r = info.r;    elseif strcmp(fields{i},'s')        s = info.s;    elseif strcmp(fields{i},'p1')        p1 = info.p1;    elseif strcmp(fields{i},'p2');        p2 = info.p2;    end;end;elseif nargin == 2nflag = 1; % we have variable namesq = 0.025; r = 0.01; s = 0.95; % set default valuesp1 = 0.2; p2 = 0.5;fid = 1;elseif nargin == 1 nflag = 0; % no variable namesq = 0.025; r = 0.01; s = 0.95; % set default valuesp1 = 0.2; p2 = 0.5;fid = 1;    else    error('Wrong # of arguments to coda');end;result.q = q;result.r = r;result.s = s;[ndraw nvar] = size(draws);if nflag == 0 % no variable names make some upVname = [];  for i=1:nvar    Vname{i} = str2mat(['variable ',num2str(i)]);  end;elseif (nflag == 1) % the user supplied variable namesVname = [];[tst_n nsize] = size(vnames); if tst_n ~= nvar error('Wrong # of variable names in coda -- check vnames argument'); end; nmax = min(nsize,16); % truncate vnames to 16-characters for i=1:nvar Vname{i} = vnames(i,1:nmax); end;end; % end of nflag issue% =======> do SACF diagnosticsnlag = 50;aout = zeros(50,nvar);for i=1:nvar;aout(:,i) = sacf(draws(:,i),nlag,1);end;% pull out sacf's at 1,5,10,50aprt = zeros(nvar,4);aprt(:,1) = aout(1,:)';aprt(:,2) = aout(5,:)';aprt(:,3) = aout(10,:)';aprt(:,4) = aout(50,:)';% ========> do Raftery-Lewis diagnosticsrafout =  raftery(draws,q,r,s);rout = zeros(nvar,5);for i=1:nvar;  rout(i,1) = rafout(i).kthin;  rout(i,2) = rafout(i).nburn;  rout(i,3) = rafout(i).n;  rout(i,4) = rafout(i).nmin;  rout(i,5) = rafout(i).irl;end;% =========> do Geweke diagnosticsgeweke = momentg(draws);% =========> split sample into 1st p1 percent and last p2 percent%            and run Geweke chi-squared testresult(1).p1 = p1;result(1).p2 = p2;nobs1 = round(p1*ndraw);nobs2 = round(p2*ndraw);draws1 = draws(1:nobs1,:);draws2 = trimr(draws,nobs2,0);res1 = momentg(draws1);res2 = momentg(draws2);resapm = apm(res1,res2);if pflag == 0 % print results to command window% =======> print SACF diagnostics    fprintf(1,'MCMC CONVERGENCE diagnostics \n');fprintf(1,'Based on sample size = %10d \n',ndraw);fprintf(1,'Autocorrelations within each parameter chain \n');vstring = 'Variable';lstring1 = 'Lag 1';lstring2 = 'Lag 5';lstring3 = 'Lag 10';lstring4 = 'Lag 50';cnames = strvcat(lstring1,lstring2,lstring3,lstring4);rnames = vstring;for i=1:nvarrnames = strvcat(rnames,Vname{i});end;in.fmt = '%12.3f';in.fid = fid;in.cnames = cnames;in.rnames = rnames;mprint(aprt,in);% print results with vnames fprintf(fid,'Raftery-Lewis Diagnostics for each parameter chain \n');fprintf(fid,'(q=%6.4f, r=%8.6f, s=%8.6f)\n',q,r,s);cstring1 = 'Thin';cstring2 = 'Burn';cstring3 = 'Total(N)';cstring4 = '(Nmin)';cstring5 = 'I-stat';cnames = strvcat(cstring1,cstring2,cstring3,cstring4,cstring5);in2.fmt = strvcat('%10d','%10d','%10d','%10d','%10.3f');in2.cnames = cnames;in2.fid = fid;in2.rnames = rnames;mprint(rout,in2);% =========> print Geweke diagnosticsfprintf(fid,'Geweke Diagnostics for each parameter chain \n');cs1 = 'Mean';cs2 = 'std dev';cs3 = 'NSE iid';cs4 = 'RNE iid';cnames = strvcat(cs1,cs2,cs3,cs4);in3.fmt = '%12.6f';gout = zeros(nvar,4);for i=1:nvar    gout(i,:) = [geweke(i).pmean geweke(i).pstd geweke(i).nse geweke(i).rne];end;in3.cnames = cnames;in3.rnames = rnames;in3.fid = fid;mprint(gout,in3);cs1 = 'NSE 4% ';cs2 = 'RNE 4% ';cs3 = 'NSE 8% ';cs4 = 'RNE 8% ';cs5 = 'NSE 15%';cs6 = 'RNE 15%';cnames = strvcat(cs1,cs2,cs3,cs4,cs5,cs6);gout2 = zeros(nvar,6);for i=1:nvar    gout2(i,:) = [geweke(i).nse1 geweke(i).rne1 geweke(i).nse2 geweke(i).rne2 ...                 geweke(i).nse3 geweke(i).rne3];end;in4.cnames = cnames;in4.fid = fid;in4.fmt = '%12.6f';in4.rnames = rnames;mprint(gout2,in4);% =========> print Geweke chi-squared testsc = '%';% print results with vnames fprintf(1,'Geweke Chi-squared test for each parameter chain \n');fprintf(1,'First %2.0f%s versus Last %2.0f%s of the sample \n',100*p1,c,100*p2,c);clear in;in.cnames = strvcat('Mean','N.S.E.','Chi-sq Prob');in.rnames = strvcat('NSE estimate','i.i.d.','4% taper','8% taper','15% taper');in.fmt = '%12.6f';in.fid = fid;for i=1:nvar  fprintf(1,'Variable %16s\n', strjust(Vname{i},'right'));gout3 = zeros(4,3); for k=1:4    gout3(k,1) = resapm(i).pmean(k);    gout3(k,2) = resapm(i).nse(k);    gout3(k,3) = resapm(i).prob(k); end; mprint(gout3,in);end;    end; % end of if pflag == 0if pflag == 1 % return results structureresult(1).nvar = nvar;result(1).meth = 'coda';result(1).ndraw = ndraw;for i=1:nvar;  result(i).kthin = rafout(i).kthin;  result(i).nburn = rafout(i).nburn;  result(i).n = rafout(i).n;  result(i).nmin = rafout(i).nmin;  result(i).irl = rafout(i).irl;end;for i=1:nvar  for j=1:4;    if j == 1    result(i).auto1 = aprt(i,j);    elseif j == 2    result(i).auto5 = aprt(i,j);    elseif j == 3    result(i).auto10 = aprt(i,j);    elseif j == 4    result(i).auto50 = aprt(i,j);    end;  end;end;for i=1:nvar  result(i).nse1 = geweke(i).nse1;  result(i).rne1 = geweke(i).rne1;  result(i).nse2 = geweke(i).nse2;  result(i).rne2 = geweke(i).rne2;  result(i).nse3 = geweke(i).nse3;  result(i).rne3 = geweke(i).rne3;end;  for i=1:nvar  result(i).pmean = geweke(i).pmean;  result(i).pstd  = geweke(i).pstd;  result(i).nse   = geweke(i).nse;  result(i).rne   = geweke(i).rne;  end;end; % end of if pflag == 1

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -