/*---------------------------------------------------------------------------------- Macro FPMODELS Authors : Carina Ortseifen (carina.ortseifen@urz.uni-heidelberg.de) Version : 4.1 (21.08.03) Subject : Formulation of Proc Steps (Var and Model statements) for FP models Arguments : model N=Normal errors, L=logistic, S=Survival y Response variable x Variable of linear model pref Prefix for generated variables base other covariables m Degree for highest FP strata Name of strata variables Result : One PROC REG step with one VAR and many MODEL statements or many PROC LOGISTIC or PROC PHREG steps each with one MODEL statement Hints : m must be less or equal to 3 Example : * Sample data set test; data test; set test; * data set from XP; l=1; run; ----------------------------------------------------------------------------------*/ %macro fpmodels(model,y,x,pref,base,m,stvars); %local i j k; %if %upcase(&model)=N %then %do; %let procname=REG; %let procopt=SSE OUTSEB; %let modelpar=; %let modelopt=; %end; %else %if %upcase(&model)=L %then %do; %let procname=LOGISTIC; %let procopt=DESCENDING COVOUT; %let modelpar=; %let modelopt=; %end; %else %then %do; %let procname=PHREG; %let procopt=COVOUT; %let modelpar=*&censvar(&censval); %let modelopt= / Ties=&ties; %end; %let globopt=DATA=%str(work._fp) OUTEST=%str(work._fpout) NOPRINT; %let modelsta=MODEL &y&modelpar = &base; %let j=1; %* Counter for m degrees of fp model; %let i=1; %* Counter for n variables; %* Base Model; PROC &procname &globopt &procopt; %if %upcase(&model) = N %then %do; VAR &x %if &m>0 %then &x&pref&i-&x&pref.%eval(&pmax*&m);; %* VAR statement; %end; &modelsta &modelopt; %* MODEL statement; %if %upcase(&model) = S %then %do; STRATA &stvars; %end; %if %upcase(&model) ne N %then %do; RUN;QUIT; DATA work._fpsave; LENGTH _name_ $6; SET work._fpout; RUN; PROC &procname &globopt &procopt; %end; %* beim linearen Modell wird die Anweisung erst am Schlusz ausgefuehrt; &modelsta &x &modelopt; %* MODEL statement; %if %upcase(&model) = S %then %do; STRATA &stvars; %end; %if %upcase(&model) ne N %then %do; RUN;QUIT; %datasave; %if &m > 0 %then %do; PROC &procname &globopt &procopt; %end; %end; %* FP Models; %if (%eval(&m>0)) %then %do; %* Loop for MODEL statement for m=1; %do i=1 %to &pmax; &modelsta &x&pref&i &modelopt; %if %upcase(&model) = S %then %do; STRATA &stvars; %end; %if %upcase(&model) ne N %then %do; RUN;QUIT; %datasave; %if &i < &pmax or &m > 1 %then %do; PROC &procname &globopt &procopt; %end; %end; %end; %end; %if (%eval(&m>1)) %then %do; %* Loop for MODEL statement for m=2; %do i=1 %to &pmax; %do j=&i %to &pmax; %if &j=&i %then &modelsta &x&pref&i &x&pref.%eval(&i+&pmax); %else &modelsta &x&pref&i &x&pref&j; &modelopt; %if %upcase(&model) = S %then %do; STRATA &stvars; %end; %if %upcase(&model) ne N %then %do; RUN;QUIT; %datasave; %if &i<&pmax or &j<&pmax or &m > 2 %then %do; PROC &procname &globopt &procopt; %end; %end; %end; %end; %end; %if (%eval(&m>2)) %then %do; %* Loop for MODEL statement for m=3; %do i=1 %to &pmax; %do j=&i %to &pmax; %do k=&j %to &pmax; %if &k=&j and &j=&i %then &modelsta &x&pref&i &x&pref.%eval(&i+&pmax) &x.%eval(&i+2*&pmax); %else %if &k=&j %then &modelsta &x&pref&i &x&pref&j &x&pref.%eval(&j+&pmax); %else %if &k=&i %then &modelsta &x&pref&i &x&pref&j &x&pref.%eval(&i+&pmax); %else %if &j=&i %then &modelsta &x&pref&i &x&pref&k &x&pref.%eval(&i+&pmax); %else &modelsta &x&pref&i &x&pref&j &x&pref&k; &modelopt; %if %upcase(&model) = S %then %do; STRATA &stvars; %end; %if model ne N %then %do; RUN;QUIT; %datasave; %if &i<&pmax or &j<&pmax or &k<&pmax %then %do; PROC &procname &globopt &procopt; %end; %end; %end; %end; %end; %end; %if %upcase(&model) ne N %then %do; data _fpout; set _fpsave; run; proc datasets nolist; delete _fpsave; run; %end; %mend fpmodels;