Kaplan-Meier Plot Modification Examples
/****************************************************************/
/* S A S S A M P L E L I B R A R Y */
/* */
/* NAME: KAPLAN */
/* TITLE: Kaplan-Meier Plot Modification Examples */
/* PRODUCT: STAT */
/* SYSTEM: ALL */
/* KEYS: graphics, ods, survival analysis, Kaplan-Meier */
/* PROCS: */
/* DATA: */
/* */
/* SUPPORT: saswfk UPDATE: July 25, 2013 */
/* REF: ods graphics */
/* MISC: */
/* NOTES: */
/****************************************************************/
ods select where=(_path_ ? 'Print' or _path_ ? 'Plot')(persist);
proc template;
delete Stat.Lifetest.Graphics.ProductLimitSurvival /
store=sasuser.templat;
delete Stat.Lifetest.Graphics.ProductLimitSurvival2 /
store=sasuser.templat;
run;
ods graphics on;
proc lifetest data=sashelp.BMT;
time T * Status(0);
strata Group;
run;
proc lifetest data=sashelp.BMT plots=survival;
time T * Status(0);
strata Group;
run;
proc lifetest data=sashelp.BMT plots=survival(strata=individual);
time T * Status(0);
strata Group;
run;
proc lifetest data=sashelp.BMT plots=survival(strata=panel);
time T * Status(0);
strata Group;
run;
proc lifetest data=sashelp.BMT plots=survival(cb=hw test);
time T * Status(0);
strata Group;
run;
proc lifetest data=sashelp.BMT plots=survival(cb=ep test);
time T * Status(0);
strata Group;
run;
proc lifetest data=sashelp.BMT plots=survival(cb=all test);
time T * Status(0);
strata Group;
run;
proc lifetest data=sashelp.BMT plots=survival(cb=hw test atrisk);
time T * Status(0);
strata Group;
run;
proc lifetest data=sashelp.BMT plots=survival(cb=hw test atrisk(maxlen=13));
time T * Status(0);
strata Group;
run;
proc lifetest data=sashelp.BMT
plots=survival(atrisk(maxlen=13 outside(0.15)));
time T * Status(0);
strata Group;
run;
proc lifetest data=sashelp.BMT
plots=survival(atrisk(maxlen=13 outside)=0 to 3000 by 1000);
time T * Status(0);
strata Group;
run;
proc lifetest data=sashelp.BMT plots=survival(atrisk
(atrisktick maxlen=13 outside)=0 500 750 1000 1250 1500 1750 2000 2500);
time T * Status(0);
strata Group;
run;
proc lifetest data=sashelp.BMT plots=survival(atrisk
(atrisktickonly maxlen=13 outside)=0 1250 2500);
time T * Status(0);
strata Group;
run;
proc format;
invalue bmtnum 'AML-Low Risk' = 1 'ALL' = 2 'AML-High Risk' = 3;
value bmtfmt 1 = 'AML-Low Risk' 2 = 'ALL' 3 = 'AML-High Risk';
run;
data BMT(drop=g);
set sashelp.BMT(rename=(group=g));
Group = input(g, bmtnum.);
run;
proc lifetest data=BMT plots=survival(cl test atrisk(maxlen=13));
time T * Status(0);
strata Group / order=internal;
format group bmtfmt.;
run;
proc format;
invalue bmtnum 'ALL' = 1 'AML-Low Risk' = 2 'AML-High Risk' = 3;
value bmtfmt 1 = 'ALL' 2 = 'AML-Low Risk' 3 = 'AML-High Risk';
run;
data BMT(drop=g);
set sashelp.BMT(rename=(group=g));
Group = input(g, bmtnum.);
run;
proc lifetest data=BMT plots=survival(cl test atrisk(maxlen=13));
time T * Status(0);
strata Group / order=internal;
format group bmtfmt.;
run;
proc lifetest data=sashelp.BMT
plots=survival(nocensor test atrisk(maxlen=13));
time T * Status(0);
strata Group;
run;
proc lifetest data=sashelp.BMT
plots=survival(cb=hw failure test atrisk(maxlen=13));
time T * Status(0);
strata Group;
run;
data _null_;
%let url = //support.sas.com/documentation/onlinedoc/stat/ex_code/132;
infile "http:&url/templft.html" device=url;
file 'macros.tmp';
retain pre 0;
input;
if index(_infile_, '</pre>') then pre = 0;
if pre then put _infile_;
if index(_infile_, '<pre>') then pre = 1;
run;
%inc 'macros.tmp' / nosource;
%ProvideSurvivalMacros
%CompileSurvivalTemplates
proc template;
delete Stat.Lifetest.Graphics.ProductLimitSurvival /
store=sasuser.templat;
delete Stat.Lifetest.Graphics.ProductLimitSurvival2 /
store=sasuser.templat;
run;
/*-- Original Macro Variable Definitions ----------------------------------
%let TitleText0 = METHOD " Survival Estimate";
%let TitleText1 = &titletext0 " for " STRATUMID;
%let TitleText2 = &titletext0 "s";
-------------------------------------------------------------------------*/
/* Make the macros and macro */
%ProvideSurvivalMacros /* variables available. */
%let TitleText0 = "Kaplan-Meier Plot"; /* Change the title. */
%let TitleText1 = &titletext0 " for " STRATUMID;
%let TitleText2 = &titletext0;
%CompileSurvivalTemplates /* Compile the templates with */
/* the new title. */
proc lifetest data=sashelp.BMT /* Perform the analysis and make */
plots=survival(cb=hw test); /* the graph. */
time T * Status(0);
strata Group;
run;
%ProvideSurvivalMacros /* Optionally restore the default */
/* macros and macro variables. */
proc template; /* Delete the modified templates. */
delete Stat.Lifetest.Graphics.ProductLimitSurvival / store=sasuser.templat;
delete Stat.Lifetest.Graphics.ProductLimitSurvival2 / store=sasuser.templat;
run;
/*-- Original Macro Variable Definitions ----------------------------------
%let yOptions = label="Survival Probability" shortlabel="Survival"
linearopts=(viewmin=0 viewmax=1
tickvaluelist=(0 .2 .4 .6 .8 1.0));
-------------------------------------------------------------------------*/
%ProvideSurvivalMacros
%let yOptions = label="Survival"
linearopts=(viewmin=0 viewmax=1
tickvaluelist=(0 .25 .5 .75 1));
%CompileSurvivalTemplates
proc lifetest data=sashelp.BMT plots=survival(cb=hw test);
time T * Status(0);
strata Group;
run;
%ProvideSurvivalMacros
%let yOptions = label="Survival"
linearopts=(viewmin=0.2 viewmax=1
tickvaluelist=(0 .2 .4 .6 .8 1.0));
%CompileSurvivalTemplates
proc lifetest data=sashelp.BMT plots=survival(cb=hw test);
time T * Status(0);
strata Group;
run;
%ProvideSurvivalMacros
%let StepOpts = lineattrs=(thickness=2.5);
%CompileSurvivalTemplates
proc lifetest data=sashelp.BMT plots=survival(cb=hw test);
time T * Status(0);
strata Group;
run;
%ProvideSurvivalMacros
%let GraphOpts = DataContrastColors=(green red blue)
DataColors=(green red blue);
%CompileSurvivalTemplates
proc lifetest data=sashelp.BMT
plots=survival(cb=hw test atrisk(outside maxlen=13));
time T * Status(0);
strata Group;
run;
%ProvideSurvivalMacros
%let GraphOpts = attrpriority=none
DataLinePatterns=(ShortDash MediumDash LongDash);
%CompileSurvivalTemplates
proc lifetest data=sashelp.BMT
plots=survival(cb=hw test atrisk(outside maxlen=13));
time T * Status(0);
strata Group;
run;
%ProvideSurvivalMacros
/*-- Original Macro Variable Definitions ----------------------------------
%let TitleText0 = METHOD " Survival Estimate";
%let TitleText1 = &titletext0 " for " STRATUMID;
%let TitleText2 = &titletext0 "s";
%let yOptions = label="Survival Probability"
shortlabel="Survival"
linearopts=(viewmin=0 viewmax=1
tickvaluelist=(0 .2 .4 .6 .8 1.0));
%let xOptions = shortlabel=XNAME
offsetmin=.05
linearopts=(viewmax=MAXTIME tickvaluelist=XTICKVALS
tickvaluefitpolicy=XTICKVALFITPOL);
-------------------------------------------------------------------------*/
%let tatters = textattrs=(size=12pt weight=bold family='arial');
%let TitleText0 = METHOD " Survival Estimate";
%let TitleText1 = &titletext0 " for " STRATUMID / &tatters;
%let TitleText2 = &titletext0 "s" / &tatters;
%let yOptions = label="Survival Probability"
shortlabel="Survival"
labelattrs=(size=10pt weight=bold)
tickvalueattrs=(size=8pt)
linearopts=(viewmin=0 viewmax=1
tickvaluelist=(0 .2 .4 .6 .8 1.0));
%let xOptions = shortlabel=XNAME
offsetmin=.05
labelattrs=(size=10pt weight=bold)
tickvalueattrs=(size=8pt)
linearopts=(viewmax=MAXTIME tickvaluelist=XTICKVALS
tickvaluefitpolicy=XTICKVALFITPOL);
%CompileSurvivalTemplates
proc lifetest data=sashelp.BMT plots=survival(cb=hw test);
time T * Status(0);
strata Group;
run;
%ProvideSurvivalMacros
/*-- Original Macro Variable Definitions ----------------------------------
%let InsetOpts = autoalign=(TOPRIGHT BOTTOMLEFT TOP BOTTOM)
border=true BackgroundColor=GraphWalls:Color Opaque=true;
%let LegendOpts = title=GROUPNAME location=outside;
-------------------------------------------------------------------------*/
%let InsetOpts = autoalign=(BottomRight)
border=true BackgroundColor=GraphWalls:Color Opaque=true;
%let LegendOpts = title=GROUPNAME location=inside across=1 autoalign=(TopRight);
%CompileSurvivalTemplates
proc lifetest data=sashelp.BMT
plots=survival(cb=hw test atrisk(outside maxlen=13));
time T * Status(0);
strata Group;
run;
/*-- Original Macro Variable Definitions ----------------------------------
%let Censored = markerattrs=(symbol=plus);
%let CensorStr = "+ Censored";
-------------------------------------------------------------------------*/
%ProvideSurvivalMacros
%let censored = markerattrs=(symbol=circlefilled size=3px);
%let censorstr = "(*ESC*){Unicode '25cf'x} Censored"
/ textattrs=GraphValueText(family=GraphUnicodeText:FontFamily);
%CompileSurvivalTemplates
proc lifetest data=sashelp.BMT plots=survival(cb=hw atrisk(outside maxlen=13));
time T * Status(0);
strata Group;
run;
%ProvideSurvivalMacros
%macro StmtsTop;
referenceline y=0.5;
%mend;
%CompileSurvivalTemplates
proc lifetest data=sashelp.BMT plots=survival(cb=hw test);
time T * Status(0);
strata Group;
run;
%ProvideSurvivalMacros
%macro pValue;
if (PVALUE < .0001)
entry "Log Rank p " eval (PUT(PVALUE, PVALUE6.4));
else
entry "Log Rank p = " eval (PUT(PVALUE, PVALUE6.4));
endif;
%mend;
%CompileSurvivalTemplates
proc lifetest data=sashelp.BMT plots=survival(cb=hw test);
time T * Status(0);
strata Group;
run;
%ProvideSurvivalMacros
proc template;
delete Stat.Lifetest.Graphics.ProductLimitSurvival /
store=sasuser.templat;
delete Stat.Lifetest.Graphics.ProductLimitSurvival2 /
store=sasuser.templat;
run;
%ProvideSurvivalMacros
%let ntitles = 1;
%macro StmtsBeginGraph;
*
entryfootnote halign=left "Acme Company %sysfunc(date(),worddate.)" /
textattrs=GraphDataText;
entryfootnote halign=left "Acme Company July 25, 2013" /
textattrs=GraphDataText;
%mend;
%CompileSurvivalTemplates
proc lifetest data=sashelp.BMT
plots=survival(cb=hw test);
time T * Status(0);
strata Group;
run;
%ProvideSurvivalMacros
%let TitleText2 = "Kaplan-Meier Plot";
%let LegendOpts = title="+ Censored"
location=inside autoalign=(Bottom);
%let InsetOpts = ;
%macro StmtsBottom;
dynamic %do i = 1 %to 3; StrVal&i NObs&i NEvent&i %end;;
layout gridded / columns=3 border=TRUE autoalign=(TopRight);
entry ""; entry "Event"; entry "Total";
%do i = 1 %to 3;
%let t = / textattrs=GraphData&i;
entry halign=right Strval&i &t; entry NEvent&i &t; entry NObs&i &t;
%end;
endlayout;
%mend;
%CompileSurvivalTemplates
proc lifetest data=sashelp.BMT plots=survival(cb=hw atrisk(outside maxlen=13));
time T * Status(0);
strata Group;
run;
%ProvideSurvivalMacros
%let GraphOpts = DesignHeight=DefaultDesignWidth;
%SurvivalSummaryTable
%CompileSurvivalTemplates
proc lifetest data=sashelp.BMT
plots=survival(cb=hw atrisk(outside maxlen=13));
time T * Status(0);
strata Group;
run;
%ProvideSurvivalMacros
%let GraphOpts = DesignHeight=500px;
%let LegendOpts = ;
%SurvivalSummaryTable
%CompileSurvivalTemplates
proc lifetest data=sashelp.BMT
plots=survival(cb=hw atrisk(maxlen=13));
time T * Status(0);
strata Group;
run;
proc format;
invalue bmtnum 'ALL' = 1 'AML-Low Risk' = 2 'AML-High Risk' = 3;
value bmtfmt 1 = 'ALL' 2 = 'AML-Low Risk' 3 = 'AML-High Risk';
run;
data BMT(drop=g);
set sashelp.BMT(rename=(group=g));
Group = input(g, bmtnum.);
run;
%ProvideSurvivalMacros
%let TitleText2 = "Kaplan-Meier Plot";
%let nTitles = 1;
%let GraphOpts = DesignHeight=500px;
%let LegendOpts = ;
%let InsetOpts = ;
%SurvivalSummaryTable
%CompileSurvivalTemplates
proc lifetest data=BMT plots=survival(cb=hw atrisk(maxlen=13));
time T * Status(0);
strata Group / order=internal;
format group bmtfmt.;
run;
%ProvideSurvivalMacros
proc template;
delete Stat.Lifetest.Graphics.ProductLimitSurvival /
store=sasuser.templat;
delete Stat.Lifetest.Graphics.ProductLimitSurvival2 /
store=sasuser.templat;
run;
*
ods html style=htmlbluecml image_dpi=300;
proc lifetest data=sashelp.BMT
plots=survival(cb=hw test atrisk(outside maxlen=13));
time T * Status(0);
strata Group;
run;
*
ods html close;
proc template;
define style styles.ListingColor;
parent = styles.Listing;
style Graph from Graph / attrpriority = "Color";
end;
run;
*
ods html style=ListingColor image_dpi=300;
proc lifetest data=sashelp.BMT
plots=survival(cb=hw test atrisk(outside maxlen=13));
time T * Status(0);
strata Group;
run;
*
ods html close;
proc template;
source styles.statistical / file='style.tmp';
run;
data colors;
length element Color $ 20;
infile 'style.tmp';
input;
if index(_infile_, 'data') then do;
element = scan(_infile_, 1, ' ');
Color = scan(_infile_, 3, ' ;');
Type = ifc(index(element, 'gc'), 'Line', 'Fill') || ' Colors';
i = input(compress(element, 'gcdat'';'), ?? 2.);
if i then output;
end;
run;
proc sort; by descending type i; run;
proc print; id type; by descending type; var color; run;
data display;
array y[12] y1 - y12;
do i = 1 to 12; y[i] = i; end;
do x = 1 to 10; output; end;
do i = 1 to 12; y[i] = i + .5; end;
do x = 1 to 10; output; end;
run;
data _null_;
set colors;
call symputx(compress(type || put(i, 2.)), color);
run;
proc sgplot noautolegend data=display;
%macro reg;
title 'Line and Fill Colors, Respectively';
%do i = 1 %to 12;
reg y=y%eval(13-&i) x=x / lineattrs=GraphData&i clmattrs=GraphData&i
nomarkers clm curvelabelpos=max
curvelabel=" GraphData&i &&LineColors&i &&FillColors&i";
%end;
%mend;
%reg
xaxis display=none;
yaxis display=none;
run;
title;
%ProvideSurvivalMacros
%let GraphOpts = DataContrastColors=(cx01665E cxA23A2E cx445694)
DataColors=(cx66A5A0 cxD05B5B cx6F7EB3);
%CompileSurvivalTemplates
proc lifetest data=sashelp.BMT
plots=survival(cb=hw test atrisk(outside maxlen=13));
time T * Status(0);
strata Group;
run;
%macro reorder(from, to, list);
proc template;
define style styles.&to;
parent=styles.&from;
%do i = 1 %to 12;
%let s = %scan(&list, &i);
%if &s ne %then %do;
style GraphData&i from GraphData&i /
contrastcolor = GraphColors("gcdata&s")
color = GraphColors("gdata&s");
%end;
%end;
end;
run;
%mend;
%reorder(htmlblue, /* Parent style. */
MyStyle, /* New style to create. Specify it in an ODS */
/* destination statement. */
3 2 1) /* Replace the first few GraphData colors */
/* (1 2 3) with the colors from the specified */
/* GraphData style elements (3 2 1). */
/* You can specify up to 12 integers in the */
/* range 1 - 12. */
*
ods html style=mystyle;
proc lifetest data=sashelp.BMT
plots=survival(cb=hw test atrisk(outside maxlen=13));
time T * Status(0);
strata Group;
run;
*
ods html close;
proc template;
define style Styles.MyStyle;
parent = styles.htmlblue;
style GraphData1 from GraphData1 /
color = GraphColors('gdata3')
contrastcolor = GraphColors('gcdata3');
style GraphData2 from GraphData2 /
color = GraphColors('gdata2')
contrastcolor = GraphColors('gcdata2');
style GraphData3 from GraphData3 /
color = GraphColors('gdata1')
contrastcolor = GraphColors('gcdata1');
end;
run;
proc template;
define style Styles.MyStyle;
parent = styles.htmlblue;
style GraphData1 from GraphData1 /
color = cx66A5A0
contrastcolor = cx01665E;
style GraphData2 from GraphData2 /
color = cxD05B5B
contrastcolor = cxA23A2E;
style GraphData3 from GraphData3 /
color = cx6F7EB3
contrastcolor = cx445694;
end;
run;
proc template;
delete Styles.MyStyle / store=sasuser.templat;
run;
proc template;
source styles.htmlblue / expand file='style.tmp';
run;
data _null_;
infile 'style.tmp' pad;
input line $char80.;
file print;
if index(lowcase(line), ' graphfonts ') then y + 1;
if y then put line $char80.;
if y and index(line, ';') then stop;
run;
proc template;
define style Styles.BigFont;
parent = Styles.HTMLBlue;
style graphfonts from graphfonts /
'GraphLabelFont' = ("<sans-serif>, <MTsans-serif>",12pt,bold)
'GraphValueFont' = ("<sans-serif>, <MTsans-serif>",8pt,bold);
end;
run;
*
ods html style=BigFont;
proc lifetest data=sashelp.BMT plots=survival(maxlen=13 atrisk);
time T * Status(0);
strata Group;
run;
*
ods html close;
proc template;
delete Styles.BigFont / store=sasuser.templat;
run;
proc template;
source styles.htmlblue / expand file='style.tmp';
run;
data _null_;
infile 'style.tmp' pad;
input line $char80.;
file print;
if index(lowcase(line), ' graphdata1 ') then y + 1;
if y then put line $char80.;
if y and index(line, ';') then stop;
run;
proc template;
source styles / file='style.tmp';
run;
data _null_;
infile 'style.tmp' pad;
length style $ 80;
retain style;
input line $char80.;
file print;
if index(lowcase(line), 'define style') then style = line;
if index(lowcase(line), ' graphfonts ') then do;
y + 1;
put style $char80.;
end;
if y then put line $char80.;
if index(line, ';') then y = 0;;
run;
proc template;
delete Stat.Lifetest.Graphics.ProductLimitSurvival /
store=sasuser.templat;
delete Stat.Lifetest.Graphics.ProductLimitSurvival2 /
store=sasuser.templat;
delete Styles.ListingColor / store=sasuser.templat;
run;