options macrogen; PROC IMPORT OUT= WORK.Steroid DATAFILE= "C:\Documents and Settings\woodph\My Documents\glmwood\kutnersolutions\Chapter11\chapter11.xls" DBMS=EXCEL REPLACE; SHEET="CH11TA08$"; GETNAMES=YES; MIXED=NO; SCANTEXT=YES; USEDATE=YES; SCANTIME=YES; RUN; data totvars; %macro regtree(low, high, dsn, xvar, yvar, step, group); proc sort data=&dsn out=&dsn;by &group &xvar; data rmsea;*data set to accumulate SS error terms; %do value=&low %to &high %by 1; proc reg noprint data=&dsn edf outest=varsh; where &xvar>=&value; model &yvar=;by &group; proc reg noprint data=&dsn edf outest=varsl; where &xvar<&value; model &yvar=;by &group; data rmses;set varsh varsl; cutval=&value; ss=_rmse_*_rmse_*_edf_; data rmsea;set rmsea rmses; %end; proc print;var cutval ss intercept &xvar; title "Individual ss for low versus high regressions as a function of cut values"; *Calculate SS error associated with cut value; proc means sum noprint;class cutval &group;var ss; output out=criter sum=sse; data criter;set criter; if &group>. and cutval>.; proc means sum noprint;class cutval;var sse; output out=criter2 sum=sse; data criter2;set criter2; if cutval>.; proc sort data=criter2 out=criter2;by sse; data _null_;set criter2;if _n_=1;*Assign cutvalue; call symput('cut',trim(left(put(cutval,8.)))); proc print data=criter2; title 'All possible SS error terms. Optimum cut point at ' &cut;run; proc delete data=criter criter2;run; data &dsn;set &dsn; if &xvar<&cut and &xvar>. then group=group*10+0;else group=group*10+1; %mend regtree; data steroid;set steroid; group=1;run; proc print; title "Original Data";run; %regtree(low=8,high=25,dsn=steroid,xvar=age,yvar=steroid,step=1,group=group); %regtree(low=8,high=25,dsn=steroid,xvar=age,yvar=steroid,step=1,group=group); %regtree(low=8,high=25,dsn=steroid,xvar=age,yvar=steroid,step=1,group=group); %regtree(low=8,high=25,dsn=steroid,xvar=age,yvar=steroid,step=1,group=group); proc print data=steroid; title "Final data and assigned group";run; proc means min max mean;class group; var steroid age; title "summary information on trees by group";run; proc means;class group;var steroid; output out=grpmean mean=mster; title "Calculation of Group means on criterion. Refer to Table 11.8, columns 5 & 6"; data grpmean;set grpmean;if group>.; proc sort data=grpmean out=grpmean;by group; proc sort data=steroid out=steroid;by group; data steroid;merge steroid grpmean;by group; proc sort data=steroid out=steroid;by group; symbol1 i=none c=red v=:; symbol2 i=none c=blue v=dot; symbol3 i=none c=green v=square; symbol4 i=none c=black v==; symbol5 i=none c=red v=triangle; proc gplot; plot steroid*age=group; title "plot of group membership via different symbols";run; symbol1 i=step c=red v=none; symbol2 i=none v=dot c=blue; proc gplot; plot (mster steroid)*age /overlay;run; title "Calculation of observed versus predicted values. Refer to Figure 11.9 a, page 454";run; data steroid;set steroid; error=steroid-mster; proc gplot; plot error*mster; title "Plot of predicted by error values for regression tree. Refer to Figure 11.9b, page 454";run; proc means data=steroid;var steroid age;class group; output out=treevals min=minst minage max=maxst maxage mean=meanst meanage; proc print data=treevals;run;