It shouldn't be necessary to make the conversion and use Proc MEANS. You could just use Proc SURVEYFREQ instead which gives standard errors for both the percentages and the frequencies. You could do something similar to the example below.
/* Getting Started Example 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; title 'School Information System Survey'; proc sort data=SIS_Survey; by _imputation_; /*Run SURVEYFREQ by _IMPUTATION_ assuming the MI step is already done*/ proc surveyfreq data=SIS_Survey; by _imputation_; tables state*Response/wtfreq; ods output crosstabs=ctab; ods trace on; run; proc print; run;
/*Sort the data by the TABLES variable which is called RESPONSE here*/ proc sort; by state response _imputation_; run;
/*Run MIANALYZE with STDERR option for percentages*/ proc mianalyze data=ctab; by state response;*this would be the TABLES variable; modeleffects percent; stderr stdErr; title 'Results of for Proportions'; run; /*Run MIANALYZE with STDERR option for Frequencies*/ proc mianalyze data=ctab; by state response;*this would be the TABLES variable; modeleffects WgtFreq; stderr StdDev; title 'Results of for Frequencies'; run;
... View more