My LinkedIn Profile

Saturday, 13 July 2019

Creating Bandplot using SAS GTL



DATA _usedata(DROP=i);
LENGTH taketype $45.;

DO study='A';
DO trtn=1,2,3,4;
DO i=1 TO 7;
visit=i;
minutes=i*142;
DO taketype='OFF-time','ON-time with troublesome dyskinesia','ON-time with non-troublesome dyskinesia','ON-time without dyskinesia';
lsmean=INT(RANUNI(0)*100);
OUTPUT;
lsmean=INT(RANUNI(0)*1000);
OUTPUT;
END;
END;
END;
END;
LABEL trtn="Treatment";
RUN;

PROC SQL NOPRINT;
CREATE TABLE usedata AS
SELECT study,trtn,visit,minutes,taketype,lsmean
FROM _usedata
ORDER BY trtn,visit,taketype;
QUIT;

PROC UNIVARIATE DATA=usedata NOPRINT;
by trtn visit taketype;
var lsmean;
output out=uni_data MEAN=pr_mean std=pr_std;
run;

PROC SORT DATA=uni_data;
BY trtn visit taketype;
RUN;

PROC SQL NOPRINT;
SELECT COUNT(distinct trtn)
INTO:tottrt SEPARATED BY ' '
FROM usedata;
QUIT;

DATA data2use;
SET uni_data;
BY trtn;
ARRAY pr_mean_all[&tottrt.] 3.;
ARRAY pr_yerrup2[&tottrt.] 3.;
ARRAY pr_yerrlow1[&tottrt.] 3.;

visit0 = visit;
visit = visit + 0.026 * (trtn) - 0.026;
pr_mean_all[trtn] = pr_mean;
IF pr_std NE . THEN pr_yerrlow1[trtn] = pr_mean - pr_std;
IF pr_std NE . THEN pr_yerrup2[trtn] = pr_mean + pr_std;
IF pr_yerrlow1[trtn] NE . THEN pr_yerrorlow=pr_yerrlow1[trtn];
IF pr_yerrup2[trtn] NE . THEN pr_yerrorup=pr_yerrup2[trtn];
RUN;

PROC SQL NOPRINT;
SELECT DISTINCT visit
INTO:xtick SEPARATED BY ' '
FROM usedata;
QUIT;

PROC SQL NOPRINT;
CREATE TABLE visitdata AS
SELECT DISTINCT visit,COMPBL("Visit "||PUT(visit,2.)) AS visittxt
FROM usedata;

UPDATE visitdata
SET visittxt='Baseline'
WHERE visit=1;
QUIT;

PROC SORT DATA=visitdata (KEEP=visit visittxt)
OUT=visitdataout(label="[FORMAT] List of Values") NODUPKEY;
BY visit;
RUN;

DATA visitdata2 (label="[FORMAT] Convert to proc format");
LENGTH label $50 fmtname $8.;
SET visitdataout;
fmtname="visitf";
type="N";
start=visit;
label=left(visittxt);
coun=_N_;
RUN;

PROC SORT DATA=visitdata2;
BY fmtname start;
RUN;

PROC FORMAT LIB=work CNTLIN=visitdata2;
QUIT;

libname zahir "";
*User defined macro variables for graph setup;
%LET gpath=.;
%LET imagename=visitmean;
%LET pdfname=visitmean;
%LET libname=zahir;

*Graphics Environment setup;
GOPTIONS NOSYMBOL RESET=all GUNIT=CM HTITLE=0.4 HTEXT=0.4 COLORS=(BLACK RED GREEN BLUE) NOROTATE;
GOPTIONS DEVICE=PNG300;

ODS PATH work.templat(UPDATE) sasuser.templat(UPDATE) sashelp.tmplmst(READ);
ODS PATH (PREPEND) work.templat(UPDATE);
ODS PATH SHOW;

*Modify template style which will be use in graph;
PROC TEMPLATE;
define Style GraphAreaStyle;
parent = styles.statistical;
style GraphFonts from GraphFonts
"Fonts used in graph styles" /
'GraphTitleFont' = (", ",12pt,bold)
'GraphFootnoteFont' = (", ",8pt)
'GraphLabelFont' = (", ",8pt,bold)
'GraphValueFont' = (", ",7pt)
'GraphDataFont' = (", ",7pt);
END;
RUN;

ODS GRAPHICS ON /RESET=all IMAGENAME="&imagename." IMAGEFMT=PNG IMAGEMAP=ON
BORDER=OFF ANTIALIAS=ON ;

ODS LISTING GPATH="&gpath." STYLE=styles.Statistical;

%MACRO lattice(xvalue=,lmupper=,lmlower=,trtnm=,yaxislbl=);
layout lattice / BORDER=true;
column2headers;
entry "&trtnm." / textattrs=(weight=bold size=14);
endcolumn2headers;
ROWHEADERS;
entry "&yaxislbl." / ROTATE=90 textattrs=(weight=bold);
ENDROWHEADERS;

LAYOUT overlay /PAD=(right=5px) xaxisopts=(display=(line ticks tickvalues) type=linear
linearopts=(tickvaluefitpolicy=thin tickvaluelist=(&xtick.)
tickvalueformat=visitf. )) cycleattrs=true
yaxisopts=(display=(line ticks tickvalues)
linearopts=(viewmin=0 viewmax=1020 TICKVALUESEQUENCE=(START=0 END=1020 INCREMENT=60)));
bandplot x=&xvalue. limitupper=&lmupper.
limitlower=&lmlower. / group=taketype
name="band1" modelname="fit";

ENDLAYOUT;
endlayout;
%MEND lattice;

TITLE1 FONT=HWPSL011 HEIGHT=1 JUSTIFY=CENTER "Band plot" ;
ODS GRAPHICS ON /RESET IMAGENAME="&imagename." IMAGEFMT=PNG IMAGEMAP=ON BORDER=OFF ANTIALIAS=ON;
PROC TEMPLATE;
DEFINE statgraph bpdesign;
BEGINGRAPH / attrpriority=Color designwidth=1100 designheight=800;
LAYOUT LATTICE /ROWS=2 BORDER=true ROWDATARANGE=UNION rowweights=(.95 .05) SKIPEMPTYCELLS=false;
COLUMNHEADERS;
DISCRETELEGEND "band1" / ORDER=ROWMAJOR ACROSS=4
LOCATION=inside VALIGN=bottom HALIGN=center BORDER=false DISPLAYCLIPPED=true ;
ENDCOLUMNHEADERS;

LAYOUT lattice / COLUMNS=2 COLUMNDATARANGE=UNION;
%lattice(xvalue=visit,lmupper=pr_yerrup21,lmlower=pr_yerrlow11,trtnm=Treatment X,yaxislbl=Minutes);
%lattice(xvalue=visit,lmupper=pr_yerrup22,lmlower=pr_yerrlow12,trtnm=Treatment Y,yaxislbl=Minutes);
%lattice(xvalue=visit,lmupper=pr_yerrup23,lmlower=pr_yerrlow13,trtnm=Treatment Z,yaxislbl=Minutes);
%lattice(xvalue=visit,lmupper=pr_yerrup24,lmlower=pr_yerrlow14,trtnm=Treatment W,yaxislbl=Minutes);
ENDLAYOUT;
ENDLAYOUT;
ENDGRAPH;
END;
RUN;

PROC SGRENDER DATA=data2use TEMPLATE=bpdesign;
RUN;
TITLE1;

GOPTIONS IBACK="&gpath.\&imagename..png" IMAGESTYLE=fit;

PROC GSLIDE GOUT=&libname..&imagename.;
RUN;
QUIT;

*Modify rtf style if necessary;
PROC TEMPLATE;
define style styles.rtf1;
parent=styles.rtf;
style systemtitle from systemtitle /
just=center
foreground=red;
end;
RUN;

OPTIONS ORIENTATION=LANDSCAPE PAPERSIZE=A4;
GOPTIONS DISPLAY GSFMODE=REPLACE;
ODS LISTING CLOSE;

ODS RTF FILE="&gpath./&pdfname..rtf" STYLE=rtf1 AUTHOR="Zahir";
PROC GREPLAY NOFS IGOUT=&libname..&imagename.;
REPLAY _last_;
QUIT;
ODS RTF CLOSE;
ODS LISTING;

No comments: