The whas500, actg320, gbcs, uis and grace1000 data sets are used in this chapter.
Table 7.1 on page 211 using the actg320 data.
NOTE: The output from the proc means shown below is used in the data step to create the cd4 variable.
proc means data = actg320 p25 p50 p75; var cd4; run;
The MEANS Procedure Analysis Variable : CD4 25th Pctl 50th Pctl 75th Pctl -------------------------------------------- 23.0000000 74.5000000 136.5000000 --------------------------------------------
data actg320_t71; set actg320; ivdrug_d = ivdrug>1; karnof_70=(karnof=70); karnof_80=(karnof=80); karnof_90=(karnof=90); karnof_70_80=(karnof=70 or karnof=80); * create stratified cd4 variable based on the output of the proc means above; cd4_q = 1; if cd4>23 & cd4<=74.5 then cd4_q=2; if cd4>74.5 & cd4<=136.5 then cd4_q=3; if cd4>136.5 then cd4_q=4; run; ods select FitStatistics ParameterEstimates; proc phreg data = actg320_t71; model time*censor(0) = tx ivdrug_d karnof_70_80 karnof_90 age; strata cd4_q; run;
Model Fit Statistics Without With Criterion Covariates Covariates -2 LOG L 1050.245 1013.510 AIC 1050.245 1023.510 SBC 1050.245 1036.332 Analysis of Maximum Likelihood Estimates Parameter Standard Hazard Variable DF Estimate Error Chi-Square Pr > ChiSq Ratio TX 1 -0.66777 0.21553 9.5991 0.0019 0.513 ivdrug_d 1 -0.54632 0.32256 2.8686 0.0903 0.579 karnof_70_80 1 1.19099 0.29630 16.1572 <.0001 3.290 karnof_90 1 0.41188 0.29267 1.9806 0.1593 1.510 AGE 1 0.02248 0.01120 4.0260 0.0448 1.023
Median values listed on page 211 using actg320 data.
data cov0; tx =0; ivdrug_d =0; karnof_70_80 =0; karnof_90 = 0; age = 0; run; proc phreg data = actg320_t71; model time*censor(0) = tx ivdrug_d karnof_70_80 karnof_90 age; strata cd4_q; output out=fig71_a xbeta=p; baseline covariates = cov0 out = b0 survival = surv / nomean; run; proc print data = b0; run; data t; set fig71_a; p1 = p - tx*(-0.66777); run; proc means data = t median; class cd4_q; var p1; output out=tcd4 (where = (_type_=1)) median = median; run; proc print data = tcd4; run; proc sql; select median into :md1 -:md4 from tcd4; quit;
median -------- 1.217544 1.176043 1.086145 1.093723
Figure 7.1 on page 212 continuing to use the actg320 data and the model in the previous example .
data fig71; set b0; s10 = surv**exp(&md1); /*cd4=1 and tr=0*/ s20 = surv**exp(&md2); /*cd4=2 and tr=0*/ s30 = surv**exp(&md3); /*cd4=3 and tr=0*/ s40 = surv**exp(&md4); /*cd4=4 and tr=0*/ s11 = surv**exp(&md1 -0.66777); /*cd4=1 and tr=1*/ s21 = surv**exp(&md2 -0.66777); /*cd4=2 and tr=1*/ s31 = surv**exp(&md3 -0.66777); /*cd4=3 and tr=1*/ s41 = surv**exp(&md4 -0.66777); /*cd4=4 and tr=1*/ run; proc sort data = fig71; by cd4_q time; run; goptions reset=all htext = 2 htitle = 3; axis1 order=(.8 to 1 by .05) label=(a=90 'Adjusted Survival Function') minor=none; axis2 order=(0 to 400 by 100) label=('Time') minor=none; symbol1 i=stepjll v=none c=black line=14; symbol2 i=stepjll v=none c=black line=1; proc gplot data = fig71 ; where cd4_q=1; plot(s10 s11)*time /overlay vaxis=axis1 haxis=axis2 name="q1" noframe; title "CD4 Quartile 1"; run; quit; goptions reset=all htext = 2 htitle = 3; axis1 order=(.8 to 1 by .05) label=(a=90 'Adjusted Survival Function') minor=none; axis2 order=(0 to 400 by 100) label=('Time') minor=none; symbol1 i=stepjll v=none c=black line=14; symbol2 i=stepjll v=none c=black line=1; proc gplot data = fig71; where cd4_q=2; plot(s10 s11)*time /overlay vaxis=axis1 haxis=axis2 name="q2" noframe; title "CD4 Quartile 2"; run; quit; goptions reset=all htext = 2 htitle = 3; axis1 order=(.9 to 1 by .025) label=(a=90 'Adjusted Survival Function') minor=none; axis2 order=(0 to 400 by 100) label=('Time') minor=none; symbol1 i=stepjll v=none c=black line=14; symbol2 i=stepjll v=none c=black line=1; proc gplot data = fig71; where cd4_q=3; plot(s10 s11)*time /overlay vaxis=axis1 haxis=axis2 name="q3" noframe; title "CD4 Quartile 3"; run; quit; * quantile 4 htext = 2 htitle = 3; goptions reset=all htext = 2 htitle = 3; axis1 order=(.9 to 1 by .025) label=(a=90 'Adjusted Survival Function') minor=none; axis2 order=(0 to 400 by 100) label=('Time') minor=none; symbol1 i=stepjll v=none c=black line=14; symbol2 i=stepjll v=none c=black line=1; proc gplot data = fig71; where cd4_q=4; plot(s10 s11)*time /overlay vaxis=axis1 haxis=axis2 name="q4" noframe; title "CD4 Quartile 4"; run; quit; * empty graphics catalog; proc greplay nofs igout=gseg; delete _all_; run; quit; proc greplay igout=work.gseg tc=sashelp.templt template=l2r2 nofs; treplay 1:q1 2:q3 3:q2 4:q4; run; quit;
Estimates at the top of page 217 using the uis data.
ods select ParameterEstimates; proc phreg data = uis; model time*censor(0) = treat / risklimits; run;
The PHREG Procedure Analysis of Maximum Likelihood Estimates Parameter Standard Variable DF Estimate Error Chi-Square Pr > ChiSq treat 1 -0.23109 0.08899 6.7430 0.0094 Analysis of Maximum Likelihood Estimates Hazard 95% Hazard Ratio Variable Ratio Confidence Limits treat 0.794 0.667 0.945
Table 7.2 on page 217 using the uis data.
ods output ParameterEstimates=out1; proc phreg data = uis; model time*censor(0) = treat off_trt tot; if time <= lot then off_trt = 0; else off_trt = 1; tot = treat*off_trt; 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 treat -0.524 0.2258 -2.32 0.020 -0.967 -0.081 off_trt 2.270 0.1865 12.17 0.000 1.905 2.636 tot 0.621 0.2463 2.52 0.012 0.138 1.104
Table 7.3 on page 219 using the uis data.
/* Lines 1 and 3 of table */ ods select ParameterEstimates; proc phreg data = uis; model time*censor(0) = treat off_trt tot / risklimits; if time <= lot then off_trt = 0; else off_trt = 1; tot = treat*off_trt; run;
The PHREG Procedure Analysis of Maximum Likelihood Estimates Parameter Standard Variable DF Estimate Error Chi-Square Pr > ChiSq treat 1 -0.52388 0.22583 5.3814 0.0204 off_trt 1 2.27033 0.18650 148.1847 <.0001 tot 1 0.62097 0.24630 6.3563 0.0117 Analysis of Maximum Likelihood Estimates Hazard 95% Hazard Ratio Variable Ratio Confidence Limits treat 0.592 0.380 0.922 off_trt 9.683 6.718 13.955 tot 1.861 1.148 3.015 /* Line 2 of table */ ods select ParameterEstimates; proc phreg data = uis; model time*censor(0) = treat off_trt tot / risklimits; if time <= lot then off_trt = 1; else off_trt = 0; tot = treat*off_trt; run;
The PHREG Procedure Analysis of Maximum Likelihood Estimates Parameter Standard Variable DF Estimate Error Chi-Square Pr > ChiSq treat 1 0.09709 0.09771 0.9873 0.3204 off_trt 1 -2.27033 0.18650 148.1847 <.0001 tot 1 -0.62097 0.24630 6.3563 0.0117 Analysis of Maximum Likelihood Estimates Hazard 95% Hazard Ratio Variable Ratio Confidence Limits treat 1.102 0.910 1.335 off_trt 0.103 0.072 0.149 tot 0.537 0.332 0.871 /* Line 4 of table */ ods select ParameterEstimates; proc phreg data = uis; model time*censor(0) = treat2 off_trt tot / risklimits; treat2 = 1 - treat; if time <= lot then off_trt = 0; else off_trt = 1; tot = treat2*off_trt; run;
The PHREG Procedure Analysis of Maximum Likelihood Estimates Parameter Standard Variable DF Estimate Error Chi-Square Pr > ChiSq treat2 1 0.52388 0.22583 5.3814 0.0204 off_trt 1 2.89130 0.20501 198.8960 <.0001 tot 1 -0.62097 0.24630 6.3563 0.0117 Analysis of Maximum Likelihood Estimates Hazard 95% Hazard Ratio Variable Ratio Confidence Limits treat2 1.689 1.085 2.629 off_trt 18.017 12.055 26.927 tot 0.537 0.332 0.871
Table 7.5 on page 222 using the grace1000 data.
data grace1000; set grace1000; age_inv = (1/age)*1000; sysbp_sqrt = sqrt(sysbp); run; ods output ParameterEstimates=out1; proc phreg data = grace1000; model days*death(0) = revasc age_inv sysbp_sqrt stchange; 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 REVASC -0.530 0.1172 -4.52 0.000 -0.759 -0.300 age_inv -0.189 0.0225 -8.41 0.000 -0.233 -0.145 sysbp_sqrt -0.207 0.0387 -5.36 0.000 -0.283 -0.132 STCHANGE 0.513 0.1188 4.32 0.000 0.280 0.746
Table 7.6 on page 223 using the grace1000 data.
ods output ParameterEstimates=out1; proc phreg data = grace1000; model days*death(0) = revasc_t age_inv sysbp_sqrt stchange; if days <= revascdays or revasc = 0 then revasc_t = 0; if days > revascdays and revasc = 1 then revasc_t = 1; 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 revasc_t -0.261 0.1237 -2.11 0.035 -0.503 -0.019 age_inv -0.202 0.0228 -8.84 0.000 -0.247 -0.157 sysbp_sqrt -0.215 0.0392 -5.48 0.000 -0.292 -0.138 STCHANGE 0.501 0.1191 4.20 0.000 0.267 0.734
Table 7.7 on page 223 using the grace1000 data.
proc freq data = grace1000; tables revascdays; where revasc = 1; run;
The FREQ Procedure Cumulative Cumulative REVASCDAYS Frequency Percent Frequency Percent --------------------------------------------------------------- 0 151 28.93 151 28.93 1 81 15.52 232 44.44 2 38 7.28 270 51.72 3 30 5.75 300 57.47 4 17 3.26 317 60.73 5 13 2.49 330 63.22 6 11 2.11 341 65.33 7 14 2.68 355 68.01 8 37 7.09 392 75.10 9 33 6.32 425 81.42 10 31 5.94 456 87.36 11 22 4.21 478 91.57 12 17 3.26 495 94.83 13 21 4.02 516 98.85 14 6 1.15 522 100.00
Table 7.8, page 225 using the grace1000 data.
NOTE: This code does not reproduce the results shown in the text.
ods select ParameterEstimates; proc phreg data = grace1000; model days*death(0) = r_t0 r_t1 r_t2_3 r_t_4_7 r_t_8_10 r_t_11_14 age_inv sysbp_sqrt stchange; if days > revascdays and revascdays = 0 and revasc = 1 then r_t0 = 1; else r_t0 = 0; if days > revascdays and revascdays = 1 and revasc = 1 then r_t1 = 1; else r_t1 = 0; if days > revascdays and 2 <= revascdays <= 3 and revasc = 1 then r_t2_3 = 1; else r_t2_3 = 0; if days > revascdays and 4 <= revascdays <= 7 and revasc = 1 then r_t_4_7 = 1; else r_t_4_7 = 0; if days > revascdays and 8 <= revascdays <= 10 and revasc = 1 then r_t_8_10 = 1; else r_t_8_10 = 0; if days > revascdays and 11 <= revascdays <= 14 and revasc = 1 then r_t_11_14 = 1; else r_t_11_14 = 0; run;
The PHREG Procedure Analysis of Maximum Likelihood Estimates Parameter Standard Hazard Variable DF Estimate Error Chi-Square Pr > ChiSq Ratio r_t0 1 -0.47098 0.18238 6.6689 0.0098 0.624 r_t1 1 -0.69605 0.32685 4.5351 0.0332 0.499 r_t2_3 1 0.03345 0.26459 0.0160 0.8994 1.034 r_t_4_7 1 0.04626 0.29155 0.0252 0.8739 1.047 r_t_8_10 1 -0.08362 0.23808 0.1234 0.7254 0.920 r_t_11_14 1 0.05509 0.26910 0.0419 0.8378 1.057 age_inv 1 -0.20073 0.02290 76.8588 <.0001 0.818 sysbp_sqrt 1 -0.21989 0.03929 31.3267 <.0001 0.803 STCHANGE 1 0.54015 0.12102 19.9208 <.0001 1.716
Table 7.9, page 225 using the grace1000 data.
NOTE: This code does not reproduce the results shown in the text.
ods select ParameterEstimates; proc phreg data = grace1000; model days*death(0) = r_t_0_1 r_t_2_14 age_inv sysbp_sqrt stchange; if days > revascdays and 0 <= revascdays <= 1 and revasc = 1 then r_t_0_1 = 1; else r_t_0_1 = 0; if days > revascdays and 2 <= revascdays <= 14 and revasc = 1 then r_t_2_14 = 1; else r_t_2_14 = 0; run;
The PHREG Procedure Analysis of Maximum Likelihood Estimates Parameter Standard Hazard Variable DF Estimate Error Chi-Square Pr > ChiSq Ratio r_t_0_1 1 -0.52332 0.16556 9.9911 0.0016 0.593 r_t_2_14 1 0.00495 0.15243 0.0011 0.9741 1.005 age_inv 1 -0.20124 0.02288 77.3821 <.0001 0.818 sysbp_sqrt 1 -0.22004 0.03915 31.5869 <.0001 0.802 STCHANGE 1 0.54755 0.12003 20.8104 <.0001 1.729
Table 7.11, page 226 using the grace1000 data.
NOTE: This code does not reproduce the results shown in the text.
ods select ParameterEstimates; proc phreg data = grace1000; model days*death(0) = revasc_t0_1 revasc_t2_14 age_inv sysbp_sqrt stchange / risklimits; if revasc = 0 or (revasc = 1 and revascdays >= 15) then do; revasc_t0_1 = 0; revasc_t2_14 = 0; end; if revasc = 1 and (revascdays <2) then do; revasc_t0_1 = 1; revasc_t2_14 = 0; end; if revasc = 1 and 2 <= revascdays <= 14 then do; revasc_t0_1 = 0; revasc_t2_14 = 1; end; run;
The PHREG Procedure Analysis of Maximum Likelihood Estimates Parameter Standard Variable DF Estimate Error Chi-Square Pr > ChiSq revasc_t0_1 1 -0.64091 0.16157 15.7353 <.0001 revasc_t2_14 1 -0.44869 0.13851 10.4937 0.0012 age_inv 1 -0.18861 0.02250 70.2870 <.0001 sysbp_sqrt 1 -0.20953 0.03874 29.2488 <.0001 STCHANGE 1 0.53129 0.11998 19.6079 <.0001 Analysis of Maximum Likelihood Estimates Hazard 95% Hazard Ratio Variable Ratio Confidence Limits revasc_t0_1 0.527 0.384 0.723 revasc_t2_14 0.638 0.487 0.838 age_inv 0.828 0.792 0.865 sysbp_sqrt 0.811 0.752 0.875 STCHANGE 1.701 1.345 2.152
Table 7.13 (text has no Table 7.12, but two 7.13s), page 229 using the whas500 data.
data t713a; set whas500; bmifp1=(bmi/10)**2; bmifp2=(bmi/10)**3; ag = age*gender; run; ods output ParameterEstimates=out1; proc phreg data = t713a; model lenfol*fstat(0) = bmifp1 bmifp2 age hr diasbp gender chf ag; where dstat = 0 and lenfol > los and id ~=416; 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; Variable Estimate StdErr z Sq lb ub bmifp1 -0.728 0.1936 -3.76 0.000 -1.108 -0.349 bmifp2 0.156 0.0438 3.55 0.000 0.070 0.241 AGE 0.067 0.0093 7.16 0.000 0.048 0.085 HR 0.014 0.0033 4.30 0.000 0.008 0.020 DIASBP -0.012 0.0039 -3.14 0.002 -0.020 -0.005 GENDER 2.498 1.0632 2.35 0.019 0.415 4.582 CHF 0.903 0.1626 5.55 0.000 0.584 1.221 ag -0.037 0.0134 -2.79 0.005 -0.064 -0.011
Table 7.13 on page 235 using the gbcs data.
data ch7t13b; set gbcs; months = 12*rectime/365.25; if 0 < months <= 12 then interv = 1; if 12 < months <= 24 then interv = 2; if 24 < months <= 36 then interv = 3; if 36 < months <= 48 then interv = 4; if 48 < months <= 60 then interv = 5; if 60 < months <= 72 then interv = 6; if months > 72 then interv = 7; run; proc freq data = ch7t13b; tables interv*censrec; run;
The FREQ Procedure Table of interv by CENSREC interv CENSREC Frequency| Percent | Row Pct | Col Pct | 0| 1| Total ---------+--------+--------+ 1 | 28 | 56 | 84 | 4.08 | 8.16 | 12.24 | 33.33 | 66.67 | | 7.24 | 18.73 | ---------+--------+--------+ 2 | 35 | 109 | 144 | 5.10 | 15.89 | 20.99 | 24.31 | 75.69 | | 9.04 | 36.45 | ---------+--------+--------+ 3 | 68 | 59 | 127 | 9.91 | 8.60 | 18.51 | 53.54 | 46.46 | | 17.57 | 19.73 | ---------+--------+--------+ 4 | 64 | 39 | 103 | 9.33 | 5.69 | 15.01 | 62.14 | 37.86 | | 16.54 | 13.04 | ---------+--------+--------+ 5 | 85 | 22 | 107 | 12.39 | 3.21 | 15.60 | 79.44 | 20.56 | | 21.96 | 7.36 | ---------+--------+--------+ 6 | 74 | 11 | 85 | 10.79 | 1.60 | 12.39 | 87.06 | 12.94 | | 19.12 | 3.68 | ---------+--------+--------+ 7 | 33 | 3 | 36 | 4.81 | 0.44 | 5.25 | 91.67 | 8.33 | | 8.53 | 1.00 | ---------+--------+--------+ Total 387 299 686 56.41 43.59 100.00
Table 7.14 on page 237 using the modified gbcs data from the previous example.
data ch7t14; set ch7t13b; z = 0; month = interv*12; do interval = 1 to interv; if interval = interv then z =censrec ; newid = 8; if id = 230 then newid = 1; if id = 621 then newid = 2; if id = 17 then newid = 3; if id = 321 then newid = 4; if id = 117 then newid = 5; if id = 288 then newid = 6; if id = 278 then newid = 7; output; end; run; proc sort data = ch7t14; by newid; run; proc print data = ch7t14 noobs; where id in(230, 621, 17, 321, 117, 288, 278); var id month interval censrec z age; run;
ID month interval CENSREC z AGE 230 12 1 1 1 46 621 12 1 0 0 65 17 24 1 1 0 62 17 24 2 1 1 62 321 24 1 0 0 43 321 24 2 0 0 43 117 36 1 1 0 65 117 36 2 1 0 65 117 36 3 1 1 65 288 36 1 0 0 57 288 36 2 0 0 57 288 36 3 0 0 57 278 60 1 1 0 70 278 60 2 1 0 70 278 60 3 1 0 70 278 60 4 1 0 70 278 60 5 1 1 70
Table 7.15 on page 237 using the modified gbcs data from a previous example.
* Recoding hormone from 1/2 to 0/1; data ch7t15; set ch7t14; hormone = hormone - 1; run; ods select ParameterEstimates; proc genmod data = ch7t15 desc; class interval; model z = age hormone size interval / noint link = cloglog dist = bin; run;
Analysis Of Parameter Estimates Standard Wald 95% Confidence Wald Parameter DF Estimate Error Limits Chi-Square Pr > ChiSq Intercept 0 0.0000 0.0000 0.0000 0.0000 . . AGE 1 0.0014 0.0061 -0.0107 0.0134 0.05 0.8235 HORMONE 1 -0.3576 0.1283 -0.6090 -0.1062 7.77 0.0053 SIZE 1 0.0147 0.0036 0.0077 0.0218 16.80 <.0001 interval 1 1 -2.8734 0.3712 -3.6009 -2.1459 59.92 <.0001 interval 2 1 -2.0087 0.3595 -2.7134 -1.3040 31.21 <.0001 interval 3 1 -2.3647 0.3695 -3.0890 -1.6405 40.95 <.0001 interval 4 1 -2.4392 0.3780 -3.1799 -1.6984 41.65 <.0001 interval 5 1 -2.6302 0.4023 -3.4187 -1.8417 42.74 <.0001 interval 6 1 -2.6680 0.4525 -3.5549 -1.7812 34.77 <.0001 interval 7 1 -2.7639 0.6781 -4.0930 -1.4349 16.61 <.0001 Scale 0 1.0000 0.0000 1.0000 1.0000 NOTE: The scale parameter was held fixed.
Figure 7.2, page 240
data ch7f2; set ch7t14; array dummy{7} int_1 - int_7; do i = 1 to 7; dummy(i) = 0; end; dummy(interval) = 1; run; ods output parameterestimates = b ; proc genmod data = ch7f2 desc; model z = age hormone size int_1 - int_7 / noint link = cloglog dist = bin; run; data b_1; set b end=last; retain age hormone size ; retain s_h s_nh; retain time 0; if Parameter = "AGE" then age = estimate; else if Parameter = "HORMONE" then hormone = estimate; else if Parameter = "SIZE" then size = estimate; else do; if parameter ="int_1" then do; s_nh = exp(-exp(estimate))**(exp(age*53 + size*25)); s_h = exp(-exp(estimate))**(exp(age*53 + size*25 + hormone)); time = 12; end; else if ~last then do; s_nh = s_nh* exp(-exp(estimate))**(exp(age*53 + size*25)); s_h = s_h* exp(-exp(estimate))**(exp(age*53 + size*25 + hormone)); time = time + 12; end; end; if parameter = "int_7" then time = 90; if last then do; time = 0; s_nh = 1; s_h = 1; end; run; proc sort data = b_1; by time; run; data annolegend; length function style color $8 text $22; retain xsys ysys '1' when 'a' color 'black'; function='move'; x=5; y=10; output; function='draw'; x=1; y=10; line=14; output; function='label'; x=7; y=10; position='6'; text='No Hormone Use'; output; function='move'; x=5; y=13; output; function='draw'; x=1; y=13; line=1; output; function='label'; x=7; y=13; position='6'; text='Hormone Use'; output; run; goptions reset=all; axis1 order=(0 to 1 by .2) label=(a=90 'Covariate Adjusted Survival Function') minor=none; axis2 order=(0 to 96 by 12) label=('Recurrence Time (Months)') minor=none; symbol1 i=stepjll v=none c=black line=1; symbol2 i=stepjll v=none c=black line=14; proc gplot data = b_1; plot (s_h s_nh)*time /overlay vaxis=axis1 haxis = axis2 annotate = annolegend; run; quit;