libname MACRO '[]';
option mstored sasmstore=MACRO;
%macro CATE( /* ANALYSIS OF CATEGORICAL VARIABLE */
DESC=1, /* Descriptive parameter (0=no,1=yes) */
ANAL=1, /* Analytical parameter (0=no,1=yes) */
NCAT=, /* Number of categories */
RCAT=1, /* Reference Category */
QVAR=, /* Categorical variable */
TITL=, /* Variable label */
LBL1=, /* Value label for 1st category */
LBL2=, /* Value label for 2nd category */
LBL3=, /* Value label for 3rd category */
LBL4=, /* Value label for 4th category */
LBL5=, /* Value label for 5th category */
LBL6=, /* Value label for 6th category */
LBL7=, /* Value label for 7th category */
LBL8=, /* Value label for 8th category */
LBL9= /* Value label for 9th category */
) /Store;
/* Create a Subset of the data */
data DSET;
set &DSET(Keep=&IDNUM &QVAR &STAT &BASELIN &SUBSET);
where (&SUBSET=1);
/* Generate Dummy variables for Logistic regression */
/* Associate labels */
QVAR1=(&QVAR=&RCAT);
%do i=2 %to &NCAT;
QVAR&i=(&QVAR=&i); label QVAR&i="&LBL&i";
%end;
QVAR&RCAT=(&QVAR=1);
label QVAR&RCAT="&LBL1";
VALID=(&QVAR^=. and &QVAR>0 and &QVAR<=&NCAT);
label VALID="Valid &TITL";
run;
/* Define value labels using the procedure Format */
proc format;
value LBL_lbl %do i = 1 %to &NCAT;
&i="&LBL&i"
%end; ;
value CC_lbl 1='Case' 2='Control';
run;
title1
"=================================================================
================================================================="
;
title2 ">>> &TITL <<< &STUDY &SYSDAY &SYSDATE, &SYSTIME ";
title3
"=================================================================
================================================================="
;
title4 ">>> Selection &SUBTITL <<< ";
/* Descriptive parameter set to 1 */
%if &DESC = 1 %then %do;
title5 ">>> Tabulation <<<";
proc tabulate data=DSET noseps missing format=7.0;
keylabel N='Count' PCTN='Percent';
format &STAT CC_lbl. &QVAR LBL_lbl.;
class &STAT &QVAR;
table (&QVAR),(ALL &STAT*(N PCTN<&QVAR>*F=8.2))/rts=36;
run;
title5 ">>> Possible abnormal values ?... <<<";
proc print data=DSET noobs;
var &IDNUM &QVAR;
where ((&QVAR ^=. and &QVAR <1) or &QVAR > &NCAT);
run;
%end;
/* Analytical parameter set to 1 */
%if &ANAL = 1 %then %do;
title5 ">>> Logistic regression (categorical variable) <<<";
title6 ">>> Reference group : &&LBL&RCAT <<<";
proc logistic data=DSET;
freq VALID;
model &STAT= %do i=2 %to &NCAT;
QVAR&i
%end;
&BASELIN /rl;
run;
%end;
title1;title2;title3;title4;title5;title6;
%mend CATE;
%macro CONT( /* ANALYSIS OF CONTINUOUS VARIABLES */
DESC=1, /* Descriptive parameter (0=no,1=yes) */
ANAL=1, /* Analytical parameter (0=no,1=yes) */
NCAT=3, /* Number of Categories */
CVAR=, /* Continuous variable */
TITL= /* Variable label */
) /Store ;
/* Create a subset of the data, define value labels */
data DSET;
set &DSET(Keep=&IDNUM &CVAR &STAT &BASELIN &SUBSET);
where (&SUBSET=1);
ELIG=(&CVAR^=.);
run;
proc format;
value CC_lbl 1='Case' 2='Control';
run;
title1
"=================================================================
================================================================="
;
title2 ">>> &TITL <<< &STUDY &SYSDAY &SYSDATE, &SYSTIME ";
title3
"=================================================================
================================================================="
;
title4 ">>> Selection &SUBTITL <<< ";
/* Descriptive-parameter set to 1 */
%if &DESC = 1 %then %do;
title5 ">>> Univariate procedure <<<";
proc sort data=DSET;
by &STAT;
run;
proc univariate Data=DSET plot;
var &CVAR;
format &STAT CC_lbl.;
by &STAT;
run;
proc univariate data=DSET noprint;
var &CVAR;
output out=TMP mean=MExx std=STxx;
run;
data WORK;
if _n_=1 then set TMP;
set DSET;
run;
title5 ">>> Possible abnormal small values ?... <<<";
proc print data=WORK noobs;
var &IDNUM &CVAR;
where &CVAR < MExx-3*STxx and &CVAR^=.;
run;
title5 ">>> Possible abnormal large values ?... <<<";
proc print data=WORK noobs;
var &IDNUM &CVAR;
where &CVAR > MExx+3*STxx;
run;
%end;
/* Analytical parameter set to 1 */
%if &ANAL = 1 %then %do;
proc rank data=DSET groups=&NCAT out=RANK;
var &CVAR;
ranks RVAR;
run;
proc univariate data=DSET noprint;
var &CVAR;
output out=CUTP
pctlpts= %do i=1 %to %eval(&NCAT-1);
%eval(&i*100/&NCAT)
%end;
pctlpre=VARC;
run;
title5 ">>> Logistic regression (continuous variable) <<<";
proc logistic data=DSET;
freq ELIG;
model &STAT=&CVAR &BASELIN /rl;
run;
data WORK;
if _n_=1 then set CUTP;
set RANK;
RVAR=RVAR+1;
%do i=2 %to &NCAT;
RVAR&i=(RVAR=&i);
%end;
if RVAR=1 then QVAR="Q1: Less than "||
left(put(VARC%eval(100/&NCAT),8.1));
%do i=2 %to %eval(&NCAT-1);
if RVAR=&i then QVAR="Q&&i: "||
trim(left(put(VARC%eval((&i-1)*100/&NCAT),8.1)))||
" to "||left(PUT(VARC%eval(&i*100/&NCAT),8.1));
%end;
if RVAR=&NCAT then QVAR="Q&&NCAT: "||
trim(left(put(VARC%eval((&NCAT-1)*100/&NCAT),8.1)))||
" or more";
label RVAR = "&TITL (ordinal)"
QVAR = "&TITL"
%do i=2 %to &NCAT;
RVAR&i= "Q&i &TITL"
%end;
;
run;
title5 ">>> Tabulation <<<";
proc tabulate data=WORK noseps missing format=7.0;
keylabel N='Count' PCTN='Percent';
format &STAT CC_lbl.;
class &STAT QVAR;
table QVAR,(ALL &STAT*(N PCTN*F=8.2))/rts=36;
run;
title5 ">>> Logistic regression (ordinal variable) <<<";
proc logistic data=WORK;
freq ELIG;
model &STAT=RVAR &BASELIN /rl;
run;
title5 ">>> Logistic regression (categorical variable) <<<";
proc logistic data=WORK;
freq ELIG;
model &STAT=%do i=2 %to &NCAT;
RVAR&i
%end;
&BASELIN /rl;
run;
%end;
title1;title2;title3;title4;title5;
%mend CONT;