The whas500 data set is used in this chapter. We will also use a macro written to generate Brookmeyer-Crowley confidence intervals (bcconf) and a macro written to perform likelihood ratio tests (lrtest). Please download these two files, read them over, convert them to SAS programs, and create a filename for each. This will allow us to use %include when we wish to invoke the macros. Then run the %include statement before continuing with the examples.
filename bc "C:bcconf.sas"; filename lr "C:lrtest.sas"; %include bc; %include lr;
Table 5.1 on page 142 using the whas500 data and the bcconf macro to obtain the Brookmeyer-Crowley confidence intervals.
NOTE: We use the ods select statement to limit the output to just the part presented in the table.
data t51; set whas500; lf = lenfol / 365.25; run; * gender; ods select CensoredSummary HomTests; proc lifetest data = t51; strata gender / test=(logrank) nodetail; time lf*fstat(0); run;
The LIFETEST Procedure
      Summary of the Number of Censored and Uncensored Values
                                                            Percent
Stratum          GENDER       Total  Failed    Censored    Censored
      1               0         300     111         189       63.00
      2               1         200     104          96       48.00
-------------------------------------------------------------------
  Total                         500     215         285       57.00
       Test of Equality over Strata
                                   Pr >
Test      Chi-Square      DF    Chi-Square
Log-Rank      7.7911       1      0.0053
%bcconf(t51, lf, fstat, byvar=gender);
Brookmeyer-Crowley 95% Confidence Interval
                                  Lower       Upper
GENDER    total    Estimate       Limit       Limit    bc_lower    bc_upper
   0       111      5.91781     4.44932      .          4.44932      .
   1       104      3.60822     2.47945     4.32603     2.36986     4.32055
* cvd; ods select CensoredSummary HomTests; proc lifetest data = t51; strata cvd / test=(logrank) nodetail; time lf*fstat(0); run;
The LIFETEST Procedure
      Summary of the Number of Censored and Uncensored Values
                                                            Percent
Stratum             CVD       Total  Failed    Censored    Censored
      1               0         125      45          80       64.00
      2               1         375     170         205       54.67
-------------------------------------------------------------------
  Total                         500     215         285       57.00
       Test of Equality over Strata
                                   Pr >
Test      Chi-Square      DF    Chi-Square
Log-Rank      2.8615       1      0.0907
%bcconf(t51, lf, fstat, byvar=cvd);
Brookmeyer-Crowley 95% Confidence Interval
                               Lower       Upper
CVD    total    Estimate       Limit       Limit    bc_lower    bc_upper
 0       45      6.44658     4.31781     6.44658     4.31781      .
 1      170      4.32055     3.72329     6.43836     3.72329     5.91781
* afb; ods select CensoredSummary HomTests; proc lifetest data = t51; strata afb / test=(logrank) nodetail; time lf*fstat(0); run;
The LIFETEST Procedure
      Summary of the Number of Censored and Uncensored Values
                                                            Percent
Stratum             AFB       Total  Failed    Censored    Censored
      1               0         422     168         254       60.19
      2               1          78      47          31       39.74
-------------------------------------------------------------------
  Total                         500     215         285       57.00
       Test of Equality over Strata
                                   Pr >
Test      Chi-Square      DF    Chi-Square
Log-Rank     10.9000       1      0.0010
%bcconf(t51, lf, fstat, byvar=afb);
Brookmeyer-Crowley 95% Confidence Interval
                               Lower       Upper
AFB    total    Estimate       Limit       Limit    bc_lower    bc_upper
 0      168      5.91781     4.31781     6.46027     4.31781     6.44658
 1       47      2.36986     1.22192     3.77260     1.14795     3.50411
* sho; ods select CensoredSummary HomTests; proc lifetest data = t51; strata sho / test=(logrank) nodetail; time lf*fstat(0); run;
The LIFETEST Procedure
      Summary of the Number of Censored and Uncensored Values
                                                            Percent
Stratum             SHO       Total  Failed    Censored    Censored
      1               0         478     198         280       58.58
      2               1          22      17           5       22.73
-------------------------------------------------------------------
  Total                         500     215         285       57.00
       Test of Equality over Strata
                                   Pr >
Test      Chi-Square      DF    Chi-Square
Log-Rank     23.8365       1      <.0001
%bcconf(t51, lf, fstat, byvar=sho);
Brookmeyer-Crowley 95% Confidence Interval
                               Lower       Upper
SHO    total    Estimate       Limit       Limit    bc_lower    bc_upper
 0      198      5.27671     4.20822     6.46027     4.20822     6.44658
 1       17      0.05342     0.01370     1.22192     0.01096     1.14795
* chf; ods select CensoredSummary HomTests; proc lifetest data = t51; strata chf / test=(logrank) nodetail; time lf*fstat(0); run;
The LIFETEST Procedure
      Summary of the Number of Censored and Uncensored Values
                                                            Percent
Stratum             CHF       Total  Failed    Censored    Censored
      1               0         345     105         240       69.57
      2               1         155     110          45       29.03
-------------------------------------------------------------------
  Total                         500     215         285       57.00
       Test of Equality over Strata
                                   Pr >
Test      Chi-Square      DF    Chi-Square
Log-Rank     84.6007       1      <.0001
%bcconf(t51, lf, fstat, byvar=chf);
Brookmeyer-Crowley 95% Confidence Interval
                               Lower       Upper
CHF    total    Estimate       Limit       Limit    bc_lower    bc_upper
 0      105      6.46027     5.91781     6.46027     5.91781      .
 1      110      0.98356     0.75068     1.53973     0.70959     1.51233
* av3; ods select CensoredSummary HomTests; proc lifetest data = t51; strata av3 / test=(logrank) nodetail; time lf*fstat(0); run;
The LIFETEST Procedure
      Summary of the Number of Censored and Uncensored Values
                                                            Percent
Stratum             AV3       Total  Failed    Censored    Censored
      1               0         489     208         281       57.46
      2               1          11       7           4       36.36
-------------------------------------------------------------------
  Total                         500     215         285       57.00
       Test of Equality over Strata
                                   Pr >
Test      Chi-Square      DF    Chi-Square
Log-Rank      1.5236       1      0.2171
%bcconf(t51, lf, fstat, byvar=av3);
Brookmeyer-Crowley 95% Confidence Interval
                               Lower       Upper
AV3    total    Estimate       Limit       Limit    bc_lower    bc_upper
 0      208      4.45753     4.12603     6.46027     4.12603     6.44658
 1        7      5.35342     0.05479     6.43836     0.00548      .
* miord; ods select CensoredSummary HomTests; proc lifetest data = t51; strata miord / test=(logrank) nodetail; time lf*fstat(0); run;
The LIFETEST Procedure
      Summary of the Number of Censored and Uncensored Values
                                                            Percent
Stratum           MIORD       Total  Failed    Censored    Censored
      1               0         329     125         204       62.01
      2               1         171      90          81       47.37
-------------------------------------------------------------------
  Total                         500     215         285       57.00
       Test of Equality over Strata
                                   Pr >
Test      Chi-Square      DF    Chi-Square
Log-Rank      9.5706       1      0.0020
%bcconf(t51, lf, fstat,byvar= miord);
Brookmeyer-Crowley 95% Confidence Interval
                                 Lower       Upper
MIORD    total    Estimate       Limit       Limit    bc_lower    bc_upper
  0       125      5.91781     5.27671     6.44658     5.27671     6.43836
  1        90      3.37534     1.96712     4.32055     1.96712     4.25479
* mitype; ods select CensoredSummary HomTests; proc lifetest data = t51; strata mitype / test=(logrank) nodetail; time lf*fstat(0); run;
The LIFETEST Procedure
      Summary of the Number of Censored and Uncensored Values
                                                            Percent
Stratum          MITYPE       Total  Failed    Censored    Censored
      1               0         347     169         178       51.30
      2               1         153      46         107       69.93
-------------------------------------------------------------------
  Total                         500     215         285       57.00
       Test of Equality over Strata
                                   Pr >
Test      Chi-Square      DF    Chi-Square
Log-Rank     16.1806       1      <.0001
%bcconf(t51, lf, fstat, byvar=mitype);
Brookmeyer-Crowley 95% Confidence Interval
                                  Lower       Upper
MITYPE    total    Estimate       Limit       Limit    bc_lower    bc_upper
   0       169      3.50411     2.88767     4.44932     2.61096     4.32603
   1        46      6.43836     6.43836     6.44658      .           .
Table 5.2 on page 143 using the whas500 data and the lrtest macro which is used to get the p-values in the right-most column of the table.
NOTE: We use the ods select statement to limit the output to just the part presented in the table.
data whas500_t52; set whas500; age5 = age/5; hr10 = hr/10; sysbp10 = sysbp/10; diasbp10 = diasbp/10; bmi5 = bmi/5; run;
* age; ods select ParameterEstimates; proc phreg data = whas500_t52; model lenfol*fstat(0) = age5 / risklimits; run;
The PHREG Procedure
               Analysis of Maximum Likelihood Estimates
                   Parameter      Standard
Variable    DF      Estimate         Error    Chi-Square    Pr > ChiSq
age5         1       0.33123       0.03039      118.7963        <.0001
  Analysis of Maximum Likelihood Estimates
              Hazard      95% Hazard Ratio
Variable       Ratio      Confidence Limits
age5           1.393       1.312       1.478
%lrtest(whas500_t52, lenfol, fstat, , age5);
Full model: age5 Test variables: age5 Degrees of freedom: 1 P value: .000
* heart rate; ods select ParameterEstimates; proc phreg data = whas500_t52; model lenfol*fstat(0) = hr10 / risklimits; run;
The PHREG Procedure
               Analysis of Maximum Likelihood Estimates
                   Parameter      Standard
Variable    DF      Estimate         Error    Chi-Square    Pr > ChiSq
hr10         1       0.15036       0.02687       31.3135        <.0001
  Analysis of Maximum Likelihood Estimates
              Hazard      95% Hazard Ratio
Variable       Ratio      Confidence Limits
hr10           1.162       1.103       1.225
%lrtest(whas500_t52, lenfol, fstat, , hr10);
Full model: hr10 Test variables: hr10 Degrees of freedom: 1 P value: .000
* sysbp; ods select ParameterEstimates; proc phreg data = whas500_t52; model lenfol*fstat(0) = sysbp10 / risklimits; run;
The PHREG Procedure
               Analysis of Maximum Likelihood Estimates
                   Parameter      Standard
Variable    DF      Estimate         Error    Chi-Square    Pr > ChiSq
sysbp10      1      -0.04502       0.02226        4.0902        0.0431
  Analysis of Maximum Likelihood Estimates
              Hazard      95% Hazard Ratio
Variable       Ratio      Confidence Limits
sysbp10        0.956       0.915       0.999
%lrtest(whas500_t52, lenfol, fstat, , sysbp10);
Full model: sysbp10 Test variables: sysbp10 Degrees of freedom: 1 P value: .041
* diasbp; ods select ParameterEstimates; proc phreg data = whas500_t52; model lenfol*fstat(0) = diasbp10 / risklimits; run;
The PHREG Procedure
               Analysis of Maximum Likelihood Estimates
                   Parameter      Standard
Variable    DF      Estimate         Error    Chi-Square    Pr > ChiSq
diasbp10     1      -0.15993       0.03284       23.7145        <.0001
  Analysis of Maximum Likelihood Estimates
              Hazard      95% Hazard Ratio
Variable       Ratio      Confidence Limits
diasbp10       0.852       0.799       0.909
%lrtest(whas500_t52, lenfol, fstat, , diasbp10);
Full model: diasbp10 Test variables: diasbp10 Degrees of freedom: 1 P value: .000
* bmi; ods select ParameterEstimates; proc phreg data = whas500_t52; model lenfol*fstat(0) = bmi5 / risklimits; run;
The PHREG Procedure
               Analysis of Maximum Likelihood Estimates
                   Parameter      Standard
Variable    DF      Estimate         Error    Chi-Square    Pr > ChiSq
bmi5         1      -0.49133       0.07372       44.4254        <.0001
  Analysis of Maximum Likelihood Estimates
              Hazard      95% Hazard Ratio
Variable       Ratio      Confidence Limits
bmi5           0.612       0.530       0.707
%lrtest(whas500_t52, lenfol, fstat, , bmi5);
Full model: bmi5 Test variables: bmi5 Degrees of freedom: 1 P value: .000
Table 5.3 on page 143 using the whas500 data.
ods output ParameterEstimates=out1;
proc phreg data = whas500;
model lenfol*fstat(0) = age hr sysbp diasbp bmi gender cvd afb chf miord mitype;
run;
data out2;
set out1;
z = estimate /stderr;
lb = estimate-1.96*stderr;
ub = estimate+1.96*stderr;
run;
proc print data = out2 noobs;
var variable estimate stderr z probchisq lb ub;
format z f8.2;
format estimate probchisq lb ub f8.3;
format stderr f8.4;
run;
                                                      ProbChi
Variable    Estimate      StdErr           z          Sq          lb          ub
 AGE           0.049      0.0068        7.12       0.000       0.035       0.062
 HR            0.010      0.0031        3.38       0.001       0.004       0.016
 SYSBP         0.000      0.0030        0.12       0.904      -0.006       0.006
 DIASBP       -0.011      0.0049       -2.16       0.031      -0.020      -0.001
 BMI          -0.044      0.0164       -2.66       0.008      -0.076      -0.011
 GENDER       -0.271      0.1457       -1.86       0.063      -0.556       0.015
 CVD           0.007      0.1781        0.04       0.967      -0.342       0.356
 AFB           0.128      0.1712        0.75       0.455      -0.208       0.464
 CHF           0.774      0.1499        5.16       0.000       0.480       1.067
 MIORD         0.044      0.1484        0.30       0.768      -0.247       0.335
 MITYPE       -0.164      0.1879       -0.87       0.382      -0.532       0.204
Table 5.4 on page 144 using the whas500 data.
ods output ParameterEstimates=out3; proc phreg data = whas500; model lenfol*fstat(0) = age hr diasbp bmi gender afb chf miord mitype; run; data out4; set out3; z = estimate /stderr; lb = estimate-1.96*stderr; ub = estimate+1.96*stderr; run; proc print data = out4 noobs; var variable estimate stderr z probchisq lb ub; format z f8.2; format estimate probchisq lb ub f8.3; format stderr f8.4; run;
ProbChi Variable Estimate StdErr z Sq lb ub AGE 0.049 0.0067 7.23 0.000 0.036 0.062 HR 0.010 0.0030 3.45 0.001 0.004 0.016 DIASBP -0.010 0.0035 -2.87 0.004 -0.017 -0.003 BMI -0.044 0.0163 -2.67 0.008 -0.076 -0.012 GENDER -0.268 0.1447 -1.85 0.064 -0.552 0.015 AFB 0.125 0.1697 0.74 0.460 -0.207 0.458 CHF 0.776 0.1486 5.22 0.000 0.485 1.067 MIORD 0.045 0.1454 0.31 0.758 -0.240 0.330 MITYPE -0.169 0.1838 -0.92 0.357 -0.529 0.191
Table 5.5 on page 144 using the whas500 data.
ods output ParameterEstimates=out5; proc phreg data = whas500; model lenfol*fstat(0) = age hr diasbp bmi gender afb chf mitype; run; data out6; set out5; z = estimate /stderr; lb = estimate-1.96*stderr; ub = estimate+1.96*stderr; run; proc print data = out6 noobs; var variable estimate stderr z probchisq lb ub; format z f8.2; format estimate probchisq lb ub f8.3; format stderr f8.4; run;
ProbChi Variable Estimate StdErr z Sq lb ub AGE 0.049 0.0067 7.24 0.000 0.036 0.062 HR 0.010 0.0030 3.49 0.000 0.005 0.016 DIASBP -0.010 0.0035 -2.89 0.004 -0.017 -0.003 BMI -0.044 0.0163 -2.70 0.007 -0.076 -0.012 GENDER -0.274 0.1437 -1.90 0.057 -0.555 0.008 AFB 0.124 0.1697 0.73 0.464 -0.208 0.457 CHF 0.777 0.1486 5.23 0.000 0.486 1.069 MITYPE -0.182 0.1789 -1.02 0.309 -0.533 0.169
Table 5.6 on page 145 using the whas500 data.
ods output ParameterEstimates=out7; proc phreg data = whas500; model lenfol*fstat(0) = age hr diasbp bmi gender chf; run; data out8; set out7; z = estimate /stderr; lb = estimate-1.96*stderr; ub = estimate+1.96*stderr; run; proc print data = out8 noobs; var variable estimate stderr z probchisq lb ub; format z f8.2; format estimate probchisq lb ub f8.3; format stderr f8.4; run;
ProbChi Variable Estimate StdErr z Sq lb ub AGE 0.050 0.0066 7.55 0.000 0.037 0.063 HR 0.011 0.0029 3.83 0.000 0.005 0.017 DIASBP -0.011 0.0035 -3.02 0.003 -0.017 -0.004 BMI -0.045 0.0163 -2.77 0.006 -0.077 -0.013 GENDER -0.270 0.1436 -1.88 0.060 -0.551 0.012 CHF 0.778 0.1467 5.30 0.000 0.490 1.065
Table 5.7 and Figure 5.1 on page 146 using the whas500 data.
We have created a macro for creating this table and the accompanying graph. However, bmi can be treated as a discrete variable or not. Because of this, we have included code so that the output will match exactly with the text.
%macro table5_7(data, des_var, covlist);
  proc rank data = &data groups = 4 out = _temp_ ties = low;
      var &des_var;
      ranks new_&des_var;
  run;
  proc means data = _temp_ min max;
     class new_&des_var;
     var &des_var;
  ods output Summary = _temp_cut;
run;
  data _temp_a;
   set _temp_;
   &des_var.cat1 = (new_&des_var=1);
   &des_var.cat2 = (new_&des_var=2);
   &des_var.cat3 = (new_&des_var=3);
  run;
  proc phreg data = _temp_a;
     model lenfol*fstat(0) = &des_var.cat1 &des_var.cat2 &des_var.cat3 &covlist;
  ods output ParameterEstimates = _temp_parm;
  run;
data _temp_parma (keep = new_&des_var p);
  set _temp_parm;
  if _n_=1 then do;
  new_&des_var = 0;
  p = 0;
  output;
  new_&des_var = 1;
  p = estimate; 
  output;
  end;
  if _n_=2 then do;
  new_&des_var = 2;
  p = estimate; 
  output;
  end;
  if _n_=3 then do;
  new_&des_var = 3;
  p = estimate; 
  output;
  end;
if _n_<=3;
run;
data _temp_graph;
  merge _temp_cut  _temp_parma;
  by new_&des_var;
  x = (&des_var._min + &des_var._max)/2;
run;
proc print data = _temp_graph noobs label;
var x p;
format p f8.3;
format x f8.1;
label x="&des_var Quartile Midpoint" p='Coeff.';
run;
symbol i = join v = dot;
axis1 label=(a=90 'Estimated Log Hazard') minor=none;
axis2 label=("&des_var");
title "Estimated Coefficients for &des_var Quartiles";
proc gplot data = _temp_graph;
  plot p*x / vaxis=axis1 haxis=axis2;
run;
quit;
title;
%mend;
%table5_7(whas500, age, hr diasbp bmi gender chf);
  age
Quartile
Midpoint      Coeff.
    44.5       0.000
    66.0       0.690
    77.5       1.428
    93.5       1.807

%table5_7(whas500, hr, age diasbp bmi gender chf);
   hr
Quartile
Midpoint      Coeff.
    52.0       0.000
    77.5       0.335
    93.0       0.483
   143.5       0.809

%table5_7(whas500, diasbp, age hr bmi gender chf);
 diasbp
Quartile
Midpoint      Coeff.
    34.5       0.000
    71.5      -0.314
    85.5      -0.298
   145.0      -0.610

%table5_7(whas500, bmi, age hr diasbp gender chf);
  bmi
Quartile
Midpoint      Coeff.
    18.1       0.000
    24.6      -0.403
    27.7      -0.370
    37.1      -0.430
* code to make bmi match to text;
data part4b; set whas500; bmicat0 = (bmi le 23); bmicat1 = (23 < bmi <= 26); bmicat2 = (26< bmi <= 29); bmicat3 = (bmi gt 29); if bmicat0 = 1 then nbmi = 0; if bmicat1 = 1 then nbmi = 1; if bmicat2 = 1 then nbmi = 2; if bmicat3 = 1 then nbmi = 3; run; proc freq data = part4b; tables nbmi; tables bmicat0 bmicat1 bmicat2 bmicat3; run; proc phreg data = part4b; model lenfol*fstat(0) = bmicat1 bmicat2 bmicat3 age hr diasbp gender chf; ods output ParameterEstimates = part4_parm; run; proc univariate data = whas500; var bmi; output out = part4_sum min=min q1=q1 median=median q3=q3 max=max; run; data part4_cut; set part4_sum; new_bmi = 0; x = (min+q1)/2; output; new_bmi = 1; x = (q1 + median)/2; output; new_bmi = 2; x = (median + q3)/2; output; new_bmi = 3; x = (q3+max)/2; output; keep new_bmi x; run; data part4_parma (keep = new_bmi p); set part4_parm; if _n_=1 then do; new_bmi = 0; p = 0; output; new_bmi = 1; p = estimate; output; end; if _n_=2 then do; new_bmi = 2; p = estimate; output; end; if _n_=3 then do; new_bmi = 3; p = estimate; output; end; if _n_<=3; run; data part4_graph; merge part4_cut part4_parma; by new_bmi; x = put(x, 8.1); run; proc print data = part4_graph noobs label; var x p; format p f8.3; label x="BMI Quartile Midpoint" p='Coeff.'; run;
  BMI
Quartile
Midpoint      Coeff.
    18.1       0.000
    24.6      -0.453
    27.7      -0.315
    37.1      -0.592
goptions reset=all;
symbol i = join v = dot;
axis1 order=(-.6 to 0 by .2) label=(a=90 'Estimated Log Hazard') minor=none;
axis2 order=(18.1 24.6 27.7 37.1) label=('Body Mass Index (kg/m^2)');
title 'Estimated Coefficients for Body Mass Index Quartiles';
proc gplot data = part4_graph;
plot p*x / vaxis = axis1 haxis = axis2;
run;
quit;

Table 5.8 on page 147 using the whas500 data. For each fitted model, we use the ods output statement to save the fit statistics as a dataset. These datasets are then combined and compared using a likelihood ratio tests.
data table58;
set whas500;
bmi12 = bmi**(-2);
bmi2 = (bmi/10)**2;
bmi3 = (bmi/10)**3;
run;
* not in the model;
ods output FitStatistics = not;
proc phreg data = whas500;
model lenfol*fstat(0) = age hr diasbp gender chf;
run;
* linear;
ods output FitStatistics = linear;
proc phreg data = whas500;
model lenfol*fstat(0) = age hr diasbp bmi gender chf;
run;
* j = 1 (2 df);
ods output FitStatistics = j1;
proc phreg data = table58;
model lenfol*fstat(0) = age hr diasbp  bmi12 gender chf;
run;
* j = 2 (4 df);
ods output FitStatistics = j2;
proc phreg data = table58;
model lenfol*fstat(0) = age hr diasbp  bmi2 bmi3 gender chf;
run;
data _null_;
set not;
if _n_ = 1 then call symput('not', withcovariates);
set linear;
if _n_ = 1 then call symput('linear', withcovariates);
set j1;
if _n_ = 1 then call symput('j1', withcovariates);
set j2;
if _n_ = 1 then call symput('j2', withcovariates);
run;
data table5_8;
  length power $8;
  loglikelihood = ¬
  gstat  = .;
  pvalue = .;
  power = "";
  output;
  loglikelihood = &linear;
  gstat = &linear-&linear;
  pvalue = 1- probchi(¬ - &linear ,1);
  power = "1";
  output;
  loglikelihood = &j1;
  gstat = &linear - &j1;
  pvalue = 1- probchi(&linear - &j1 ,1);
  power = "-2";
  output;
  loglikelihood = &j2;
  gstat = &linear - &j2;
  pvalue = 1- probchi(&j1 - &j2 ,2);
  power = "(2,3)";
  output;
run;
proc print data = table5_8 noobs;
var loglikelihood gstat pvalue power;
format loglikelihood gstat pvalue f8.3;
run;
loglikelihood gstat pvalue power 2255.945 . . 2247.999 0.000 0.005 1 2241.668 6.331 0.012 -2 2237.784 10.215 0.143 (2,3)
Figure 5.2 on page 149 using the whas500 data.
proc phreg data = whas500;
model lenfol*fstat(0) = age hr diasbp gender chf;
id id;
output out=fig52ar resmart=mart;
run;
proc sort data = whas500;
by id;
run;
proc sort data = fig52ar;
by id;
run;
data fig52a;
merge fig52ar whas500;
by id;
run;
proc loess data = fig52a;
model mart = bmi ;
ods output OutputStatistics=results_fig52a;
run;
proc sort data=results_fig52a;
by bmi;
run;
goptions reset=all;
axis1 order=(-4 to 1 by 1) label=(a=90 'Martingale Residuals from Model Without BMI') minor=none;
axis2 order=(10 to 50 by 10) label=('Body Mass Index (kg/m^2)') minor=none;
symbol1 v=dot i=none c=black;
symbol2 v=none i=join c=black;
proc gplot data = results_fig52a;
plot DepVar*bmi=1 pred*bmi=2 / overlay vaxis = axis1 haxis = axis2;
run;
quit;

proc phreg data = whas500;
model lenfol*fstat(0) = age hr diasbp gender chf bmi;
id id;
output out=fig52br resmart=mart_full;
run;
data temp1;
set fig52br;
hat = fstat - mart_full;
run;
proc loess data = temp1;
model fstat = bmi / smooth = .4 bucket = 20;
ods output OutputStatistics=results_fig52b1;
run;
data temp2;
set results_fig52b1;
rename DepVar = depvar_fstat;
rename Pred = pred_fstat;
run;
proc loess data = temp1;
model hat = bmi / smooth = .4 bucket = 20;
ods output OutputStatistics=results_fig52b2;
run;
data temp3;
set results_fig52b2;
rename DepVar = depvar_hat;
rename Pred = pred_hat;
run;
proc sort data = temp2;
by obs;
run;
proc sort data = temp3;
by obs;
run;
data temp4;
merge temp2 temp3;
by obs;
run;
data temp5;
set temp4;
f = log(pred_fstat/pred_hat)-.0451558*bmi;
id = obs;
run;
proc sort data = temp5;
by bmi;
run;
goptions reset=all;
axis1 order=(-1.5 to .5 by .5) label=(a=90 'ln(csmoothed/Hsmoothed)+beta*x') minor=none;
axis2 order=(10 to 50 by 10) label=('Body Mass Index (kg/m^2)') minor=none;
symbol1 v=none i=join c=black;
proc gplot data = temp5;
plot f*bmi / vaxis = axis1 haxis = axis2;
run;
quit;

Table 5.9 on page 150 using the modified version of the whas500 data from Table 5.8.
proc phreg data = table58; model lenfol*fstat(0) = bmi2 bmi3 age hr diasbp gender chf; run;
< some output omitted >
                  Analysis of Maximum Likelihood Estimates
                 Parameter     Standard                               Hazard
Variable   DF     Estimate        Error   Chi-Square   Pr > ChiSq      Ratio
bmi2        1     -0.72476      0.17261      17.6297       <.0001      0.484
bmi3        1      0.15442      0.03923      15.4958       <.0001      1.167
AGE         1      0.04978      0.00661      56.6729       <.0001      1.051
HR          1      0.01180      0.00295      15.9574       <.0001      1.012
DIASBP      1     -0.01067      0.00350       9.2930       0.0023      0.989
GENDER      1     -0.32640      0.14422       5.1226       0.0236      0.722
CHF         1      0.82341      0.14718      31.3003       <.0001      2.278
Figure 5.3 on page 150 using the whas500 data and the data generated in the previous example from the two term model.
data temp6;
set whas500;
bmifp1=(bmi/10)**2;
bmifp2=(bmi/10)**3;
run;
proc sort data = temp5;
by id;
run;
proc means data = temp6;
var id;
run;
proc sort data = temp6;
by id;
run;
data temp7;
merge temp5 temp6;
by id;
run;
proc phreg data = whas500;
model lenfol*fstat(0) = bmifp1 bmifp2 age hr diasbp gender chf;
run;
* f is generated in the temp5 data set above;
data temp8;
set temp7;
fp_funct=-0.72476*bmifp1+0.15442*bmifp2;
diff=f-fp_funct;
run;
data temp8;
set temp7;
fp_funct=-0.725*bmifp1+0.154*bmifp2;
diff=f-fp_funct;
run;
proc means data = temp8;
var diff;
run;
data temp9;
set temp8;
fp_funct1 = fp_funct + 0.9076111;
run;
proc sort data = temp9;
by bmi;
run;
proc means data = temp9;
var bmi f fp_funct1;
run;
goptions reset=all;
axis1 order=(-1.5 to .5 by .5) label=(a=90 'Estimated Log Hazard') minor=none;
axis2 order=(10 to 50 by 10) label=('Body Mass Index (kg/m^2)') minor=none;
symbol1 v=none i=join c=red line=1;
symbol2 v=none i=join c=black line=14;
legend label=none value=('GTF Smooth' 'Two Term (2, 3) Model')
       position=(top left inside) mode=share down = 2; 
proc gplot data = temp9;
plot fp_funct1*bmi=1 f*bmi=2 / vaxis = axis1 haxis = axis2 overlay legend = legend;
run;
quit;

Table 5.10 on page 151 using the whas500 data and the lrtest macro.
data table510; set whas500; bmi2=(bmi/10)**2; bmi3=(bmi/10)**3; /* Creating age interactions */ bmi2age=age*(bmi/10)**2; bmi3age=age*(bmi/10)**3; hrage=age*hr; diasbpage=age*diasbp; genderage=age*gender; chfage=age*chf; /* Creating gender interactions */ bmi2gender=gender*(bmi/10)**2; bmi3gender=gender*(bmi/10)**3; hrgender=gender*hr; diasbpgender=gender*diasbp; chfgender=gender*chf; run; /* With Age Interactions */ %lrtest(table510, lenfol, fstat, bmi2 bmi3 age hr diasbp gender chf, bmi2age bmi3age);
Full model: bmi2 bmi3 age hr diasbp gender chf bmi2age bmi3age Reduced model: bmi2 bmi3 age hr diasbp gender chf Test variables: bmi2age bmi3age Degrees of freedom: 2 P value: .190
%lrtest(table510, lenfol, fstat, bmi2 bmi3 age hr diasbp gender chf, hrage);
Full model: bmi2 bmi3 age hr diasbp gender chf hrage Reduced model: bmi2 bmi3 age hr diasbp gender chf Test variables: hrage Degrees of freedom: 1 P value: .132
%lrtest(table510, lenfol, fstat, bmi2 bmi3 age hr diasbp gender chf, diasbpage);
Full model: bmi2 bmi3 age hr diasbp gender chf diasbpage Reduced model: bmi2 bmi3 age hr diasbp gender chf Test variables: diasbpage Degrees of freedom: 1 P value: .100
%lrtest(table510, lenfol, fstat, bmi2 bmi3 age hr diasbp gender chf, genderage);
Full model: bmi2 bmi3 age hr diasbp gender chf genderage Reduced model: bmi2 bmi3 age hr diasbp gender chf Test variables: genderage Degrees of freedom: 1 P value: .022
%lrtest(table510, lenfol, fstat, bmi2 bmi3 age hr diasbp gender chf, chfage);
Full model: bmi2 bmi3 age hr diasbp gender chf chfage Reduced model: bmi2 bmi3 age hr diasbp gender chf Test variables: chfage Degrees of freedom: 1 P value: .025 /* With Gender Interactions */ %lrtest(table510, lenfol, fstat, bmi2 bmi3 age hr diasbp gender chf, bmi2gender bmi3gender);
Full model: bmi2 bmi3 age hr diasbp gender chf bmi2gender bmi3gender Reduced model: bmi2 bmi3 age hr diasbp gender chf Test variables: bmi2gender bmi3gender Degrees of freedom: 2 P value: .147
%lrtest(table510, lenfol, fstat, bmi2 bmi3 age hr diasbp gender chf, hrgender);
Full model: bmi2 bmi3 age hr diasbp gender chf hrgender Reduced model: bmi2 bmi3 age hr diasbp gender chf Test variables: hrgender Degrees of freedom: 1 P value: .145
%lrtest(table510, lenfol, fstat, bmi2 bmi3 age hr diasbp gender chf, diasbpgender);
Full model: bmi2 bmi3 age hr diasbp gender chf diasbpgender Reduced model: bmi2 bmi3 age hr diasbp gender chf Test variables: diasbpgender Degrees of freedom: 1 P value: .080
%lrtest(table510, lenfol, fstat, bmi2 bmi3 age hr diasbp gender chf, chfgender);
Full model: bmi2 bmi3 age hr diasbp gender chf chfgender Reduced model: bmi2 bmi3 age hr diasbp gender chf Test variables: chfgender Degrees of freedom: 1 P value: .482
Tables 5.11, 5.12, and 5.13 on pages 152 and 153 using the whas500 data as modified for Table 5.8.
/* 5.11 */ proc phreg data = table58; model lenfol*fstat(0) = bmi2 bmi3 age hr diasbp gender chf agegender; agegender = age*gender; run;
                  Analysis of Maximum Likelihood Estimates
                  Parameter     Standard                               Hazard
Variable    DF     Estimate        Error   Chi-Square   Pr > ChiSq      Ratio
bmi2         1     -0.67309      0.17358      15.0363       0.0001      0.510
bmi3         1      0.14214      0.03944      12.9886       0.0003      1.153
AGE          1      0.06053      0.00832      52.9614       <.0001      1.062
HR           1      0.01167      0.00294      15.7310       <.0001      1.012
DIASBP       1     -0.01071      0.00347       9.5085       0.0020      0.989
GENDER       1      1.85462      0.95783       3.7492       0.0528      6.389
CHF          1      0.82352      0.14654      31.5808       <.0001      2.279
agegender    1     -0.02766      0.01205       5.2685       0.0217      0.973
/* 5.12 */
proc phreg data = table58;
model lenfol*fstat(0) = bmi2 bmi3 age hr diasbp gender chf agegender agechf agediasbp genderdiasbp;
agegender = age*gender;
agechf = age*chf;
agediasbp = age*diasbp;
genderdiasbp = gender*diasbp;
run;
The PHREG Procedure
                    Analysis of Maximum Likelihood Estimates
                     Parameter     Standard                               Hazard
Variable       DF     Estimate        Error   Chi-Square   Pr > ChiSq      Ratio
bmi2            1     -0.64101      0.17539      13.3582       0.0003      0.527
bmi3            1      0.13723      0.04000      11.7676       0.0006      1.147
AGE             1      0.03382      0.02032       2.7699       0.0961      1.034
HR              1      0.01119      0.00297      14.1921       0.0002      1.011
DIASBP          1     -0.05269      0.02130       6.1199       0.0134      0.949
GENDER          1      0.74765      1.22006       0.3755       0.5400      2.112
CHF             1      2.45613      1.00301       5.9964       0.0143     11.660
agegender       1     -0.02202      0.01316       2.7986       0.0943      0.978
agechf          1     -0.02029      0.01272       2.5466       0.1105      0.980
agediasbp       1    0.0004846    0.0002649       3.3464       0.0674      1.000
genderdiasbp    1      0.00899      0.00693       1.6823       0.1946      1.009
/* 5.13 */
proc phreg data = table58;
model lenfol*fstat(0) = bmi2 bmi3 age hr diasbp gender chf agegender;
agegender = age*gender;
run;
                  Analysis of Maximum Likelihood Estimates
                  Parameter     Standard                               Hazard
Variable    DF     Estimate        Error   Chi-Square   Pr > ChiSq      Ratio
bmi2         1     -0.67309      0.17358      15.0363       0.0001      0.510
bmi3         1      0.14214      0.03944      12.9886       0.0003      1.153
AGE          1      0.06053      0.00832      52.9614       <.0001      1.062
HR           1      0.01167      0.00294      15.7310       <.0001      1.012
DIASBP       1     -0.01071      0.00347       9.5085       0.0020      0.989
GENDER       1      1.85462      0.95783       3.7492       0.0528      6.389
CHF          1      0.82352      0.14654      31.5808       <.0001      2.279
agegender    1     -0.02766      0.01205       5.2685       0.0217      0.973
Table 5.14 on page 158 using the whas500 data as modified for Table 5.8. For each step, we have formatted in bold the statistics shown in the text.
proc phreg data = table58; model lenfol*fstat(0) = age chf hr diasbp bmi gender mitype miord sysbp cvd afb / selection = forward details slentry = 0.25 sls = 0.8; run;
The PHREG Procedure
          Model Information
Data Set                 WORK.TABLE58
Dependent Variable       LENFOL
Censoring Variable       FSTAT
Censoring Value(s)       0
Ties Handling            BRESLOW
Number of Observations Read         500
Number of Observations Used         500
Summary of the Number of Event and Censored Values
                                     Percent
   Total       Event    Censored    Censored
     500         215         285       57.00
Analysis of Variables Not in the Model
                 Score
Variable    Chi-Square    Pr > ChiSq
AGE           126.2605        <.0001
CHF            84.3701        <.0001
HR             31.2839        <.0001
DIASBP         23.3804        <.0001
BMI            44.1654        <.0001
GENDER          7.7720        0.0053
MITYPE         16.1432        <.0001
MIORD           9.5467        0.0020
SYSBP           4.0922        0.0431
CVD             2.8547        0.0911
AFB            10.8722        0.0010
Step  1. Variable AGE is entered.  The model contains the following explanatory
         variables:
         AGE
 < some output omitted >
                  Analysis of Maximum Likelihood Estimates
                 Parameter     Standard                               Hazard
Variable   DF     Estimate        Error   Chi-Square   Pr > ChiSq      Ratio
AGE         1      0.06625      0.00608     118.7963       <.0001      1.068
Analysis of Variables Not in the Model
                 Score
Variable    Chi-Square    Pr > ChiSq
CHF            38.4054        <.0001
HR             19.0853        <.0001
DIASBP          5.7844        0.0162
BMI             7.2246        0.0072
GENDER          0.2175        0.6409
MITYPE          2.6101        0.1062
MIORD           1.8527        0.1735
SYSBP           3.8985        0.0483
CVD             0.0254        0.8733
AFB             4.1289        0.0422
Step  2. Variable CHF is entered.  The model contains the following explanatory
         variables:
         AGE  CHF
< some output omitted >
                  Analysis of Maximum Likelihood Estimates
                 Parameter     Standard                               Hazard
Variable   DF     Estimate        Error   Chi-Square   Pr > ChiSq      Ratio
AGE         1      0.05860      0.00610      92.4062       <.0001      1.060
CHF         1      0.86085      0.14235      36.5698       <.0001      2.365
Analysis of Variables Not in the Model
                 Score
Variable    Chi-Square    Pr > ChiSq
HR              9.1084        0.0025
DIASBP          5.4058        0.0201
BMI             8.2188        0.0041
GENDER          1.2019        0.2729
MITYPE          2.9333        0.0868
MIORD           1.8879        0.1694
SYSBP           4.4567        0.0348
CVD             0.1742        0.6764
AFB             1.0596        0.3033
Step  3. Variable HR is entered.  The model contains the following explanatory
         variables:
         AGE  CHF  HR
< some output omitted >
                  Analysis of Maximum Likelihood Estimates
                 Parameter     Standard                               Hazard
Variable   DF     Estimate        Error   Chi-Square   Pr > ChiSq      Ratio
AGE         1      0.05905      0.00617      91.6434       <.0001      1.061
CHF         1      0.75665      0.14589      26.8996       <.0001      2.131
HR          1      0.00867      0.00287       9.1191       0.0025      1.009
Analysis of Variables Not in the Model
                 Score
Variable    Chi-Square    Pr > ChiSq
DIASBP          9.2900        0.0023
BMI             8.3197        0.0039
GENDER          1.8804        0.1703
MITYPE          1.6807        0.1948
MIORD           1.1879        0.2758
SYSBP           4.7888        0.0286
CVD             0.1367        0.7116
AFB             0.6020        0.4378
Step  4. Variable DIASBP is entered.  The model contains the following
         explanatory variables:
         AGE  CHF  HR  DIASBP
< some output omitted >
                  Analysis of Maximum Likelihood Estimates
                 Parameter     Standard                               Hazard
Variable   DF     Estimate        Error   Chi-Square   Pr > ChiSq      Ratio
AGE         1      0.05359      0.00631      72.0525       <.0001      1.055
CHF         1      0.74062      0.14622      25.6536       <.0001      2.097
HR          1      0.01075      0.00294      13.4105       0.0003      1.011
DIASBP      1     -0.01079      0.00353       9.3578       0.0022      0.989
Analysis of Variables Not in the Model
                 Score
Variable    Chi-Square    Pr > ChiSq
BMI             7.1659        0.0074
GENDER          2.9642        0.0851
MITYPE          0.8518        0.3561
MIORD           0.7155        0.3976
SYSBP           0.0058        0.9395
CVD             0.0027        0.9582
AFB             0.9543        0.3286
Step  5. Variable BMI is entered.  The model contains the following explanatory
         variables:
         AGE  CHF  HR  DIASBP  BMI
< some output omitted >
                  Analysis of Maximum Likelihood Estimates
                 Parameter     Standard                               Hazard
Variable   DF     Estimate        Error   Chi-Square   Pr > ChiSq      Ratio
AGE         1      0.04805      0.00656      53.6544       <.0001      1.049
CHF         1      0.74520      0.14583      26.1132       <.0001      2.107
HR          1      0.01070      0.00293      13.3047       0.0003      1.011
DIASBP      1     -0.01019      0.00355       8.2368       0.0041      0.990
BMI         1     -0.04271      0.01595       7.1716       0.0074      0.958
Analysis of Variables Not in the Model
                 Score
Variable    Chi-Square    Pr > ChiSq
GENDER          3.5509        0.0595
MITYPE          0.8205        0.3650
MIORD           0.4975        0.4806
SYSBP           0.0003        0.9851
CVD             0.0539        0.8164
AFB             0.5165        0.4723
Step  6. Variable GENDER is entered.  The model contains the following
         explanatory variables:
         AGE  CHF  HR  DIASBP  BMI  GENDER
< some output omitted >
                  Analysis of Maximum Likelihood Estimates
                 Parameter     Standard                               Hazard
Variable   DF     Estimate        Error   Chi-Square   Pr > ChiSq      Ratio
AGE         1      0.04979      0.00660      56.9804       <.0001      1.051
CHF         1      0.77764      0.14670      28.1009       <.0001      2.176
HR          1      0.01118      0.00292      14.7008       0.0001      1.011
DIASBP      1     -0.01059      0.00351       9.0927       0.0026      0.989
BMI         1     -0.04516      0.01628       7.6981       0.0055      0.956
GENDER      1     -0.26999      0.14362       3.5341       0.0601      0.763
Analysis of Variables Not in the Model
                 Score
Variable    Chi-Square    Pr > ChiSq
MITYPE          0.9514        0.3294
MIORD           0.2701        0.6033
SYSBP           0.0490        0.8247
CVD             0.0781        0.7799
AFB             0.4458        0.5043
             Summary of Forward Selection
        Variable    Number         Score
Step     Entered      In      Chi-Square    Pr > ChiSq
   1    AGE              1      126.2605        <.0001
   2    CHF              2       38.4054        <.0001
   3    HR               3        9.1084        0.0025
   4    DIASBP           4        9.2900        0.0023
   5    BMI              5        7.1659        0.0074
   6    GENDER           6        3.5509        0.0595
Table 5.15 on page 161 using the whas500 data as modified for Table 5.8.
NOTE: Lines 3 and 4 are reversed from what is shown in the text.
proc phreg data = table58;
model lenfol*fstat(0) = age chf hr diasbp bmi gender mitype miord sysbp cvd afb 
/ selection=score best=3;
ods output BestSubsets = bestsub;
run;
* last is 0/1 temporary variable;
data _null_;
  set bestsub end=last;
  if last then call symput('s11', scorechisq);
run;
data bestsub_a;
  set bestsub;
  sq = &s11 - scorechisq;
  c = sq - (11 - 2*numberinmodel);
run;
proc sort data = bestsub_a;
by c;
run;
proc print data = bestsub_a (obs = 5) noobs label;
var VariablesInModel c sq;
format c sq f8.2;
label VariablesInModel = "Model Covariates";
run;
Model Covariates c sq AGE CHF HR DIASBP BMI GENDER 3.13 2.13 AGE CHF HR DIASBP BMI GENDER MITYPE 3.58 0.58 AGE CHF HR DIASBP BMI GENDER SYSBP 4.77 1.77 AGE CHF HR DIASBP BMI 4.95 5.95 AGE CHF HR DIASBP BMI GENDER MIORD 4.99 1.99
We were unable to reproduce table 5.16 on page 165.
Table 5.17, page 166 and table 5.18, page 167 are not reproduced because they use hypothetical data.
