High Resolution Plot of Response Surface and Ridge

 /****************************************************************/
 /*          S A S   S A M P L E   L I B R A R Y                 */
 /*                                                              */
 /*    NAME: RSREGPLT                                            */
 /*   TITLE: High Resolution Plot of Response Surface and Ridge  */
 /* PRODUCT: STAT GRAPH                                          */
 /*  SYSTEM: ALL                                                 */
 /*    KEYS: response surface methods, graphics                  */
 /*   PROCS: RSREG GCONTOUR                                      */
 /*    DATA: Frankel (1961), reported in Myers (1976), p. 158.   */
 /*                                                              */
 /* SUPPORT: RDT                   UPDATE: January 2010          */
 /*     REF: Myers, Raymond H. (1976), "Response Surface Metho-  */
 /*              dology", Blacksburg, Virginia: Virginia Poly-   */
 /*              technic Institute and State University.         */
 /*    MISC:                                                     */
 /*                                                              */
 /****************************************************************/

 /*
 /  The data is from a rotatable central composite design with two
 /  factor variables: the object is to find the settings of process
 /  time and temperature which maximize the yield of a chemical.
 /---------------------------------------------------------------*/
data design;
   length Position $ 1;
   input Time Temp MBT Position;
   label time = "Reaction Time (Hours)"
         temp = "Temperature (Degrees Centigrade)"
         mbt  = "Percent Yield Mercaptobenzothiazole";
   datalines;
      4.0   250   83.8  3
      4.0   250   82.0  9
      6.3   229   81.3  2
      6.3   271   83.1  2
     12.0   220   84.7  2
     12.0   250   82.4  1
     12.0   250   82.9  7
     12.0   250   81.2  6
     12.0   280   57.9  8
     17.7   229   85.3  8
     17.7   271   72.7  2
     20.0   250   81.7  2
     ;

 /*
 /  RSREG compute the predicted surface on a grid of points over
 /  the region of interest in its surface plot; output that plot
 /  in CONTOUR.  Also output the ridge of maximum predicted yield
 /  in RIDGE.
 /---------------------------------------------------------------*/

ods graphics on;
proc rsreg data=design plots=surface;
   model mbt = time temp / lackfit predict;
   ridge max outr=ridge;
   ods output contour=contour;
run;

 /*
 /  To draw arrows from the previous ridge value to the next value,
 /  you need coordinates for the base of the arrow (time0,temp0)
 /  and the head of the arrow (time1,temp1).
 /---------------------------------------------------------------*/

data ridge start;
   set ridge;
   retain time0 temp0 time1 temp1 0;
   keep time0 temp0 time1 temp1;
   time1=time;
   temp1=temp;
   if (_n_>1) then output ridge;
   time0=time;
   temp0=temp;
run;

 /*
 /  The surface plots use internal names for the X and Y grid
 /  coordinates.
 /  PROC CONTENTS shows you the names and their labels, and the
 /  next data step gives the variables more appropriate names.
 /  _X_Time and _X_Temp are the values for the design points.
 /---------------------------------------------------------------*/

proc contents data=contour;
run;
data contour(rename=(Factor1_0_1_0_0=time
                     Factor2_0_1_0_0=temp
                     Predicted0_1_0_0=pred
                     StandardError0_1_0_0=stderr));
   set contour;
run;

 /*
 /  Finally put the surface and the ridge data together.
 /---------------------------------------------------------------*/

data contour;
   merge contour ridge;
run;

 /*
 /  You can display the template that creates the Stat.RSREG.Graphics.Contour
 /  plot with this command:
 /     proc template; source Stat.RSREG.Graphics.Contour;
 /  The important parts are extracted into the MYTPL template, which
 /  is then combined with the CONTOUR data by the PROC SGRENDER call.
 /---------------------------------------------------------------*/

proc template;
define statgraph mytpl;
   BeginGraph / designWidth=540;
    entrytitle "Response Contour for MBT with Ridge of Maximum Predicted Yield";
    layout overlay / aspectratio=1
                     yaxisopts=(gridDisplay=auto_off
                                offsetmin=0 offsetmax=0
                                linearopts=(thresholdmin=0 thresholdmax=0))
                     xaxisopts=(gridDisplay=auto_off
                                offsetmin=0 offsetmax=0
                                linearopts=(thresholdmin=0 thresholdmax=0));
      contourplotparm z=stderr y=time x=temp
         / colormodel=TwoColorRamp contourtype=gradient nlevels=1 name="StdErr";
      contourplotparm z=pred y=time x=temp
         / contourtype=labeledline linelabelformat=best5. NHINT=10
           primary=true;
      scatterplot x=_X_Temp y=_X_Time / name="Design"
           markerattrs=GraphDataDefault(color=GraphOutlier:ContrastColor);
      vectorplot yorigin=time0 y=time1 xorigin=temp0 x=temp1;
      continuouslegend "StdErr" / title="Standard Error";
   endlayout;
   EndGraph;
end;
run;

proc sgrender data=contour template=mytpl;
run;

ods html close;