source: main/adopters/mt/trunk/src/main/backend_qModules/birth23/MT_Average_data_frame.def @ 19751

Last change on this file since 19751 was 19751, checked in by Paul Leo, 4 months ago

Changing Suppressed Rate to Suppressed Avg for Average.def file

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