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

Last change on this file since 20034 was 20034, checked in by Paul Leo, 2 years ago

First pass at using binomial exact confidence intervals.
For USE only on TEST!!!

File size: 10.8 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    events= or greater than 20                                                              ;
168 *                      use binomial exact confidence intervals                                                         ;
169 *  2. If denominater (popcount < 300)                                                                                  ;
170 *              2a. If count > 20                                                                                                               ;
171 *                      Report count and rates with confidence intervals                                        ;
172 *                              using binomial exact confidence intervals                                               ;
173 *              2b. If count < 20                                                                                                               ;
174 *                      Suppress rates and counts                                                                                       ;
175 * ZW-s program uses ".A" to identify cells for suppression.                            ;
176 *     I have co-opted his method so I can use the MT logic for cell                    ;
177 *     suppression instead of the standard IBIS logic. And I need to use                ;
178 *     ZWs program because it will suppress the table marginals that can                ;
179 * be used to calculate the suppressed cells. If this code is used,                             ;
180 *     the .def file should have the MT_ prefix. Needs suppressed_variables     ;
181 * code at the end of this file to work.                                                                                ;
182 *******************************************************************************;
183
184        data tmp;
185                set rate;
186                n=count;  *ibis-q needs a count variable named 'n';
187                rate=count/totalnum;
188                rateper=(rate*100);
189               
190                if popcount>=300 then do;
191
192                        *   Suppress cells if absolute count <5;
193                       
194                                       
195                        if count=0 and 1<totalnum<5 then do;    * also need to test for count = 0, but # births (totalnum) < 5;
196                                rateper=.A;
197                                LL=.A;
198                                UL=.A;
199                                redflag=put('Suppressed', $15.);
200                        end;
201                        else if count = 0 then do;
202                                rateper=.A;
203                                LL=.A;
204                                UL=.A;
205                        end;
206                        if 1<=count<5 then do;
207                                rateper=.A;
208                                LL=.A;
209                                UL=.A;
210                                totalnum=.A;
211                                redflag=put('Suppressed', $15.);
212                                n=.A;
213                        end;
214
215                        *   do not compute rates based on fewer than 20 events, but provide counts;
216                       
217                        if 5<=count<20 then do;
218                                rateper=.A;
219                                LL=.A;
220                                UL=.A;
221                                redflag=put('Suppressed %', $16.);
222                        end;
223                       
224                        * for events >= 20 use binomial exact confidence intervals;
225                       
226                        if count >= 20 then do;
227                                diffcountL=popcount-count-1;
228                                diffcountU=popcount-count;
229                                countplus1=count+1;
230                        /************* Keeping lines for steps to obtain  LL and UL    *************
231                                Lowerquant=betainv(.975,diffcountL,count);
232                                Upperquant=betainv(.025,diffcountU,countplus1);
233                                Lowerval=(1-Lowerquant)*100;
234                                Upperval=(1-Upperquant)*100;
235                                LL=rateper-Lowerval;
236                                UL=rateper+Upperval;
237                        ***************************************************************************/
238                                LL=rateper-(1-(betainv(.975,diffcountL,count)))*100;
239                                UL=rateper+(1-(betainv(.025,diffcountU,countplus1)))*100;
240                                LL=compress(LL);
241                                UL=compress(UL);
242                                redflag=put('-', $15.);
243                        end;
244                       
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, using binomial exact confidence intervals  ;
270
271                       
272                        if count >= 20 then do;
273                                diffcountL=popcount-count-1;
274                                diffcountU=popcount-count;
275                                countplus1=count+1;
276                        /************* Keeping lines for steps to obtain  LL and UL    *************
277                                Lowerquant=betainv(.975,diffcountL,count);
278                                Upperquant=betainv(.025,diffcountU,countplus1);
279                                Lowerval=(1-Lowerquant)*100;
280                                Upperval=(1-Upperquant)*100;
281                                LL=rateper-Lowerval;
282                                UL=rateper+Upperval;
283                        ***************************************************************************/
284                                LL=rateper-(1-(betainv(.975,diffcountL,count)))*100;
285                                UL=rateper+(1-(betainv(.025,diffcountU,countplus1)))*100;
286                                LL=compress(LL);
287                                UL=compress(UL);
288                                redflag=put('-', $15.);
289                        end;
290                end;
291               
292                if count=0 then do;
293                        rateper=.A;
294                        LL=.A;
295                        UL=.A;
296                        totalnum=.A;
297                end;
298               
299                if count<0 then do;
300                        rateper=.A;
301                        LL=.A;
302                        UL=.A;
303                        totalnum=.A;
304                        redflag=put('No Variance', $15.);  *no variance;
305                end;
306
307        proc print data=tmp;  title2 '4. tmp again - output variables for the IBIS xml/map and Redflag and cell suppression';
308        run;
309 
310--------BoNdArY--------
311# definition for output file
312f out_variable rateper
313f xml_out_map_file XMLPercentNumerDenomLCLUCL.map
314--------BoNdArY--------
315f out_detail lbl_not_used__see_xml_out_map_file
316  rateper 15.2
317  n 15.0
318  totalnum 15.0
319  LL 15.2
320  UL 15.2
321  redflag 16.0
322--------BoNdArY--------
323 
324 ****************** 5. SUPPRESSED VARIABLES *************************;
325 * ZW-s CGI program must be told how many variables it will need to  ;
326 * suppress and which ones they are. NOTE: If the SAS code, above, is;
327 * commented out, these lines can be left in the .def file without   ;
328 * causing any problems. They will only be used if the SAS code,     ;
329 * above is active, OR if the small_num and small_pop parameters     ;
330 * are active in the .CFG file, and with non-zero values.            ;
331 ********************************************************************;
332--------BoNdArY--------
3331 suppressed_variables 5
334  rateper
335  totalnum
336  n
337  LL
338  UL
339--------BoNdArY--------
Note: See TracBrowser for help on using the repository browser.