Thank you webart999ARM, I had some trouble running the macro code you provided. But, it was very helpful as a starting point and structure to create my own macro version. The macro I made below works for me and allows me to use some of the other postprocessing macros. However, it currently does not allow for options within the macros to be changed without manually changing within the macro code. For example, the ALPHA= option within %postint() would need to be changed directly within the macro. I'm sure it could be more efficient, so please feel free to show me more efficient code. I'm happy to keep the discussion open to hear other ideas. Thanks! Bryan /* Simulate example posterior results from proc bglimm */
data sims_post;
do simulation = 1 to 10;
do iteration = 1 to 1000;
intercept = rand("normal", 4, 1);
random1_vc_1 = rand("normal", 0.10, 0.02);
output;
end;
end;
/* Macro for Bayesian posterior processing with autocall macro.
mac= the name of the autocall macro we want to run (only 1 allowed)
data= name of the dataset that has the posterior data (only 1 allowed)
sim_var= name of the simulation variable (only 1 allowed)
var= name of the parameters within the dataset that we want to run the autocall macro on (multiple allowed)*/
%macro post_by_sim(mac=, data=, sim_var=, var=);
/* Delete previous results table if it exists */
proc datasets nolist;
delete &mac._results;
run;
/* Identify number of simulations */
proc sql noprint;
select count(distinct &sim_var.) into :nsim
from &data.;
quit;
/* Loop over each simulation */
%do i = 1 %to &nsim.;
proc sql noprint;
create table subset as
select simulation,
%sysfunc(tranwrd(%sysfunc(compbl(&var.)),
%bquote( ),
%bquote(,)))
from &data.
where &sim_var. = &i.;
quit;
/* Run selected autocall macro to generate summary stats */
%if %lowcase(&mac.) = %bquote(postsum) %then %do;
%postsum(data = subset, var = &var., print = no,
out = simresults);
%end;
%else %if %lowcase(&mac.) = %bquote(postint) %then %do;
%postint(data = subset, var = &var., print = no,
out = simresults);
%end;
%else %if %lowcase(&mac.) = %bquote(sumint) %then %do;
%sumint(data = subset, var = &var., print = no,
out = simresults);
%end;
%else %if %lowcase(&mac.) = %bquote(ess) %then %do;
%ess(data = subset, var = &var., print = no,
out = simresults);
%end;
%else %if %lowcase(&mac.) = %bquote(geweke) %then %do;
%geweke(data = subset, var = &var., print = no,
out = simresults);
%end;
/* Store the summary stats in a table */
proc append base = &mac._results
data = simresults;
run;
%end;
proc sort data = &mac._results;
by parameter;
run;
proc print data = &mac._results;
by parameter;
run;
%mend;
/* Use the macro to compute posterior summaries by simulation */
%post_by_sim(mac = postsum,
data = sims_post,
sim_var = simulation,
var = intercept random1_vc_1);
%post_by_sim(mac = postint,
data = sims_post,
sim_var = simulation,
var = intercept random1_vc_1);
%post_by_sim(mac = sumint,
data = sims_post,
sim_var = simulation,
var = intercept random1_vc_1);
%post_by_sim(mac = ess,
data = sims_post,
sim_var = simulation,
var = intercept random1_vc_1);
%post_by_sim(mac = geweke,
data = sims_post,
sim_var = simulation,
var = intercept random1_vc_1);
... View more