In order to combine point estimates for any statistic in a multiple imputation setting, you must have a standard error associated with that point estimate. The issue with using Proc FREQ is that it does not give you standard errors for either the percentages or the frequencies. My suggestion would be to use Proc SURVEYFREQ instead and combine the results similar to the approach in the attached example. Note that you must use the WTFREQ option on the TABLES statement even if you do not have a WEIGHT statement in order to get a standard error.
/* Generate Data */
proc format; value ResponseCode 1 = 'Very Unsatisfied' 2 = 'Unsatisfied' 3 = 'Neutral' 4 = 'Satisfied' 5 = 'Very Satisfied'; run;
proc format; value UserCode 1 = 'New Customer' 0 = 'Renewal Customer'; run;
proc format; value SchoolCode 1 = 'Middle School' 2 = 'High School'; run;
proc format; value DeptCode 0 = 'Faculty' 1 = 'Admin/Guidance'; run;
data SIS_Survey; format Response ResponseCode.; format NewUser UserCode.; format SchoolType SchoolCode.; format Department DeptCode.; do _imputation_=1 to 2; drop j; retain seed1 111; retain seed2 222; retain seed3 333;
State = 'GA';
NewUser = 1; do School=1 to 71;
call rantbl( seed1, .45, .55, SchoolType );
Department = 0; call rannor( seed3, x ); SamplingWeight = 25 + x * 2; do j=1 to 2; if ( SchoolType = 1 ) then call rantbl( seed2, .16, .21, .30, .24, .09, Response); else call rantbl( seed2, .18, .23, .30, .22, .07, Response); output; end; output;
Department = 1; call rannor( seed3, x ); SamplingWeight = 15 + x * 1.5; do j=1 to 2; if ( SchoolType = 1 ) then call rantbl( seed2, .10, .15, .33, .28, .14, Response ); else call rantbl( seed2, .13, .20, .30, .26, .11, Response); output; end; end;
NewUser = 0; do School=72 to 134;
call rantbl( seed1, .45, .55, SchoolType );
Department = 0; call rannor( seed3, x ); SamplingWeight = 25 + x * 2; do j=1 to 2; if ( SchoolType = 1 ) then call rantbl( seed2, .16, .21, .30, .24, .09, Response); else call rantbl( seed2, .18, .23, .30, .22, .07, Response); output; end; output;
Department = 1; call rannor( seed3, x ); SamplingWeight = 15 + x * 1.5; do j=1 to 2; if ( SchoolType = 1 ) then call rantbl( seed2, .10, .15, .33, .28, .14, Response ); else call rantbl( seed2, .13, .20, .30, .26, .11, Response); output; end; end;
State = 'NC';
NewUser = 1; do School = 135 to 218;
call rantbl( seed1, .45, .55, SchoolType );
Department = 0; call rannor( seed3, x ); SamplingWeight = 25 + x * 2;
if ( SchoolType = 1 ) then call rantbl( seed2, .16, .21, .30, .24, .09, Response); else call rantbl( seed2, .18, .23, .30, .22, .07, Response); output; output; output;
Department = 1; call rannor( seed3, x ); SamplingWeight = 15 + x * 1.5;
if ( SchoolType = 1 ) then call rantbl( seed2, .10, .15, .33, .28, .14, Response ); else call rantbl( seed2, .13, .20, .30, .26, .11, Response); output; output; end;
NewUser = 0; do School = 219 to 274;
call rantbl( seed1, .45, .55, SchoolType );
Department = 0; call rannor( seed3, x ); SamplingWeight = 25 + x * 2; do j=1 to 2; if ( SchoolType = 1 ) then call rantbl( seed2, .16, .21, .30, .24, .09, Response); else call rantbl( seed2, .18, .23, .30, .22, .07, Response); output; end; output;
Department = 1; call rannor( seed3, x ); SamplingWeight = 15 + x * 1.5;
if ( SchoolType = 1 ) then call rantbl( seed2, .10, .15, .33, .28, .14, Response ); else call rantbl( seed2, .13, .20, .30, .26, .11, Response); output; output; end;
State = 'SC';
NewUser = 1; do School = 275 to 328;
call rantbl( seed1, .45, .55, SchoolType );
Department = 0; call rannor( seed3, x ); SamplingWeight = 25 + x * 2; do j=1 to 2; if ( SchoolType = 1 ) then call rantbl( seed2, .16, .21, .30, .24, .09, Response); else call rantbl( seed2, .18, .23, .30, .22, .07, Response); output; end; output;
Department = 1; call rannor( seed3, x ); SamplingWeight = 15 + x * 1.5;
if ( SchoolType = 1 ) then call rantbl( seed2, .10, .15, .33, .28, .14, Response ); else call rantbl( seed2, .13, .20, .30, .26, .11, Response); output; output; end;
NewUser = 0; do School = 329 to 370;
call rantbl( seed1, .45, .55, SchoolType );
Department = 0; call rannor( seed3, x ); SamplingWeight = 25 + x * 2; do j=1 to 2; if ( SchoolType = 1 ) then call rantbl( seed2, .16, .21, .30, .24, .09, Response); else call rantbl( seed2, .18, .23, .30, .22, .07, Response); output; end; output;
Department = 1; call rannor( seed3, x ); SamplingWeight = 15 + x * 1.5;
if ( SchoolType = 1 ) then call rantbl( seed2, .10, .15, .33, .28, .14, Response ); else call rantbl( seed2, .13, .20, .30, .26, .11, Response); output; output; end; end; run; /*Run SURVEYFREQ by _IMPUTATION_ assuming the MI step is already done*/ proc surveyfreq data=SIS_Survey; by _imputation_; tables Response*schooltype/wtfreq; ods output CrossTabs=mi_ctab; run;
/*Sort the data by the TABLES variables which is called RESPONSE here*/ proc sort data=mi_ctab; by response schooltype _imputation_; run;
/*Run MIANALYZE with STDERR option*/ proc mianalyze data=mi_ctab; by response schooltype;*this would be the TABLES variable; modeleffects wgtfreq; stderr stdDev; title 'Results for Weighted Frequency'; run;
... View more