source: main/adopters/mt/trunk/src/main/backend_qModules/birth23/test/MT_Percentage_data_frame.def @ 19749

Last change on this file since 19749 was 19749, checked in by Paul Leo, 3 years ago

A few more tweaks to cell suppression, and changing .cfg to work in MT's environment

File size: 10.5 KB
Line 
1#MT_Percentage_data_frame.def
2#Generic percentage .def file
3#Uses %spvar1% in place of name of variable and the var level for percentage calculation [e.g., "bwtgp in (1 2)"]
4#spvar1 is set in Module.xml file as a configuration parameter value
5#MT_ version checks MT population data file for population size for cell suppression
6#MT_ version provides reliability_flag data
7#
8f type special
9#modify condition that sets percentvar=1
10#########################################
11--------BoNdArY--------
121 script
13OPTIONS MPRINT MLOGIC SYMBOLGEN NONUMBER NODATE PAGESIZE=4000 LINESIZE=200;
14OPTION SPOOL;
15
16 ************************** 1. TMP ******************************;
17 * The dataset 'tmp' is the numerator dataset with any filters   ;
18 * already applied (e.g., filtered to specific sex, age, year,   ;
19 * etc. population groups). The proc summary counts deaths       ;
20 * computes summary statistics by cross1 and cross2 on age.      ;
21 ****************************************************************;
22        data tmp; set tmp;
23                percentvar=0;
24                if %spvar1% then percentvar=1;
25        run;
26        proc summary data=tmp;
27                var percentvar;
28                class %cross1%
29                ?cross2? %cross2%
30                ;
31                output out=tmp sum=count n=totalnum
32        run;
33        proc sort data=tmp; by %cross1%
34                ?cross2? %cross2%
35                ; run;
36        proc print data=tmp noobs;
37                title1 '---------------------------------';
38                title2 '1. TMP - numerator dataset';
39                run;
40       
41 *********************** 2. data_frame **************************;
42 * df_%cross1%%cross2% is a dataset created by IBIS-Q.   ;
43 * It consists of %cross1% and %cross2% (if the user specified   ;
44 * %cross2%) and a variable named "count" that is set to "0".    ;
45 * The results of the proc summary must be merged with the       ;
46 * df_%cross1%%cross2% dataset.                          ;
47 ****************************************************************;
48        data frame;
49                set df_%cross1%%cross2%;
50                run;
51        proc sort data=frame; by %cross1%
52                ?cross2? %cross2%
53                ; run;
54        proc print data=frame noobs;
55                title2 '2. Data Frame';
56                run;
57               
58        data new;
59
60                merge frame tmp;   *must list frame dataset first, then tmp;
61                by %cross1%
62                   ?cross2? %cross2%
63                ;
64                run;
65        proc print data=new noobs;
66                title2 '2. NEW, after frame merged with tmp';
67                run;
68        data tmp;
69                set new;
70                drop _TYPE_ _FREQ_;
71               
72                *Only keep the grand total;
73                ?cross2? if %cross1% = . and %cross2% ^= . then delete;
74                ?cross2? if %cross1% ^= . and %cross2% = . then delete;
75       
76                run;           
77                       
78        proc print data=tmp noobs;
79                title2 '2. TMP';
80                run;
81
82 *************** 3. Flag variable and popcross macro *************;
83 * The flag variable checks the cross variables for presence of   ;
84 * variables that are found in the population dataset. IBIS-q     ;
85 * created popcross vars based on info from the .CFG file.        ;
86 * The popcross macro will merge the numerator and denominator    ;
87 * data, matching up the appropriate values of the cross vars.    ;
88 *****************************************************************;
89 * IBIS does not need the population dataset to produce a percent.;
90 * The following code, through the end of the macro, is used to   ;
91 * check numerator and denominator counts for cell suppression.   ;
92 *****************************************************************;
93        %let flag=0;
94        ?popcross1? %let flag=1;
95        ?popcross2? %let flag=1;
96        ?popcross1? ?popcross2? %let flag=2;
97
98        %macro popcross;
99
100        %if &flag=0 %then %do;
101                proc summary data=poptmp;
102                        var popcount;
103                        output out=pop sum=popcount;
104                run;
105                proc sql;
106                        create table rate as
107                        select tmp.*, pop.*
108                        from tmp, pop
109                quit;
110        %end;
111
112        %if &flag=1 %then %do;
113                proc summary data=poptmp;
114                        var popcount;
115                        class %popcross1% %popcross2%;
116                        output out=pop sum=popcount;
117                run;
118                proc sql;
119                        create table rate as
120                        select tmp.*, pop.*
121                        from tmp, pop
122                        where
123                        ?popcross1? tmp.%cross1%=pop.%popcross1%;
124                        ?popcross2? tmp.%cross2%=pop.%popcross2%; 
125                quit;
126        %end;
127
128        %if &flag=2 %then %do;
129                proc summary data=poptmp;
130                        var popcount;
131                        class %popcross1% %popcross2%  ;
132                        output out=pop sum=popcount;
133                run;
134                proc sql;
135                        create table rate as
136                        select tmp.*, pop.*
137                        from tmp, pop
138                        where tmp.%cross1%=pop.%popcross1% and
139                        tmp.%cross2%=pop.%popcross2%;
140                quit;
141        %end;
142        %mend;
143        %popcross;
144        proc print data=rate noobs;  title2 '3. RATE - tmp merged with pop dataset';
145
146 ********************** 4. tmp, again Redflag and cell suppression *************;
147 * Create the output variables for the IBIS xml/map file.                                               ;
148 * Add Redflag                                                                                                                                  ;
149 *              Redflag is used to describe why valuses have been suppressed                    ;
150 *              Redflag values created here may be converted to images or special               ;
151 *              characters in IBIS-View application XSLTfiles, for instance:                    ;
152 *              (xslt\html\query\module\result\ResultPage.xslt, ...Values.xslt)                 ;
153 *                                                                                                                                                              ;
154 * And Apply Montana specific Small numbers rules as follows                                    ;
155 *      (Comments include rulse for Vital Statistics Counts and Rates(                          ;
156 *  1. If denominator (popcount > 300)                                                                                  ;
157 *      1a. If count <5                                                                                                                 ;
158 *                      Suppress cells                                                                                                          ;
159 *              1b. Suppress complimentarty cells if you can arrive at the                              ;
160 *                      number in a cell less than 5 by  subtraction                                            ;
161 *              Note: I think we just suppress everything in case #1a and 1b                    ;
162 *              2. If count > 5 and < 20                                                                                                ;
163 *                      Supress rates, but compute counts                                                                       ;
164 *              This would include rates like deaths per 100,000, low birth                     ;
165 *              weight as % of live births, or ratios like maternal mortality           ;
166 *              per 100 live births.                                                                                            ;
167 *              if 20<=count<=100       (events between 20 and 100)                                                     ;
168 *                      (according to Cody this does not apply for avgs??                                       ;
169 *  2. If denominater (popcount < 300)                                                                                  ;
170 *              2a. If count > 20                                                                                                               ;
171 *                      Report count and rates with confidence intervals                                        ;
172 *              2b. If count < 20                                                                                                               ;
173 *                      Suppress rates and counts                                                                                       ;
174 * ZW-s program uses ".A" to identify cells for suppression.                            ;
175 *     I have co-opted his method so I can use the MT logic for cell                    ;
176 *     suppression instead of the standard IBIS logic. And I need to use                ;
177 *     ZWs program because it will suppress the table marginals that can                ;
178 * be used to calculate the suppressed cells. If this code is used,                             ;
179 *     the .def file should have the MT_ prefix. Needs suppressed_variables     ;
180 * code at the end of this file to work.                                                                                ;
181 *******************************************************************************;
182
183        data tmp;
184                set rate;
185                n=count;  *ibis-q needs a count variable named 'n';
186                rate=count/totalnum;
187
188                if popcount>=300 then do;
189
190                        *   Suppress cells if absolute count <5;
191                       
192                                       
193                        if count=0 and 1<totalnum<5 then do;    * also need to test for count = 0, but # births (totalnum) < 5;
194                                rateper=.A;
195                                LL=.A;
196                                UL=.A;
197                                redflag=put('Suppressed', $15.);
198                        end;
199                        else if count = 0 then do;
200                                rateper=.A;
201                                LL=.A;
202                                UL=.A;
203                        end;
204                        if 1<=count<5 then do;
205                                rateper=.A;
206                                LL=.A;
207                                UL=.A;
208                                totalnum=.A;
209                                redflag=put('Suppressed', $15.);
210                                n=.A;
211                        end;
212
213                        *   do not compute rates based on fewer than 20 events, but provide counts;
214                       
215                        if 5<=count<20 then do;
216                                rateper=.A;
217                                LL=.A;
218                                UL=.A;
219                                redflag=put('Suppressed %', $16.);
220                        end;
221
222                        if 20<=count<=100 then do;
223                        * for events between 20 and 100, use Poisson to calculate confidence intervals;
224
225                                rateper=(rate*100);
226                                t1= GAMINV(.025,count)/totalnum*100;
227                                if (t1<0) then t1=0;
228                                LL=put(t1, 8.2);
229                                UL=put(( GAMINV(.975,count)/totalnum*100),8.2);
230                        end;
231
232                        *  and normal approximation for more than 100 events. ;
233                       
234                        if count>100 then do;
235                                rateper=(rate*100);
236                                stderr=sqrt(rate*(1-rate)/totalnum)*100;
237                                t1=(rateper-(1.96*stderr));
238                                if (t1<0) then t1=0;
239                                LL=put(t1, 8.2);
240                                UL=put((rateper+(1.96*stderr)), 8.2);
241                                LL=compress(LL);
242                                UL=compress(UL);
243                                redflag=put('-', $15.);
244                        end;
245                end;
246               
247                if popcount<300 then do;
248
249                        *  suppress if popcount <300 and count < 20 events      ;
250               
251                        if count=0 then do;     * also need to test for count = 0, but # births (totalnum) < 20;
252                                rateper=.A;
253                                LL=.A;
254                                UL=.A;
255                                if 1<=totalnum<20 then totalnum=.A;
256                                redflag=put('Suppressed', $15.);
257                        end;
258                       
259                        if 1<=count<20 then do;
260                                rateper=.A;
261                                LL=.A;
262                                UL=.A;
263                                totalnum=.A;
264                                redflag=put('Suppressed', $15.);
265                                n=.A;
266                        end;
267                       
268                       
269                        * report rate and n if popcount <300 and count >= 20 events.    ;
270
271                        if 20<=count<=100 then do;
272                        * for events between 20 and 100, use Poisson to calculate confidence intervals;
273
274                                rateper=(rate*100);
275                                t1= GAMINV(.025,count)/totalnum*100;
276                                if (t1<0) then t1=0;
277                                LL=put(t1, 8.2);
278                                UL=put(( GAMINV(.975,count)/totalnum*100),8.2);
279                        end;
280
281                        *  and normal approximation for more than 100 events. ;
282                       
283                        if count>100 then do;
284                                rateper=(rate*100);
285                                stderr=sqrt(rate*(1-rate)/totalnum)*100;
286                                t1=(rateper-(1.96*stderr));
287                                if (t1<0) then t1=0;
288                                LL=put(t1, 8.2);
289                                UL=put((rateper+(1.96*stderr)), 8.2);
290                                LL=compress(LL);
291                                UL=compress(UL);
292                                redflag=put('-', $15.);
293                        end;
294                end;
295               
296                if count=0 then do;
297                        rateper=.A;
298                        LL=.A;
299                        UL=.A;
300                        totalnum=.A;
301                end;
302               
303                if count<0 then do;
304                        rateper=.A;
305                        LL=.A;
306                        UL=.A;
307                        totalnum=.A;
308                        redflag=put('No Variance', $15.);  *no variance;
309                end;
310
311        proc print data=tmp;  title2 '4. tmp again - output variables for the IBIS xml/map and Redflag and cell suppression';
312        run;
313 
314--------BoNdArY--------
315# definition for output file
316f out_variable rateper
317f xml_out_map_file XMLPercentNumerDenomLCLUCL.map
318--------BoNdArY--------
319f out_detail lbl_not_used__see_xml_out_map_file
320  rateper 15.2
321  n 15.0
322  totalnum 15.0
323  LL 15.2
324  UL 15.2
325  redflag 16.0
326--------BoNdArY--------
327 
328 ****************** 5. SUPPRESSED VARIABLES *************************;
329 * ZW-s CGI program must be told how many variables it will need to  ;
330 * suppress and which ones they are. NOTE: If the SAS code, above, is;
331 * commented out, these lines can be left in the .def file without   ;
332 * causing any problems. They will only be used if the SAS code,     ;
333 * above is active, OR if the small_num and small_pop parameters     ;
334 * are active in the .CFG file, and with non-zero values.            ;
335 ********************************************************************;
336--------BoNdArY--------
3371 suppressed_variables 5
338  rateper
339  totalnum
340  n
341  LL
342  UL
343--------BoNdArY--------
Note: See TracBrowser for help on using the repository browser.