Our shop does this a lot. If you don't have an indicator variable for each dataset, you will need to create one. Then you can do something like the following (NOTE: This is a different PROC, so look at the various ODS table names for PHREG to get what you want..):
This part generates the by variables and merges them back onto the original dataset:
/*Process anlsdat byvar*/
proc sort data=anlsdatin out=byvars (keep = paramid parameter) nodupkey;
by paramid parameter;
run;
data byvars;
set byvars end=eof;
by paramid parameter;
byvar = _N_;
if eof then call symputx('LastByVar', _N_);
run;
proc sort data=anlsdatin;
by paramid parameter;
run;
data anlsdat;
merge anlsdatin byvars;
by paramid parameter;
run;
This extracts the fit information from the PROC (GLIMMIX here):
%macro runtimes();
%do b=2 %to &LastByVar;
proc sort data=anlsdat (where=(byvar=&b.)) out=anlsdat_&b.;
by byvar paramid parameter grp_no sex animal;
run;
%macro runtests(covtype=, it=);
proc glimmix data=anlsdat_&b. method = laplace;
nloptions maxiter = 5000;
by byvar paramid parameter;
class grp_no sex animal;
model value = grp_no sex grp_no*sex / dist = gamma ddfm=bw;
random grp_no / type = &covtype. subject=animal;
ods output fitstatistics = _rm_fit_&b._&it._1 convergencestatus=_convdat1_&b._&it._1;
run;
data _rm_fit_&b._&it._1;
length covtype $10 value 8 descr $100;
%if %sysfunc(exist(_rm_fit_&b._&it._1)) %then %do; set _rm_fit_&b._&it._1; %end;
covtype = "&covtype.";
Distribution="Gamma";
run;
%mend runtests;/*
%runtests(covtype=CSH, it=1);
%runtests(covtype=CHOL, it=2);
data fit&b.;
set _rm_fit_&b.:;
run;
proc datasets nolist lib=work;
delete _rm_fit_&b.:;
run;
proc sort data=fit&b. out=checkcov&b. (where=(lowcase(descr) = "aicc (smaller is better)" or lowcase(descr) = "aicc (smaller is better)"));
by value;
run;
%let cs = 0;
%let dist = ;
/*
data checkcov&b.;
%if %sysfunc(exist(checkcov&b.)) %then %do;
set checkcov&b.;
%end;
if _N_ = 1 then do;
call symputx('cs', covtype);
call symputx('dist', Distribution);
selected = 1;
end;
run;
*/
%if "&cs" = "0" %then %do;
%let cs = UN(1);
%let dist = Gamma;
%end; %mend runtimes
If you use this, be sure that all the %do loops are closed, as I have edited out some things we would rather keep proprietary.
SteveDenham
... View more