Code:
title3 'gm_Mortality_Day90.sas';
proc format;
value $suc 1='aSuccess' 2='bFailure';
value bmi_cat 1='a<30' 2='b30-40' 3='c>40';
value yn10fmt 1='aYes' 0='bNo';
value $yn10fmt 1='aYes' 0='bNo';
value grp 1='aReltec.' 2='bPlacebo';
value censor 1='bNo Death' 0='aDeath';
run;
%macro timevarprint();
data hr2;
set hr;
HR=exp(ESTIMATE);
lb=exp(estimate-1.96*STDERR);
ub=exp(estimate+1.96*STDERR);
run;
title6 "Hazard Ratio Post Day 14";
proc print data=hr2;
run;
%mend;
data at;
set sasdat.effshort;
if group4=1 ;
censor_mort90 = censor; drop censor;
days_mort90 = ttime ; drop ttime;
if days_mort90>90 then do days_mort90=90 ; /*there is an 852*/
censor_mort90=1;
end;
label
nfail='Renal fail'
rfail='Resp. fail'
;
if bmilt30=1 then bmi_cat=1;
if bmige40=1 then bmi_cat=3;
if bmi30lt40=1 then bmi_cat=2;
format bmi_cat bmi_cat. ;
if site in ("01 Limoges", "03 Creteil", "05 Lille", "06 Lyon", "07 Nancy") then french=1;
else french=0;
format french bmige40 bmilt30 CCGANG CKD nfail rfail cfail /*fgang*/ ccgang ccnfasc aki_st3 aki_stg0 bmige40 yn10fmt.
group grp. nicce $suc. censor_mort14 censor_mort28 censor_mort90 censor. fgang $yn10fmt. eff4 eff5 $suc.;
if group=1 then control=0;
if group=2 then control=1;
run;
data modpp;
set at;
if modppexc ne 1;
run;
/****************************************************************/
/* S A S S A M P L E L I B R A R Y */
/* */
/* NAME: TEMPLFT */
/* TITLE: PROC LIFETEST Template */
/* PRODUCT: STAT */
/* SYSTEM: ALL */
/* KEYS: graphics, ods, survival analysis, Kaplan-Meier */
/* PROCS: */
/* DATA: */
/* */
/* SUPPORT: saswfk UPDATE: July 25, 2013 */
/* REF: ods graphics */
/* MISC: */
/* NOTES: This sample provides templates for the PROC */
/* LIFETEST survival plot that are modular and */
/* easier to modify than the default templates. */
/****************************************************************/
%macro ProvideSurvivalMacros;
%global atriskopts bandopts censored censorstr classopts
graphopts groups insetopts legendopts ntitles stepopts tiplabel
tips titletext0 titletext1 titletext2 xoptions yoptions;
%let TitleText0 = METHOD " Survival Estimate";
%let TitleText1 = &titletext0 " for " STRATUMID;
%let TitleText2 = &titletext0 "s"; /* plural: Survival Estimates */
%let nTitles = 2;
%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 Tips = rolename=(_tip1= ATRISK _tip2=EVENT)
tiplabel=(_tip1="Number at Risk" _tip2="Observed Events")
tip=(x y _tip1 _tip2);
%let TipLabel = tiplabel=(y="Survival Probability");
%let StepOpts = ;
%let Groups = group=STRATUM index=STRATUMNUM;
%let BandOpts = displayTail=false &groups modelname="Survival";
%let InsetOpts = autoalign=(TOPRIGHT BOTTOMLEFT TOP BOTTOM)
border=true BackgroundColor=GraphWalls:Color Opaque=true;
%let LegendOpts = title=GROUPNAME location=outside;
%let AtRiskOpts = display=(label) valueattrs=(size=7pt);
%let ClassOpts = class=CLASSATRISK colorgroup=CLASSATRISK;
%let Censored = markerattrs=(symbol=plus);
%let CensorStr = "+ Censored";
%let GraphOpts = ;
%macro StmtsBeginGraph; %mend;
%macro StmtsTop; %mend;
%macro StmtsBottom; %mend;
%macro CompileSurvivalTemplates;
%local outside;
proc template;
%do outside = 0 %to 1;
define statgraph
Stat.Lifetest.Graphics.ProductLimitFailure%scan(2,2-&outside); /*HERE IS CHANGE: ProductLimitSurvival to ProductLimitFailure*/
dynamic NStrata xName plotAtRisk
%if %nrbquote(&censored) ne %then plotCensored;
plotCL plotHW plotEP labelCL labelHW labelEP maxTime xtickVals
xtickValFitPol rowWeights method StratumID classAtRisk
plotTest GroupName Transparency SecondTitle TestName pValue
_byline_ _bytitle_ _byfootnote_;
BeginGraph %if %nrbquote(&graphopts) ne %then / &graphopts;;
if (NSTRATA=1)
%if &ntitles %then %do;
if (EXISTS(STRATUMID)) entrytitle &titletext1;
else entrytitle &titletext0;
endif;
%end;
%if &ntitles gt 1 %then %do;
%if not &outside %then if (PLOTATRISK=1);
entrytitle "With Number of Subjects at Risk" /
textattrs=GRAPHVALUETEXT;
%if not &outside %then %do; endif; %end;
%end;
%StmtsBeginGraph
%AtRiskLatticeStart
layout overlay / xaxisopts=(&xoptions) yaxisopts=(&yoptions);
%StmtsTop
%SingleStratum
%StmtsBottom
endlayout;
%AtRiskLatticeEnd
else
%if &ntitles %then %do; entrytitle &titletext2; %end;
%if &ntitles gt 1 %then %do;
if (EXISTS(SECONDTITLE))
entrytitle SECONDTITLE / textattrs=GRAPHVALUETEXT;
endif;
%end;
%StmtsBeginGraph
%AtRiskLatticeStart
layout overlay / xaxisopts=(&xoptions) yaxisopts=(&yoptions);
%StmtsTop
%MultipleStrata
%StmtsBottom
endlayout;
%AtRiskLatticeEnd(class)
endif;
if (_BYTITLE_) entrytitle _BYLINE_ / textattrs=GRAPHVALUETEXT;
else if (_BYFOOTNOTE_) entryfootnote halign=left _BYLINE_; endif;
endif;
EndGraph;
end;
%end;
run;
%mend;
%macro pValue;
if (PVALUE < .0001)
entry TESTNAME " p " eval (PUT(PVALUE, PVALUE6.4));
else
entry TESTNAME " p=" eval (PUT(PVALUE, PVALUE6.4));
endif;
%mend;
%macro SingleStratum;
if (PLOTHW=1 AND PLOTEP=0)
bandplot LimitUpper=HW_UCL LimitLower=HW_LCL x=TIME /
displayTail=false modelname="Survival" fillattrs=GRAPHCONFIDENCE
name="HW" legendlabel=LABELHW;
endif;
if (PLOTHW=0 AND PLOTEP=1)
bandplot LimitUpper=EP_UCL LimitLower=EP_LCL x=TIME /
displayTail=false modelname="Survival" fillattrs=GRAPHCONFIDENCE
name="EP" legendlabel=LABELEP;
endif;
if (PLOTHW=1 AND PLOTEP=1)
bandplot LimitUpper=HW_UCL LimitLower=HW_LCL x=TIME /
displayTail=false modelname="Survival" fillattrs=GRAPHDATA1
datatransparency=.55 name="HW" legendlabel=LABELHW;
bandplot LimitUpper=EP_UCL LimitLower=EP_LCL x=TIME /
displayTail=false modelname="Survival" fillattrs=GRAPHDATA2
datatransparency=.55 name="EP" legendlabel=LABELEP;
endif;
if (PLOTCL=1)
if (PLOTHW=1 OR PLOTEP=1)
bandplot LimitUpper=SDF_UCL LimitLower=SDF_LCL x=TIME /
displayTail=false modelname="Survival" display=(outline)
outlineattrs=GRAPHPREDICTIONLIMITS name="CL" legendlabel=LABELCL;
else
bandplot LimitUpper=SDF_UCL LimitLower=SDF_LCL x=TIME /
displayTail=false modelname="Survival" fillattrs=GRAPHCONFIDENCE
name="CL" legendlabel=LABELCL;
endif;
endif;
stepplot y=SURVIVAL x=TIME / name="Survival" &tips legendlabel="Survival"
&stepopts;
if (PLOTCENSORED=1)
scatterplot y=CENSORED x=TIME / &censored &tiplabel
name="Censored" legendlabel="Censored";
endif;
if (PLOTCL=1 OR PLOTHW=1 OR PLOTEP=1)
discretelegend "Censored" "CL" "HW" "EP" / location=outside
halign=center;
else
if (PLOTCENSORED=1)
discretelegend "Censored" / location=inside
autoalign=(topright bottomleft);
endif;
endif;
%if not &outside %then %do;
if (PLOTATRISK=1)
innermargin / align=bottom;
axistable x=TATRISK value=ATRISK / &atriskopts;
endinnermargin;
endif;
%end;
%mend;
%macro MultipleStrata;
if (PLOTHW=1)
bandplot LimitUpper=HW_UCL LimitLower=HW_LCL x=TIME / &bandopts
datatransparency=Transparency;
endif;
if (PLOTEP=1)
bandplot LimitUpper=EP_UCL LimitLower=EP_LCL x=TIME / &bandopts
datatransparency=Transparency;
endif;
if (PLOTCL=1)
if (PLOTHW=1 OR PLOTEP=1)
bandplot LimitUpper=SDF_UCL LimitLower=SDF_LCL x=TIME / &bandopts
display=(outline) outlineattrs=(pattern=ShortDash);
else
bandplot LimitUpper=SDF_UCL LimitLower=SDF_LCL x=TIME / &bandopts
datatransparency=Transparency;
endif;
endif;
stepplot y=SURVIVAL x=TIME / &groups name="Survival" &tips &stepopts;
if (PLOTCENSORED=1)
scatterplot y=CENSORED x=TIME / &groups &tiplabel &censored;
endif;
%if not &outside %then %do;
if (PLOTATRISK=1)
innermargin / align=bottom;
axistable x=TATRISK value=ATRISK / &atriskopts &classopts;
endinnermargin;
endif;
%end;
%if %nrbquote(&legendopts) ne %then %do;
DiscreteLegend "Survival" / &legendopts;
%end;
%if %nrbquote(&insetopts) ne %then %do;
if (PLOTCENSORED=1)
if (PLOTTEST=1)
layout gridded / rows=2 &insetopts;
entry &censorstr;
%pValue
endlayout;
else
layout gridded / rows=1 &insetopts;
entry &censorstr;
endlayout;
endif;
else
if (PLOTTEST=1)
layout gridded / rows=1 &insetopts;
%pValue
endlayout;
endif;
endif;
%end;
%mend;
%macro SurvTabHeader(multiple);
%if &multiple %then %do; entry ""; %end;
entry "";
entry "";
entry "";
entry &r "Median";
entry "";
entry "";
%if &multiple %then %do; entry ""; %end;
entry &r "Subjects";
entry &r "Event";
entry &r "Censored";
entry &r "Survival";
entry &r PctMedianConfid;
entry halign=left "CL";
%mend;
%macro SurvivalTable;
%local fmt r i t;
%let fmt = bestd6.;
%let r = halign = right;
columnheaders;
layout overlay / pad=(top=5);
if(NSTRATA=1)
layout gridded / columns=6 border=TRUE;
dynamic PctMedianConfid NObs NEvent Median
LowerMedian UpperMedian;
%SurvTabHeader(0)
entry &r NObs;
entry &r NEvent;
entry &r eval(NObs-NEvent);
entry &r eval(put(Median,&fmt));
entry &r eval(put(LowerMedian,&fmt));
entry &r eval(put(UpperMedian,&fmt));
endlayout;
else
layout gridded / columns=7 border=TRUE;
dynamic PctMedianConfid;
%SurvTabHeader(1)
%do i = 1 %to 10;
%let t = / textattrs=GraphData&i;
dynamic StrVal&i NObs&i NEvent&i Median&i
LowerMedian&i UpperMedian&i;
if (&i <= nstrata)
entry &r StrVal&i &t;
entry &r NObs&i &t;
entry &r NEvent&i &t;
entry &r eval(NObs&i-NEvent&i) &t;
entry &r eval(put(Median&i,&fmt)) &t;
entry &r eval(put(LowerMedian&i,&fmt)) &t;
entry &r eval(put(UpperMedian&i,&fmt)) &t;
endif;
%end;
endlayout;
endif;
endlayout;
endcolumnheaders;
%mend;
%macro SurvivalSummaryTable;
%macro AtRiskLatticeStart;
layout lattice / columndatarange=union rowgutter=10
rows=%if &outside %then 2 rowweights=ROWWEIGHTS;
%else 1;;
%if &outside %then %do; cell; %end;
%mend;
%macro AtRiskLatticeEnd(useclassopts);
%if &outside %then %do;
endcell;
cell;
layout overlay / walldisplay=none xaxisopts=(display=none);
axistable x=TATRISK value=ATRISK / &atriskopts
%if &useclassopts ne %then &classopts;;
endlayout;
endcell;
%end;
%SurvivalTable
endlayout;
%mend;
%mend;
%macro AtRiskLatticeStart;
%if &outside %then %do;
layout lattice / rows=2 rowweights=ROWWEIGHTS
columndatarange=union rowgutter=10;
cell;
%end;
%mend;
%macro AtRiskLatticeEnd(useclassopts);
%if &outside %then %do;
endcell;
cell;
layout overlay / walldisplay=none xaxisopts=(display=none);
axistable x=TATRISK value=ATRISK / &atriskopts
%if &useclassopts ne %then &classopts;;
endlayout;
endcell;
endlayout;
%end;
%mend;
%CompileSurvivalTemplates
%mend;
/*
proc template;
delete Stat.Lifetest.Graphics.ProductLimitSurvival /
store=sasuser.templat;
delete Stat.Lifetest.Graphics.ProductLimitSurvival2 /
store=sasuser.templat;
run;
proc template;
delete Stat.Lifetest.Graphics.ProductLimitFailure /
store=sasuser.templat;
delete Stat.Lifetest.Graphics.ProductLimitFailure2 /
store=sasuser.templat;
run;
*/
*********************************************************************************************;
* PP all days ;
*********************************************************************************************;
filename out1 "&dir&client&project\output\gm_Mortality_Day90 2019-11-16.rtf";
title3 'gm_Mortality_Day90.sas';
ods rtf file=out1;
options pageno=1;
%ProvideSurvivalMacros
%let yOptions = label="Survival Probability" shortlabel="Survival"
linearopts=(viewmin=.75 viewmax=1
tickvaluelist=(.7 .75 .8 .85 .9 .95 1));
* %let yOptions = label="Cumulative Mortality" shortlabel="Mortality"
linearopts=(viewmin=0 viewmax=1
tickvaluelist=(0 .2 .4 .6 .8 1.0));
%let xOptions = shortlabel=XNAME offsetmin=.05
linearopts=(viewmax=MAXTIME tickvaluelist=(0 7 14 21 28 35 42 49 56 63 70 77 84 91)
tickvaluefitpolicy=XTICKVALFITPOL);
%let TitleText2 = "Kaplan-Meier Plot in Per Protocol Analysis Set";
%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=(Top);
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;
%let GraphOpts = DesignHeight=DefaultDesignWidth;
%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;
*%SurvivalSummaryTable;
%CompileSurvivalTemplates
proc format;
value group 1='Relticimod' 2='Placebo';
run;
title4 'Kaplan-Meier Survival to Day 90 in Per Protocol Analysis Set';
proc lifetest data=modPP rmst plots= survival ( test atrisk = 1 to 90 by 7 /*cb=hw*/) timelist = 1,2,3,4,5,6,7,14,21,28,60,90 ;
time days_mort90*censor_mort90(1);
strata group /order=internal;
label group='Dose Group';
label days_mort90='Days to Death or Censor';
format group group.;
run;
/*Need to first edit SAS provided macro changing ProductLimitSurvival to ProductLimitFailure*/
%ProvideSurvivalMacros
*%let yOptions = label="Survival Probability" shortlabel="Survival"
linearopts=(viewmin=.75 viewmax=1
tickvaluelist=(.7 .75 .8 .85 .9 .95 1));
%let yOptions = label="Cumulative Mortality" shortlabel="Mortality"
linearopts=(viewmin=0 viewmax=0.25
tickvaluelist=(0 0.05 0.10 0.15 0.20 0.25));
%let xOptions = shortlabel=XNAME offsetmin=.05
linearopts=(viewmax=MAXTIME tickvaluelist=(0 7 14 21 28 35 42 49 56 63 70 77 84 91)
tickvaluefitpolicy=XTICKVALFITPOL);
%let TitleText2 = "Kaplan-Meier Plot in Per Protocol Analysis Set";
%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=(Top);
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;
%let GraphOpts = DesignHeight=DefaultDesignWidth;
%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;
*%SurvivalSummaryTable;
%CompileSurvivalTemplates
title4 'Kaplan-Meier Cumulative Failure to Day 90 in Per Protocol Analysis Set';
proc lifetest data=modPP rmst plots= survival ( failure test atrisk = 1 to 90 by 7 /*cb=hw*/) timelist = 1,2,3,4,5,6,7,14,21,28,60,90 ;
time days_mort90*censor_mort90(1);
strata group /order=internal;
label group='Dose Group';
label days_mort90='Days to Death or Censor';
format group group.;
run;
ods rtf close;
/***********LOG****************************/
/*RUN after changing to Stat.Lifetest.Graphics.ProductLimitFailure%scan(2,2-&outside);
NOTE: Copyright (c) 2016 by SAS Institute Inc., Cary, NC, USA.
NOTE: SAS (r) Proprietary Software 9.4 (TS1M6)
Licensed to UNIVERSITY OF PENNSYLVANIA - SFA T&R, Site 70080524.
NOTE: This session is executing on the X64_10PRO platform.
NOTE: Analytical products:
SAS/STAT 15.1
SAS/ETS 15.1
SAS/OR 15.1
SAS/IML 15.1
SAS/QC 15.1
NOTE: Additional host information:
X64_10PRO WIN 10.0.17763 Workstation
NOTE: SAS initialization used:
real time 3.12 seconds
cpu time 1.17 seconds
2710
2711 title3 'gm_Mortality_Day90.sas';
2712
2713 proc format;
2714 value $suc 1='aSuccess' 2='bFailure';
NOTE: Format $SUC is already on the library WORK.FORMATS.
NOTE: Format $SUC has been output.
2715 value bmi_cat 1='a<30' 2='b30-40' 3='c>40';
NOTE: Format BMI_CAT is already on the library WORK.FORMATS.
NOTE: Format BMI_CAT has been output.
2716 value yn10fmt 1='aYes' 0='bNo';
NOTE: Format YN10FMT is already on the library WORK.FORMATS.
NOTE: Format YN10FMT has been output.
2717 value $yn10fmt 1='aYes' 0='bNo';
NOTE: Format $YN10FMT is already on the library WORK.FORMATS.
NOTE: Format $YN10FMT has been output.
2718 value grp 1='aReltec.' 2='bPlacebo';
NOTE: Format GRP is already on the library WORK.FORMATS.
NOTE: Format GRP has been output.
2719 value censor 1='bNo Death' 0='aDeath';
NOTE: Format CENSOR is already on the library WORK.FORMATS.
NOTE: Format CENSOR has been output.
2720
2721 run;
NOTE: PROCEDURE FORMAT used (Total process time):
real time 0.01 seconds
cpu time 0.01 seconds
2722
2723 %macro timevarprint();
2724 data hr2;
2725 set hr;
2726 HR=exp(ESTIMATE);
2727 lb=exp(estimate-1.96*STDERR);
2728 ub=exp(estimate+1.96*STDERR);
2729 run;
2730 title6 "Hazard Ratio Post Day 14";
2731 proc print data=hr2;
2732 run;
2733 %mend;
2734
2735
2736
2737
2738 data at;
2739 set sasdat.effshort;
2740 if group4=1 ;
2741
2742 censor_mort90 = censor; drop censor;
2743 days_mort90 = ttime ; drop ttime;
2744
2745 if days_mort90>90 then do days_mort90=90 ; /*there is an 852*/
2746 censor_mort90=1;
2747 end;
2748
2749 label
2750 nfail='Renal fail'
2751 rfail='Resp. fail'
2752 ;
2753
2754 if bmilt30=1 then bmi_cat=1;
2755 if bmige40=1 then bmi_cat=3;
2756 if bmi30lt40=1 then bmi_cat=2;
2757 format bmi_cat bmi_cat. ;
2758
2759 if site in ("01 Limoges", "03 Creteil", "05 Lille", "06 Lyon", "07
2759! Nancy") then french=1;
2760 else french=0;
2761
2762 format french bmige40 bmilt30 CCGANG CKD nfail rfail cfail
2762! /*fgang*/ ccgang ccnfasc aki_st3 aki_stg0 bmige40 yn10fmt.
2763 group grp. nicce $suc. censor_mort14 censor_mort28 censor_mort90
2763! censor. fgang $yn10fmt. eff4 eff5 $suc.;
2764
2765
2766 if group=1 then control=0;
2767 if group=2 then control=1;
2768 run;
NOTE: There were 290 observations read from the data set SASDAT.EFFSHORT.
NOTE: The data set WORK.AT has 290 observations and 928 variables.
NOTE: DATA statement used (Total process time):
real time 0.07 seconds
cpu time 0.04 seconds
2769
2770
2771
2772
2773 data modpp;
2774 set at;
2775 if modppexc ne 1;
2776 run;
NOTE: There were 290 observations read from the data set WORK.AT.
NOTE: The data set WORK.MODPP has 271 observations and 928 variables.
NOTE: DATA statement used (Total process time):
real time 0.03 seconds
cpu time 0.03 seconds
2777
2778
2779
2780
2781 /****************************************************************/
2782 /* S A S S A M P L E L I B R A R Y */
2783 /* */
2784 /* NAME: TEMPLFT */
2785 /* TITLE: PROC LIFETEST Template */
2786 /* PRODUCT: STAT */
2787 /* SYSTEM: ALL */
2788 /* KEYS: graphics, ods, survival analysis, Kaplan-Meier */
2789 /* PROCS: */
2790 /* DATA: */
2791 /* */
2792 /* SUPPORT: saswfk UPDATE: July 25, 2013 */
2793 /* REF: ods graphics */
2794 /* MISC: */
2795 /* NOTES: This sample provides templates for the PROC */
2796 /* LIFETEST survival plot that are modular and */
2797 /* easier to modify than the default templates. */
2798 /****************************************************************/
2799
2800 %macro ProvideSurvivalMacros;
2801
2802 %global atriskopts bandopts censored censorstr classopts
2803 graphopts groups insetopts legendopts ntitles stepopts
2803! tiplabel
2804 tips titletext0 titletext1 titletext2 xoptions yoptions;
2805
2806 %let TitleText0 = METHOD " Survival Estimate";
2807 %let TitleText1 = &titletext0 " for " STRATUMID;
2808 %let TitleText2 = &titletext0 "s"; /* plural: Survival
2808! Estimates */
2809 %let nTitles = 2;
2810
2811
2812 %let yOptions = label="Survival Probability"
2812! shortlabel="Survival"
2813 linearopts=(viewmin=0 viewmax=1
2814 tickvaluelist=(0 .2 .4 .6 .8 1.0));
2815
2816
2817
2818 %let xOptions = shortlabel=XNAME offsetmin=.05
2819 linearopts=(viewmax=MAXTIME
2819! tickvaluelist=XTICKVALS
2820 tickvaluefitpolicy=XTICKVALFITPOL);
2821
2822 %let Tips = rolename=(_tip1= ATRISK _tip2=EVENT)
2823 tiplabel=(_tip1="Number at Risk" _tip2="Observed
2823! Events")
2824 tip=(x y _tip1 _tip2);
2825 %let TipLabel = tiplabel=(y="Survival Probability");
2826 %let StepOpts = ;
2827
2828 %let Groups = group=STRATUM index=STRATUMNUM;
2829
2830 %let BandOpts = displayTail=false &groups modelname="Survival";
2831
2832 %let InsetOpts = autoalign=(TOPRIGHT BOTTOMLEFT TOP BOTTOM)
2833 border=true BackgroundColor=GraphWalls:Color
2833! Opaque=true;
2834 %let LegendOpts = title=GROUPNAME location=outside;
2835
2836 %let AtRiskOpts = display=(label) valueattrs=(size=7pt);
2837 %let ClassOpts = class=CLASSATRISK colorgroup=CLASSATRISK;
2838
2839 %let Censored = markerattrs=(symbol=plus);
2840 %let CensorStr = "+ Censored";
2841
2842 %let GraphOpts = ;
2843
2844 %macro StmtsBeginGraph; %mend;
2845 %macro StmtsTop; %mend;
2846 %macro StmtsBottom; %mend;
2847
2848 %macro CompileSurvivalTemplates;
2849 %local outside;
2850 proc template;
2851 %do outside = 0 %to 1;
2852 define statgraph
2853
2854 Stat.Lifetest.Graphics.ProductLimitFailure%scan(2,2-&ou
2854! tside); /*HERE IS CHANGE: ProductLimitSurvival to
2854! ProductLimitFailure*/
2855 dynamic NStrata xName plotAtRisk
2856 %if %nrbquote(&censored) ne %then plotCensored;
2857 plotCL plotHW plotEP labelCL labelHW labelEP maxTime
2857! xtickVals
2858 xtickValFitPol rowWeights method StratumID
2858! classAtRisk
2859 plotTest GroupName Transparency SecondTitle TestName
2859! pValue
2860 _byline_ _bytitle_ _byfootnote_;
2861 BeginGraph %if %nrbquote(&graphopts) ne %then /
2861! &graphopts;;
2862
2863 if (NSTRATA=1)
2864 %if &ntitles %then %do;
2865 if (EXISTS(STRATUMID)) entrytitle &titletext1;
2866 else entrytitle &titletext0;
2867 endif;
2868 %end;
2869
2870 %if &ntitles gt 1 %then %do;
2871 %if not &outside %then if (PLOTATRISK=1);
2872 entrytitle "With Number of Subjects at Risk" /
2873 textattrs=GRAPHVALUETEXT;
2874 %if not &outside %then %do; endif; %end;
2875 %end;
2876
2877 %StmtsBeginGraph
2878 %AtRiskLatticeStart
2879 layout overlay / xaxisopts=(&xoptions)
2879! yaxisopts=(&yoptions);
2880 %StmtsTop
2881 %SingleStratum
2882 %StmtsBottom
2883 endlayout;
2884 %AtRiskLatticeEnd
2885
2886 else
2887 %if &ntitles %then %do; entrytitle &titletext2; %end
2887! ;
2888 %if &ntitles gt 1 %then %do;
2889 if (EXISTS(SECONDTITLE))
2890 entrytitle SECONDTITLE /
2890! textattrs=GRAPHVALUETEXT;
2891 endif;
2892 %end;
2893
2894 %StmtsBeginGraph
2895 %AtRiskLatticeStart
2896 layout overlay / xaxisopts=(&xoptions)
2896! yaxisopts=(&yoptions);
2897 %StmtsTop
2898 %MultipleStrata
2899 %StmtsBottom
2900 endlayout;
2901 %AtRiskLatticeEnd(class)
2902
2903 endif;
2904
2905 if (_BYTITLE_) entrytitle _BYLINE_ /
2905! textattrs=GRAPHVALUETEXT;
2906 else if (_BYFOOTNOTE_) entryfootnote halign=left
2906! _BYLINE_; endif;
2907 endif;
2908 EndGraph;
2909 end;
2910 %end;
2911 run;
2912 %mend;
2913
2914 %macro pValue;
2915 if (PVALUE < .0001)
2916 entry TESTNAME " p " eval (PUT(PVALUE, PVALUE6.4));
2917 else
2918 entry TESTNAME " p=" eval (PUT(PVALUE, PVALUE6.4));
2919 endif;
2920 %mend;
2921
2922 %macro SingleStratum;
2923 if (PLOTHW=1 AND PLOTEP=0)
2924 bandplot LimitUpper=HW_UCL LimitLower=HW_LCL x=TIME /
2925 displayTail=false modelname="Survival"
2925! fillattrs=GRAPHCONFIDENCE
2926 name="HW" legendlabel=LABELHW;
2927 endif;
2928 if (PLOTHW=0 AND PLOTEP=1)
2929 bandplot LimitUpper=EP_UCL LimitLower=EP_LCL x=TIME /
2930 displayTail=false modelname="Survival"
2930! fillattrs=GRAPHCONFIDENCE
2931 name="EP" legendlabel=LABELEP;
2932 endif;
2933 if (PLOTHW=1 AND PLOTEP=1)
2934 bandplot LimitUpper=HW_UCL LimitLower=HW_LCL x=TIME /
2935 displayTail=false modelname="Survival"
2935! fillattrs=GRAPHDATA1
2936 datatransparency=.55 name="HW" legendlabel=LABELHW;
2937 bandplot LimitUpper=EP_UCL LimitLower=EP_LCL x=TIME /
2938 displayTail=false modelname="Survival"
2938! fillattrs=GRAPHDATA2
2939 datatransparency=.55 name="EP" legendlabel=LABELEP;
2940 endif;
2941 if (PLOTCL=1)
2942 if (PLOTHW=1 OR PLOTEP=1)
2943 bandplot LimitUpper=SDF_UCL LimitLower=SDF_LCL x=TIME /
2944 displayTail=false modelname="Survival"
2944! display=(outline)
2945 outlineattrs=GRAPHPREDICTIONLIMITS name="CL"
2945! legendlabel=LABELCL;
2946 else
2947 bandplot LimitUpper=SDF_UCL LimitLower=SDF_LCL x=TIME /
2948 displayTail=false modelname="Survival"
2948! fillattrs=GRAPHCONFIDENCE
2949 name="CL" legendlabel=LABELCL;
2950 endif;
2951 endif;
2952
2953 stepplot y=SURVIVAL x=TIME / name="Survival" &tips
2953! legendlabel="Survival"
2954 &stepopts;
2955
2956 if (PLOTCENSORED=1)
2957 scatterplot y=CENSORED x=TIME / &censored &tiplabel
2958 name="Censored" legendlabel="Censored";
2959 endif;
2960
2961 if (PLOTCL=1 OR PLOTHW=1 OR PLOTEP=1)
2962 discretelegend "Censored" "CL" "HW" "EP" / location=outside
2963 halign=center;
2964 else
2965 if (PLOTCENSORED=1)
2966 discretelegend "Censored" / location=inside
2967 autoalign=(topright
2967! bottomleft);
2968 endif;
2969 endif;
2970 %if not &outside %then %do;
2971 if (PLOTATRISK=1)
2972 innermargin / align=bottom;
2973 axistable x=TATRISK value=ATRISK / &atriskopts;
2974 endinnermargin;
2975 endif;
2976 %end;
2977 %mend;
2978
2979 %macro MultipleStrata;
2980 if (PLOTHW=1)
2981 bandplot LimitUpper=HW_UCL LimitLower=HW_LCL x=TIME /
2981! &bandopts
2982 datatransparency=Transparency;
2983 endif;
2984 if (PLOTEP=1)
2985 bandplot LimitUpper=EP_UCL LimitLower=EP_LCL x=TIME /
2985! &bandopts
2986 datatransparency=Transparency;
2987 endif;
2988 if (PLOTCL=1)
2989 if (PLOTHW=1 OR PLOTEP=1)
2990 bandplot LimitUpper=SDF_UCL LimitLower=SDF_LCL x=TIME /
2990! &bandopts
2991 display=(outline)
2991! outlineattrs=(pattern=ShortDash);
2992 else
2993 bandplot LimitUpper=SDF_UCL LimitLower=SDF_LCL x=TIME /
2993! &bandopts
2994 datatransparency=Transparency;
2995 endif;
2996 endif;
2997
2998 stepplot y=SURVIVAL x=TIME / &groups name="Survival" &tips
2998! &stepopts;
2999
3000 if (PLOTCENSORED=1)
3001 scatterplot y=CENSORED x=TIME / &groups &tiplabel &censored;
3002 endif;
3003
3004 %if not &outside %then %do;
3005 if (PLOTATRISK=1)
3006 innermargin / align=bottom;
3007 axistable x=TATRISK value=ATRISK / &atriskopts
3007! &classopts;
3008 endinnermargin;
3009 endif;
3010 %end;
3011
3012 %if %nrbquote(&legendopts) ne %then %do;
3013 DiscreteLegend "Survival" / &legendopts;
3014 %end;
3015
3016 %if %nrbquote(&insetopts) ne %then %do;
3017 if (PLOTCENSORED=1)
3018 if (PLOTTEST=1)
3019 layout gridded / rows=2 &insetopts;
3020 entry &censorstr;
3021 %pValue
3022 endlayout;
3023 else
3024 layout gridded / rows=1 &insetopts;
3025 entry &censorstr;
3026 endlayout;
3027 endif;
3028 else
3029 if (PLOTTEST=1)
3030 layout gridded / rows=1 &insetopts;
3031 %pValue
3032 endlayout;
3033 endif;
3034 endif;
3035 %end;
3036
3037 %mend;
3038
3039 %macro SurvTabHeader(multiple);
3040 %if &multiple %then %do; entry ""; %end;
3041 entry "";
3042 entry "";
3043 entry "";
3044 entry &r "Median";
3045 entry "";
3046 entry "";
3047
3048 %if &multiple %then %do; entry ""; %end;
3049 entry &r "Subjects";
3050 entry &r "Event";
3051 entry &r "Censored";
3052 entry &r "Survival";
3053 entry &r PctMedianConfid;
3054 entry halign=left "CL";
3055 %mend;
3056
3057 %macro SurvivalTable;
3058 %local fmt r i t;
3059 %let fmt = bestd6.;
3060 %let r = halign = right;
3061 columnheaders;
3062 layout overlay / pad=(top=5);
3063 if(NSTRATA=1)
3064 layout gridded / columns=6 border=TRUE;
3065 dynamic PctMedianConfid NObs NEvent Median
3066 LowerMedian UpperMedian;
3067 %SurvTabHeader(0)
3068 entry &r NObs;
3069 entry &r NEvent;
3070 entry &r eval(NObs-NEvent);
3071 entry &r eval(put(Median,&fmt));
3072 entry &r eval(put(LowerMedian,&fmt));
3073 entry &r eval(put(UpperMedian,&fmt));
3074 endlayout;
3075 else
3076 layout gridded / columns=7 border=TRUE;
3077 dynamic PctMedianConfid;
3078 %SurvTabHeader(1)
3079 %do i = 1 %to 10;
3080 %let t = / textattrs=GraphData&i;
3081 dynamic StrVal&i NObs&i NEvent&i Median&i
3082 LowerMedian&i UpperMedian&i;
3083 if (&i <= nstrata)
3084 entry &r StrVal&i &t;
3085 entry &r NObs&i &t;
3086 entry &r NEvent&i &t;
3087 entry &r eval(NObs&i-NEvent&i) &t;
3088 entry &r eval(put(Median&i,&fmt)) &t;
3089 entry &r eval(put(LowerMedian&i,&fmt)) &t;
3090 entry &r eval(put(UpperMedian&i,&fmt)) &t;
3091 endif;
3092 %end;
3093 endlayout;
3094 endif;
3095 endlayout;
3096 endcolumnheaders;
3097 %mend;
3098
3099 %macro SurvivalSummaryTable;
3100 %macro AtRiskLatticeStart;
3101 layout lattice / columndatarange=union rowgutter=10
3102 rows=%if &outside %then 2 rowweights=ROWWEIGHTS;
3103 %else 1;;
3104 %if &outside %then %do; cell; %end;
3105 %mend;
3106
3107 %macro AtRiskLatticeEnd(useclassopts);
3108 %if &outside %then %do;
3109 endcell;
3110 cell;
3111 layout overlay / walldisplay=none
3111! xaxisopts=(display=none);
3112 axistable x=TATRISK value=ATRISK / &atriskopts
3113 %if &useclassopts ne %then &classopts;;
3114 endlayout;
3115 endcell;
3116 %end;
3117 %SurvivalTable
3118 endlayout;
3119 %mend;
3120 %mend;
3121
3122 %macro AtRiskLatticeStart;
3123 %if &outside %then %do;
3124 layout lattice / rows=2 rowweights=ROWWEIGHTS
3125 columndatarange=union rowgutter=10;
3126 cell;
3127 %end;
3128 %mend;
3129
3130 %macro AtRiskLatticeEnd(useclassopts);
3131 %if &outside %then %do;
3132 endcell;
3133 cell;
3134 layout overlay / walldisplay=none xaxisopts=(display=none)
3134! ;
3135 axistable x=TATRISK value=ATRISK / &atriskopts
3136 %if &useclassopts ne %then &classopts;;
3137 endlayout;
3138 endcell;
3139 endlayout;
3140 %end;
3141 %mend;
3142
3143 %CompileSurvivalTemplates
3144 %mend;
3145
3146
3147
3148 /*
3149
3150 proc template;
3151 delete Stat.Lifetest.Graphics.ProductLimitSurvival /
3152 store=sasuser.templat;
3153 delete Stat.Lifetest.Graphics.ProductLimitSurvival2 /
3154 store=sasuser.templat;
3155 run;
3156
3157 proc template;
3158 delete Stat.Lifetest.Graphics.ProductLimitFailure /
3159 store=sasuser.templat;
3160 delete Stat.Lifetest.Graphics.ProductLimitFailure2 /
3161 store=sasuser.templat;
3162 run;
3163 */
3164
3165
3166 **********************************************************************
3166! ***********************;
3167 * PP all days ;
3168 **********************************************************************
3168! ***********************;
3169
3170
3171 filename out1 "&dir&client&project\output\gm_Mortality_Day90
3171! 2019-11-16.rtf";
ERROR: At least one file associated with fileref OUT1 is still in use.
ERROR: Error in the FILENAME statement.
3172
3173
3174 title3 'gm_Mortality_Day90.sas';
3175 ods rtf file=out1;
NOTE: Writing RTF Body file: OUT1
3176
3177 options pageno=1;
3178
3179
3180 %ProvideSurvivalMacros
NOTE: Overwriting existing template/link:
Stat.Lifetest.Graphics.ProductLimitFailure
NOTE: STATGRAPH 'Stat.Lifetest.Graphics.ProductLimitFailure' has been saved
to: SASUSER.TEMPLAT
NOTE: Overwriting existing template/link:
Stat.Lifetest.Graphics.ProductLimitFailure2
NOTE: STATGRAPH 'Stat.Lifetest.Graphics.ProductLimitFailure2' has been
saved to: SASUSER.TEMPLAT
NOTE: PROCEDURE TEMPLATE used (Total process time):
real time 0.01 seconds
cpu time 0.01 seconds
3181
3182 %let yOptions = label="Survival Probability"
3182! shortlabel="Survival"
3183 linearopts=(viewmin=.75 viewmax=1
3184 tickvaluelist=(.7 .75 .8 .85 .9 .95
3184! 1));
3185
3186
3187 * %let yOptions = label="Cumulative Mortality"
3187! shortlabel="Mortality"
3188 linearopts=(viewmin=0 viewmax=1
3189 tickvaluelist=(0 .2 .4 .6 .8 1.0));
3190
3191
3192 %let xOptions = shortlabel=XNAME offsetmin=.05
3193 linearopts=(viewmax=MAXTIME tickvaluelist=(0 7 14
3193! 21 28 35 42 49 56 63 70 77 84 91)
3194 tickvaluefitpolicy=XTICKVALFITPOL);
3195
3196 %let TitleText2 = "Kaplan-Meier Plot in Per Protocol Analysis Set";
3197 %let LegendOpts = title="+ Censored"
3198 location=inside autoalign=(Bottom);
3199 *%let InsetOpts = ;
3200
3201
3202 %macro StmtsBottom;
3203 dynamic %do i = 1 %to 3; StrVal&i NObs&i NEvent&i %end;;
3204 layout gridded / columns=3 border=TRUE autoalign=(Top);
3205 entry ""; entry "Event"; entry "Total";
3206 %do i = 1 %to 3;
3207 %let t = / textattrs=GraphData&i;
3208 entry halign=right Strval&i &t; entry NEvent&i &t; entry
3208! NObs&i &t;
3209 %end;
3210 endlayout;
3211 %mend;
3212
3213 %let GraphOpts = DesignHeight=DefaultDesignWidth;
3214
3215
3216 %macro pValue;
3217 if (PVALUE < .0001)
3218 entry "Log Rank p " eval (PUT(PVALUE, PVALUE6.4));
3219 else
3220 entry "Log Rank p = " eval (PUT(PVALUE, PVALUE6.4));
3221 endif;
3222 %mend;
3223
3224
3225 *%SurvivalSummaryTable;
3226
3227
3228 %CompileSurvivalTemplates
NOTE: Overwriting existing template/link:
Stat.Lifetest.Graphics.ProductLimitFailure
NOTE: STATGRAPH 'Stat.Lifetest.Graphics.ProductLimitFailure' has been saved
to: SASUSER.TEMPLAT
NOTE: Overwriting existing template/link:
Stat.Lifetest.Graphics.ProductLimitFailure2
NOTE: STATGRAPH 'Stat.Lifetest.Graphics.ProductLimitFailure2' has been
saved to: SASUSER.TEMPLAT
NOTE: PROCEDURE TEMPLATE used (Total process time):
real time 0.01 seconds
cpu time 0.00 seconds
3229
3230
3231 proc format;
3232 value group 1='Relticimod' 2='Placebo';
NOTE: Format GROUP is already on the library WORK.FORMATS.
NOTE: Format GROUP has been output.
3233 run;
NOTE: PROCEDURE FORMAT used (Total process time):
real time 0.00 seconds
cpu time 0.00 seconds
3234
3235
3236
3237 title4 'Kaplan-Meier Survival to Day 90 in Per Protocol Analysis Set';
3238 proc lifetest data=modPP rmst plots= survival ( test atrisk = 1 to 90
3238! by 7 /*cb=hw*/) timelist = 1,2,3,4,5,6,7,14,21,28,60,90 ;
3239 time days_mort90*censor_mort90(1);
3240 strata group /order=internal;
3241 label group='Dose Group';
3242 label days_mort90='Days to Death or Censor';
3243 format group group.;
3244 run;
NOTE: The LOGLOG transform is used to compute the confidence limits for the
quartiles of the survivor distribution. To suppress using this
transform, specify CONFTYPE=LINEAR in the PROC LIFETEST statement.
NOTE: PROCEDURE LIFETEST used (Total process time):
real time 0.61 seconds
cpu time 0.32 seconds
3245
3246 /*Need to first edit SAS provided macro changing
3246! ProductLimitSurvival to ProductLimitFailure*/
3247
3248 %ProvideSurvivalMacros
NOTE: Overwriting existing template/link:
Stat.Lifetest.Graphics.ProductLimitFailure
NOTE: STATGRAPH 'Stat.Lifetest.Graphics.ProductLimitFailure'
has been saved to: SASUSER.TEMPLAT
NOTE: Overwriting existing template/link:
Stat.Lifetest.Graphics.ProductLimitFailure2
NOTE: STATGRAPH 'Stat.Lifetest.Graphics.ProductLimitFailure2'
has been saved to: SASUSER.TEMPLAT
NOTE: PROCEDURE TEMPLATE used (Total process time):
real time 0.02 seconds
cpu time 0.01 seconds
3249
3250 *%let yOptions = label="Survival Probability"
3250! shortlabel="Survival"
3251 linearopts=(viewmin=.75 viewmax=1
3252 tickvaluelist=(.7 .75 .8
3252! .85 .9 .95 1));
3253
3254
3255 %let yOptions = label="Cumulative Mortality"
3255! shortlabel="Mortality"
3256 linearopts=(viewmin=0 viewmax=0.25
3257 tickvaluelist=(0 0.05
3257! 0.10 0.15 0.20 0.25));
3258
3259
3260 %let xOptions = shortlabel=XNAME offsetmin=.05
3261 linearopts=(viewmax=MAXTIME
3261! tickvaluelist=(0 7 14 21 28 35 42 49 56 63 70 77 84 91)
3262 tickvaluefitpolicy=XTICKV
3262! ALFITPOL);
3263
3264 %let TitleText2 = "Kaplan-Meier Plot in Per Protocol
3264! Analysis Set";
3265 %let LegendOpts = title="+ Censored"
3266 location=inside autoalign=(Bottom);
3267 *%let InsetOpts = ;
3268
3269
3270 %macro StmtsBottom;
3271 dynamic %do i = 1 %to 3; StrVal&i NObs&i NEvent&i %end;
3271! ;
3272 layout gridded / columns=3 border=TRUE autoalign=(Top);
3273 entry ""; entry "Event"; entry "Total";
3274 %do i = 1 %to 3;
3275 %let t = / textattrs=GraphData&i;
3276 entry halign=right Strval&i &t; entry NEvent&i &t
3276! ; entry NObs&i &t;
3277 %end;
3278 endlayout;
3279 %mend;
3280
3281 %let GraphOpts = DesignHeight=DefaultDesignWidth;
3282
3283
3284 %macro pValue;
3285 if (PVALUE < .0001)
3286 entry "Log Rank p " eval (PUT(PVALUE, PVALUE6.4));
3287 else
3288 entry "Log Rank p = " eval (PUT(PVALUE, PVALUE6.4));
3289 endif;
3290 %mend;
3291
3292
3293 *%SurvivalSummaryTable;
3294
3295
3296 %CompileSurvivalTemplates
NOTE: Overwriting existing template/link:
Stat.Lifetest.Graphics.ProductLimitFailure
NOTE: STATGRAPH 'Stat.Lifetest.Graphics.ProductLimitFailure'
has been saved to: SASUSER.TEMPLAT
NOTE: Overwriting existing template/link:
Stat.Lifetest.Graphics.ProductLimitFailure2
NOTE: STATGRAPH 'Stat.Lifetest.Graphics.ProductLimitFailure2'
has been saved to: SASUSER.TEMPLAT
NOTE: PROCEDURE TEMPLATE used (Total process time):
real time 0.01 seconds
cpu time 0.01 seconds
3297
3298
3299
3300 title4 'Kaplan-Meier Cumulative Failure to Day 90 in Per
3300! Protocol Analysis Set';
3301 proc lifetest data=modPP rmst plots= survival ( failure
3301! test atrisk = 1 to 90 by 7 /*cb=hw*/) timelist =
3301! 1,2,3,4,5,6,7,14,21,28,60,90 ;
3302 time days_mort90*censor_mort90(1);
3303 strata group /order=internal;
3304 label group='Dose Group';
3305 label days_mort90='Days to Death or Censor';
3306 format group group.;
3307 run;
NOTE: The LOGLOG transform is used to compute the confidence
limits for the quartiles of the survivor distribution. To
suppress using this transform, specify CONFTYPE=LINEAR in
the PROC LIFETEST statement.
NOTE: PROCEDURE LIFETEST used (Total process time):
real time 0.70 seconds
cpu time 0.21 seconds
3308
3309 ods rtf close;