Documentation Example 4 for PROC SURVEYIMPUTE

/*********************************************************************/
/*          S A S   S A M P L E   L I B R A R Y                      */
/*                                                                   */
/*    NAME: SVIMPEX4                                                 */
/*   TITLE: Documentation Example 4 for PROC SURVEYIMPUTE            */
/* PRODUCT: STAT                                                     */
/*  SYSTEM: ALL                                                      */
/*    KEYS: FHDI, NHANES, BRR, REPWEIGHTS                            */
/*   PROCS: SURVEYIMPUTE, SURVEYMEANS, SURVEYREG                     */
/*    DATA: NHANES III                                               */
/*    URL:  http://www.cdc.gov/nchs/nhanes/about_nhanes.htm          */
/* SUPPORT: Pushpal Mukhopadhyay                                     */
/*  UPDATE: March 30, 2018                                           */
/*     REF:                                                          */
/*    MISC: You must download the core and imp1 data sets from       */
/*          NHANES III before running the sample program. See the    */
/*          description in the example about how to create the       */
/*          HealthMiss data set that is used in this example.        */
/*********************************************************************/

/*
data Health;
   merge nh3mi.core (keep=seqn hff1if han6srif hat28if bmphtif bmpwtif
                          pep6g3if hsageir dmarethn hssex hshsizer
                          hfa8 hfa12 wtp: sdpstra6 sdppsu6)
         nh3mi.imp1 (keep=seqn hff1mi han6srmi hat28mi bmphtmi bmpwtmi
                          pep6g3mi);
   by seqn;
run;
data Health; set Health;
   where hsageir >= 17 and hsageir <= 60;
run;

*Use age and household size to create imputation clusters;
proc fastclus data=Health out=HealthClust maxc=5 maxiter=100;
   var hsageir hshsizer;
run;

data HealthClust; set HealthClust;
   if hfa12 <=3 then Married=1;
   else Married=0;
run;
*Add missing values;
data HealthMiss; set HealthClust;
   if hff1if   = 2 then hff1mi  =.;
   if han6srif = 2 then han6srmi=.;
   if hat28if  = 2 then hat28mi =.;
   if bmphtif  = 2 then bmphtmi =.;
   if bmpwtif  = 2 then bmpwtmi =.;
   if pep6g3if = 2 then pep6g3mi=.;
run;

proc format;
   value MarriedFmt 1="Married" 0="Not Married";
run;

data HealthMiss; set HealthMiss;
   format Married MarriedFmt.;
run;

*---Create bins for continuous variables---;
data HealthMiss; set HealthMiss;
   if bmphtmi       = .     then bmphtlev=.;
   else if bmphtmi <= 162.6 then bmphtlev=1;
   else if bmphtmi <= 171.5 then bmphtlev=2;
   else                          bmphtlev=3;
   if bmpwtmi       = .    then bmpwtlev=.;
   else if bmpwtmi <= 65.7 then bmpwtlev=1;
   else if bmpwtmi <= 80.2 then bmpwtlev=2;
   else                         bmpwtlev=3;
   if pep6g3mi       = .    then pep6g3lev=.;
   else if pep6g3mi <= 65.3 then pep6g3lev=1;
   else if pep6g3mi <= 75.8 then pep6g3lev=2;
   else                          pep6g3lev=4;
   label bmphtlev  = "Bin values for BMPHTMI"
         bmpwtlev  = "Bin values for BMPWTMI"
         pep6g3lev = "Bin values for PEP6G3MI";
run;

proc surveyimpute data=HealthMiss method=fhdi varmethod=brr
                       ndonors=5 seed=9388401;
   id seqn;
   class hff1mi hat28mi;
   weight wtpfqx6;
   repweights wtpqrp:;
   cells cluster married;
   var hff1mi hat28mi bmphtmi (clevvar=bmphtlev)
                      bmpwtmi (clevvar=bmpwtlev)
                      pep6g3mi(clevvar=pep6g3lev);
   output out=HealthFHDI;
run;

ods graphics on;
proc surveymeans data=HealthFHDI varmethod=brr(Fay=0.3) plots=domain;
   weight ImpWt;
   repweights ImpRepWt_:;
   var pep6g3mi;
   domain hff1mi;
run;

proc surveyreg data=HealthFHDI varmethod=brr(Fay=0.3);
   weight ImpWt;
   repweights ImpRepWt_:;
   class hff1mi hssex;
   model pep6g3mi = hff1mi hssex bmphtmi bmpwtmi hsageir / solution;
   output out=Resid residual=Residuals predicted=Fitted;
run;

*---Modify the ODS template to customize plot title---;
data Resid; set Resid;
   label Fitted ='Fitted Values'
         Residuals = 'Residuals';
run;
proc template;
   source Stat.SurveyReg.FitHeatHex / file='sr.tpl';
quit;
data _null_;
   infile 'sr.tpl' end=eof;
   input;
   if findw(_infile_, 'entrytitle YVARLABEL " Fit Plot"') then do;
      _infile_ = tranwrd(_infile_, 'entrytitle YVARLABEL " Fit Plot"',
                                   'entrytitle "Residuals Plot"');
   end;
   if findw(_infile_, 'discretelegend "Fit" "Confidence"') then do;
      _infile_ = tranwrd(_infile_, 'discretelegend "Fit" "Confidence"',
                                   '');
   end;
   if _n_ = 1 then call execute('proc template;');
   call execute(_infile_);
   if eof then call execute('quit;');
run;

proc surveyreg data=resid plots(nbins=60)=fit(shape=hexagonal);
   model Residuals=Fitted;
   weight impwt;
run;

*/