df747fb5d038b4db3a0273d8032fadc4440daa19
[pspp] / src / language / stats / means.c
1 /* PSPP - a program for statistical analysis.
2    Copyright (C) 2011, 2012, 2013 Free Software Foundation, Inc.
3
4    This program is free software: you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation, either version 3 of the License, or
7    (at your option) any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program.  If not, see <http://www.gnu.org/licenses/>. */
16
17 #include <config.h>
18
19 #include "data/case.h"
20 #include "data/casegrouper.h"
21 #include "data/casereader.h"
22 #include "data/dataset.h"
23 #include "data/dictionary.h"
24 #include "data/format.h"
25 #include "data/variable.h"
26
27 #include "language/command.h"
28 #include "language/lexer/lexer.h"
29 #include "language/lexer/variable-parser.h"
30
31 #include "libpspp/misc.h"
32 #include "libpspp/pool.h"
33
34 #include "math/categoricals.h"
35 #include "math/interaction.h"
36 #include "math/moments.h"
37
38 #include "output/tab.h"
39
40 #include <math.h>
41
42 #include "gettext.h"
43 #define _(msgid) gettext (msgid)
44 #define N_(msgid) (msgid)
45
46
47 struct means;
48
49 struct per_var_data
50 {
51   void **cell_stats;
52   struct moments1 *mom;
53 };
54
55
56 typedef void *stat_create (struct pool *pool);
57 typedef void stat_update  (void *stat, double w, double x);
58 typedef double stat_get   (const struct per_var_data *, void *aux);
59
60 struct cell_spec
61 {
62   /* Printable title for output */
63   const char *title;
64
65   /* Keyword for syntax */
66   const char *keyword;
67
68   stat_create *sc;
69   stat_update *su;
70   stat_get *sd;
71 };
72
73 struct harmonic_mean
74 {
75   double rsum;
76   double n;
77 };
78
79 static void *
80 harmonic_create (struct pool *pool)
81 {
82   struct harmonic_mean *hm = pool_alloc (pool, sizeof *hm);
83
84   hm->rsum = 0;
85   hm->n = 0;
86
87   return hm;
88 }
89
90
91 static void
92 harmonic_update (void *stat, double w, double x)
93 {
94   struct harmonic_mean *hm = stat;
95   hm->rsum  += w / x;
96   hm->n += w;
97 }
98
99
100 static double
101 harmonic_get (const struct per_var_data *pvd UNUSED, void *stat)
102 {
103   struct harmonic_mean *hm = stat;
104
105   return hm->n / hm->rsum;
106 }
107
108 \f
109
110 struct geometric_mean
111 {
112   double prod;
113   double n;
114 };
115
116
117 static void *
118 geometric_create (struct pool *pool)
119 {
120   struct geometric_mean *gm = pool_alloc (pool, sizeof *gm);
121
122   gm->prod = 1.0;
123   gm->n = 0;
124
125   return gm;
126 }
127
128
129 static void
130 geometric_update (void *stat, double w, double x)
131 {
132   struct geometric_mean *gm = stat;
133   gm->prod  *=  pow (x, w);
134   gm->n += w;
135 }
136
137
138 static double
139 geometric_get (const struct per_var_data *pvd UNUSED, void *stat)
140 {
141   struct geometric_mean *gm = stat;
142
143   return pow (gm->prod, 1.0 / gm->n);
144 }
145
146 \f
147
148 static double
149 sum_get (const struct per_var_data *pvd, void *stat UNUSED)
150 {
151   double n, mean;
152
153   moments1_calculate (pvd->mom, &n, &mean, 0, 0, 0);
154
155   return mean * n;
156 }
157
158
159 static double
160 n_get (const struct per_var_data *pvd, void *stat UNUSED)
161 {
162   double n;
163
164   moments1_calculate (pvd->mom, &n, 0, 0, 0, 0);
165
166   return n;
167 }
168
169 static double
170 arithmean_get (const struct per_var_data *pvd, void *stat UNUSED)
171 {
172   double n, mean;
173
174   moments1_calculate (pvd->mom, &n, &mean, 0, 0, 0);
175
176   return mean;
177 }
178
179 static double
180 variance_get (const struct per_var_data *pvd, void *stat UNUSED)
181 {
182   double n, mean, variance;
183
184   moments1_calculate (pvd->mom, &n, &mean, &variance, 0, 0);
185
186   return variance;
187 }
188
189
190 static double
191 stddev_get (const struct per_var_data *pvd, void *stat)
192 {
193   return sqrt (variance_get (pvd, stat));
194 }
195
196
197 \f
198
199 static double
200 skew_get (const struct per_var_data *pvd, void *stat UNUSED)
201 {
202   double skew;
203
204   moments1_calculate (pvd->mom, NULL, NULL, NULL, &skew, 0);
205
206   return skew;
207 }
208
209 static double
210 sekurt_get (const struct per_var_data *pvd, void *stat UNUSED)
211 {
212   double n;
213
214   moments1_calculate (pvd->mom, &n, NULL, NULL, NULL, NULL);
215
216   return calc_sekurt (n);
217 }
218
219 static double
220 seskew_get (const struct per_var_data *pvd, void *stat UNUSED)
221 {
222   double n;
223
224   moments1_calculate (pvd->mom, &n, NULL, NULL, NULL, NULL);
225
226   return calc_seskew (n);
227 }
228
229 static double
230 kurt_get (const struct per_var_data *pvd, void *stat UNUSED)
231 {
232   double kurt;
233
234   moments1_calculate (pvd->mom, NULL, NULL, NULL, NULL, &kurt);
235
236   return kurt;
237 }
238
239 static double
240 semean_get (const struct per_var_data *pvd, void *stat UNUSED)
241 {
242   double n, var;
243
244   moments1_calculate (pvd->mom, &n, NULL, &var, NULL, NULL);
245
246   return sqrt (var / n);
247 }
248
249 \f
250
251 static void *
252 min_create (struct pool *pool)
253 {
254   double *r = pool_alloc (pool, sizeof *r);
255
256   *r = DBL_MAX;
257
258   return r;
259 }
260
261 static void
262 min_update (void *stat, double w UNUSED, double x)
263 {
264   double *r = stat;
265
266   if (x < *r)
267     *r = x;
268 }
269
270 static double
271 min_get (const struct per_var_data *pvd UNUSED, void *stat)
272 {
273   double *r = stat;
274
275   return *r;
276 }
277
278 static void *
279 max_create (struct pool *pool)
280 {
281   double *r = pool_alloc (pool, sizeof *r);
282
283   *r = -DBL_MAX;
284
285   return r;
286 }
287
288 static void
289 max_update (void *stat, double w UNUSED, double x)
290 {
291   double *r = stat;
292
293   if (x > *r)
294     *r = x;
295 }
296
297 static double
298 max_get (const struct per_var_data *pvd UNUSED, void *stat)
299 {
300   double *r = stat;
301
302   return *r;
303 }
304
305 \f
306
307 struct range
308 {
309   double min;
310   double max;
311 };
312
313 static void *
314 range_create (struct pool *pool)
315 {
316   struct range *r = pool_alloc (pool, sizeof *r);
317
318   r->min = DBL_MAX;
319   r->max = -DBL_MAX;
320
321   return r;
322 }
323
324 static void
325 range_update (void *stat, double w UNUSED, double x)
326 {
327   struct range *r = stat;
328
329   if (x > r->max)
330     r->max = x;
331
332   if (x < r->min)
333     r->min = x;
334 }
335
336 static double
337 range_get (const struct per_var_data *pvd UNUSED, void *stat)
338 {
339   struct range *r = stat;
340
341   return r->max - r->min;
342 }
343
344 \f
345
346 static void *
347 last_create (struct pool *pool)
348 {
349   double *l = pool_alloc (pool, sizeof *l);
350
351   return l;
352 }
353
354 static void
355 last_update (void *stat, double w UNUSED, double x)
356 {
357   double *l = stat;
358
359   *l = x;
360 }
361
362 static double
363 last_get (const struct per_var_data *pvd UNUSED, void *stat)
364 {
365   double *l = stat;
366
367   return *l;
368 }
369
370
371 static void *
372 first_create (struct pool *pool)
373 {
374   double *f = pool_alloc (pool, sizeof *f);
375
376   *f = SYSMIS;
377
378   return f;
379 }
380
381 static void
382 first_update (void *stat, double w UNUSED, double x)
383 {
384   double *f = stat;
385
386   if (*f == SYSMIS)
387     *f = x;
388 }
389
390 static double
391 first_get (const struct per_var_data *pvd UNUSED,  void *stat)
392 {
393   double *f = stat;
394
395   return *f;
396 }
397
398 enum
399   {
400     MEANS_MEAN = 0,
401     MEANS_N,
402     MEANS_STDDEV
403   };
404
405 /* Table of cell_specs */
406 static const struct cell_spec cell_spec[] = {
407   {N_("Mean"), "MEAN", NULL, NULL, arithmean_get},
408   {N_("N"), "COUNT", NULL, NULL, n_get},
409   {N_("Std. Deviation"), "STDDEV", NULL, NULL, stddev_get},
410 #if 0
411   {N_("Median"), "MEDIAN", NULL, NULL, NULL},
412   {N_("Group Median"), "GMEDIAN", NULL, NULL, NULL},
413 #endif
414   {N_("S.E. Mean"), "SEMEAN", NULL, NULL, semean_get},
415   {N_("Sum"), "SUM", NULL, NULL, sum_get},
416   {N_("Min"), "MIN", min_create, min_update, min_get},
417   {N_("Max"), "MAX", max_create, max_update, max_get},
418   {N_("Range"), "RANGE", range_create, range_update, range_get},
419   {N_("Variance"), "VARIANCE", NULL, NULL, variance_get},
420   {N_("Kurtosis"), "KURT", NULL, NULL, kurt_get},
421   {N_("S.E. Kurt"), "SEKURT", NULL, NULL, sekurt_get},
422   {N_("Skewness"), "SKEW", NULL, NULL, skew_get},
423   {N_("S.E. Skew"), "SESKEW", NULL, NULL, seskew_get},
424   {N_("First"), "FIRST", first_create, first_update, first_get},
425   {N_("Last"), "LAST", last_create, last_update, last_get},
426 #if 0
427   {N_("Percent N"), "NPCT", NULL, NULL, NULL},
428   {N_("Percent Sum"), "SPCT", NULL, NULL, NULL},
429 #endif
430   {N_("Harmonic Mean"), "HARMONIC", harmonic_create, harmonic_update, harmonic_get},
431   {N_("Geom. Mean"), "GEOMETRIC", geometric_create, geometric_update, geometric_get}
432 };
433
434 #define n_C (sizeof (cell_spec) / sizeof (struct cell_spec))
435
436
437 struct summary
438 {
439   casenumber missing;
440   casenumber non_missing;
441 };
442
443
444 struct layer
445 {
446   size_t n_factor_vars;
447   const struct variable **factor_vars;
448 };
449
450 /* The thing parsed after TABLES= */
451 struct mtable
452 {
453   size_t n_dep_vars;
454   const struct variable **dep_vars;
455
456   int n_layers;
457   struct layer *layers;
458
459   struct interaction **interactions;
460   struct summary *summary;
461
462   int ii;
463
464   struct categoricals *cats;
465 };
466
467 struct means
468 {
469   const struct dictionary *dict;
470
471   struct mtable *table;
472   size_t n_tables;
473
474   /* Missing value class for categorical variables */
475   enum mv_class exclude;
476
477   /* Missing value class for dependent variables */
478   enum mv_class dep_exclude;
479
480   bool listwise_exclude;
481
482   /* an array  indicating which statistics are to be calculated */
483   int *cells;
484
485   /* Size of cells */
486   int n_cells;
487
488   /* Pool on which cell functions may allocate data */
489   struct pool *pool;
490 };
491
492
493 static void
494 run_means (struct means *cmd, struct casereader *input,
495            const struct dataset *ds);
496
497
498
499 static bool
500 parse_means_table_syntax (struct lexer *lexer, const struct means *cmd, struct mtable *table)
501 {
502   table->ii = 0;
503   table->n_layers = 0;
504   table->layers = NULL;
505   table->interactions = NULL;
506
507   /* Dependent variable (s) */
508   if (!parse_variables_const_pool (lexer, cmd->pool, cmd->dict,
509                                    &table->dep_vars, &table->n_dep_vars,
510                                    PV_NO_DUPLICATE | PV_NUMERIC))
511     return false;
512
513   /* Factor variable (s) */
514   while (lex_match (lexer, T_BY))
515     {
516       table->n_layers++;
517       table->layers =
518         pool_realloc (cmd->pool, table->layers,
519                       sizeof (*table->layers) * table->n_layers);
520
521       if (!parse_variables_const_pool
522           (lexer, cmd->pool, cmd->dict,
523            &table->layers[table->n_layers - 1].factor_vars,
524            &table->layers[table->n_layers - 1].n_factor_vars,
525            PV_NO_DUPLICATE))
526         return false;
527     }
528
529   /* There is always at least one layer.
530      However the final layer is the total, and not
531      normally considered by the user as a
532      layer.
533   */
534
535   table->n_layers++;
536   table->layers =
537     pool_realloc (cmd->pool, table->layers,
538                   sizeof (*table->layers) * table->n_layers);
539   table->layers[table->n_layers - 1].factor_vars = NULL;
540   table->layers[table->n_layers - 1].n_factor_vars = 0;
541
542   return true;
543 }
544
545 /* Match a variable.
546    If the match succeeds, the variable will be placed in VAR.
547    Returns true if successful */
548 static bool
549 lex_is_variable (struct lexer *lexer, const struct dictionary *dict,
550                  int n)
551 {
552   const char *tstr;
553   if (lex_next_token (lexer, n) !=  T_ID)
554     return false;
555
556   tstr = lex_next_tokcstr (lexer, n);
557
558   if (NULL == dict_lookup_var (dict, tstr) )
559     return false;
560
561   return true;
562 }
563
564
565 int
566 cmd_means (struct lexer *lexer, struct dataset *ds)
567 {
568   int t;
569   int i;
570   int l;
571   struct means means;
572   bool more_tables = true;
573
574   means.pool = pool_create ();
575
576   means.exclude = MV_ANY;
577   means.dep_exclude = MV_ANY;
578   means.listwise_exclude = false;
579   means.table = NULL;
580   means.n_tables = 0;
581
582   means.dict = dataset_dict (ds);
583
584   means.n_cells = 3;
585   means.cells = pool_calloc (means.pool, means.n_cells, sizeof (*means.cells));
586
587
588   /* The first three items (MEAN, COUNT, STDDEV) are the default */
589   for (i = 0; i < 3; ++i)
590     means.cells[i] = i;
591
592
593   /*   Optional TABLES =   */
594   if (lex_match_id (lexer, "TABLES"))
595     {
596       if (! lex_force_match (lexer, T_EQUALS))
597         goto error;
598     }
599
600
601   more_tables = true;
602   /* Parse the "tables" */
603   while (more_tables)
604     {
605       means.n_tables ++;
606       means.table = pool_realloc (means.pool, means.table, means.n_tables * sizeof (*means.table));
607
608       if (! parse_means_table_syntax (lexer, &means,
609                                       &means.table[means.n_tables - 1]))
610         {
611           goto error;
612         }
613
614       /* Look ahead to see if there are more tables to be parsed */
615       more_tables = false;
616       if ( T_SLASH == lex_next_token (lexer, 0) )
617         {
618           if (lex_is_variable (lexer, means.dict, 1) )
619             {
620               more_tables = true;
621               lex_match (lexer, T_SLASH);
622             }
623         }
624     }
625
626   /* /MISSING subcommand */
627   while (lex_token (lexer) != T_ENDCMD)
628     {
629       lex_match (lexer, T_SLASH);
630
631       if (lex_match_id (lexer, "MISSING"))
632         {
633           /*
634             If no MISSING subcommand is specified, each combination of
635             a dependent variable and categorical variables is handled
636             separately.
637           */
638           lex_match (lexer, T_EQUALS);
639           if (lex_match_id (lexer, "INCLUDE"))
640             {
641               /*
642                 Use the subcommand  "/MISSING=INCLUDE" to include user-missing
643                 values in the analysis.
644               */
645
646               means.exclude = MV_SYSTEM;
647               means.dep_exclude = MV_SYSTEM;
648             }
649           else if (lex_match_id (lexer, "TABLE"))
650             /*
651               This is the default. (I think).
652               Every case containing a complete set of variables for a given
653               table. If any variable, categorical or dependent for in a table
654               is missing (as defined by what?), then that variable will
655               be dropped FOR THAT TABLE ONLY.
656             */
657             {
658               means.listwise_exclude = true;
659             }
660           else if (lex_match_id (lexer, "DEPENDENT"))
661             /*
662               Use the command "/MISSING=DEPENDENT" to
663               include user-missing values for the categorical variables,
664               while excluding them for the dependent variables.
665
666               Cases are dropped only when user-missing values
667               appear in dependent  variables.  User-missing
668               values for categorical variables are treated according to
669               their face value.
670
671               Cases are ALWAYS dropped when System Missing values appear
672               in the categorical variables.
673             */
674             {
675               means.dep_exclude = MV_ANY;
676               means.exclude = MV_SYSTEM;
677             }
678           else
679             {
680               lex_error (lexer, NULL);
681               goto error;
682             }
683         }
684       else if (lex_match_id (lexer, "CELLS"))
685         {
686           lex_match (lexer, T_EQUALS);
687
688           /* The default values become overwritten */
689           means.n_cells = 0;
690           while (lex_token (lexer) != T_ENDCMD
691                  && lex_token (lexer) != T_SLASH)
692             {
693               int k = 0;
694               if (lex_match (lexer, T_ALL))
695                 {
696                   int x;
697                   means.cells =
698                     pool_realloc (means.pool, means.cells,
699                                   (means.n_cells += n_C) * sizeof (*means.cells));
700
701                   for (x = 0; x < n_C; ++x)
702                     means.cells[means.n_cells - (n_C - 1 - x) - 1] = x;
703                 }
704               else if (lex_match_id (lexer, "NONE"))
705                 {
706                   /* Do nothing */
707                 }
708               else if (lex_match_id (lexer, "DEFAULT"))
709                 {
710                   means.cells =
711                     pool_realloc (means.pool, means.cells,
712                                   (means.n_cells += 3) * sizeof (*means.cells));
713
714                   means.cells[means.n_cells - 2 - 1] = MEANS_MEAN;
715                   means.cells[means.n_cells - 1 - 1] = MEANS_N;
716                   means.cells[means.n_cells - 0 - 1] = MEANS_STDDEV;
717                 }
718               else
719                 {
720                   for (; k < n_C; ++k)
721                     {
722                       if (lex_match_id (lexer, cell_spec[k].keyword))
723                         {
724                           means.cells =
725                             pool_realloc (means.pool, means.cells,
726                                           ++means.n_cells * sizeof (*means.cells));
727
728                           means.cells[means.n_cells - 1] = k;
729                           break;
730                         }
731                     }
732                 }
733               if (k >= n_C)
734                 {
735                   lex_error (lexer, NULL);
736                   goto error;
737                 }
738             }
739         }
740       else
741         {
742           lex_error (lexer, NULL);
743           goto error;
744         }
745     }
746
747
748
749   for (t = 0; t < means.n_tables; ++t)
750     {
751       struct mtable *table = &means.table[t];
752
753       table->interactions =
754         pool_calloc (means.pool, table->n_layers, sizeof (*table->interactions));
755
756       table->summary =
757         pool_calloc (means.pool, table->n_dep_vars * table->n_layers, sizeof (*table->summary));
758
759       for (l = 0; l < table->n_layers; ++l)
760         {
761           int v;
762           const struct layer *lyr = &table->layers[l];
763           const int n_vars = lyr->n_factor_vars;
764           table->interactions[l] = interaction_create (NULL);
765           for (v = 0; v < n_vars ; ++v)
766             {
767               interaction_add_variable (table->interactions[l],
768                                         lyr->factor_vars[v]);
769             }
770         }
771     }
772
773   {
774     struct casegrouper *grouper;
775     struct casereader *group;
776     bool ok;
777
778     grouper = casegrouper_create_splits (proc_open (ds), means.dict);
779     while (casegrouper_get_next_group (grouper, &group))
780       {
781         run_means (&means, group, ds);
782       }
783     ok = casegrouper_destroy (grouper);
784     ok = proc_commit (ds) && ok;
785   }
786
787   for (t = 0; t < means.n_tables; ++t)
788     {
789       int l;
790       struct mtable *table = &means.table[t];
791       if (table->interactions)
792         for (l = 0; l < table->n_layers; ++l)
793           {
794             interaction_destroy (table->interactions[l]);
795           }
796     }
797
798   pool_destroy (means.pool);
799   return CMD_SUCCESS;
800
801  error:
802
803   for (t = 0; t < means.n_tables; ++t)
804     {
805       int l;
806       struct mtable *table = &means.table[t];
807       if (table->interactions)
808         for (l = 0; l < table->n_layers; ++l)
809           {
810             interaction_destroy (table->interactions[l]);
811           }
812     }
813
814   pool_destroy (means.pool);
815   return CMD_FAILURE;
816 }
817
818
819 static bool
820 is_missing (const struct means *cmd,
821             const struct variable *dvar,
822             const struct interaction *iact,
823             const struct ccase *c)
824 {
825   if ( interaction_case_is_missing (iact, c, cmd->exclude) )
826     return true;
827
828
829   if (var_is_value_missing (dvar,
830                             case_data (c, dvar),
831                             cmd->dep_exclude))
832     return true;
833
834   return false;
835 }
836
837 static void output_case_processing_summary (const struct mtable *);
838
839 static void output_report (const struct means *, int, const struct mtable *);
840
841
842 struct per_cat_data
843 {
844   struct per_var_data *pvd;
845
846   bool warn;
847 };
848
849
850 static void
851 destroy_n (const void *aux1 UNUSED, void *aux2, void *user_data)
852 {
853   struct mtable *table = aux2;
854   int v;
855   struct per_cat_data *per_cat_data = user_data;
856   struct per_var_data *pvd = per_cat_data->pvd;
857
858   for (v = 0; v < table->n_dep_vars; ++v)
859     {
860       struct per_var_data *pp = &pvd[v];
861       moments1_destroy (pp->mom);
862     }
863 }
864
865 static void *
866 create_n (const void *aux1, void *aux2)
867 {
868   int i, v;
869   const struct means *means = aux1;
870   struct mtable *table = aux2;
871   struct per_cat_data *per_cat_data = pool_malloc (means->pool, sizeof *per_cat_data);
872
873   struct per_var_data *pvd = pool_calloc (means->pool, table->n_dep_vars, sizeof *pvd);
874
875   for (v = 0; v < table->n_dep_vars; ++v)
876     {
877       enum moment maxmom = MOMENT_KURTOSIS;
878       struct per_var_data *pp = &pvd[v];
879
880       pp->cell_stats = pool_calloc (means->pool, means->n_cells, sizeof *pp->cell_stats);
881
882
883       for (i = 0; i < means->n_cells; ++i)
884         {
885           int csi = means->cells[i];
886           const struct cell_spec *cs = &cell_spec[csi];
887           if (cs->sc)
888             {
889               pp->cell_stats[i] = cs->sc (means->pool);
890             }
891         }
892       pp->mom = moments1_create (maxmom);
893     }
894
895
896   per_cat_data->pvd = pvd;
897   per_cat_data->warn = true;
898   return per_cat_data;
899 }
900
901 static void
902 update_n (const void *aux1, void *aux2, void *user_data, const struct ccase *c, double weight)
903 {
904   int i;
905   int v = 0;
906   const struct means *means = aux1;
907   struct mtable *table = aux2;
908   struct per_cat_data *per_cat_data = user_data;
909
910   for (v = 0; v < table->n_dep_vars; ++v)
911     {
912       struct per_var_data *pvd = &per_cat_data->pvd[v];
913
914       const double x = case_data (c, table->dep_vars[v])->f;
915
916       for (i = 0; i < table->n_layers; ++i)
917         {
918           if ( is_missing (means, table->dep_vars[v],
919                            table->interactions[i], c))
920             goto end;
921         }
922
923       for (i = 0; i < means->n_cells; ++i)
924         {
925           const int csi = means->cells[i];
926           const struct cell_spec *cs = &cell_spec[csi];
927
928
929           if (cs->su)
930             cs->su (pvd->cell_stats[i],
931                     weight, x);
932         }
933
934       moments1_add (pvd->mom, x, weight);
935
936     end:
937       continue;
938     }
939 }
940
941 static void
942 calculate_n (const void *aux1, void *aux2, void *user_data)
943 {
944   int i;
945   int v = 0;
946   struct per_cat_data *per_cat_data = user_data;
947   const struct means *means = aux1;
948   struct mtable *table = aux2;
949
950   for (v = 0; v < table->n_dep_vars; ++v)
951     {
952       struct per_var_data *pvd = &per_cat_data->pvd[v];
953       for (i = 0; i < means->n_cells; ++i)
954         {
955           int csi = means->cells[i];
956           const struct cell_spec *cs = &cell_spec[csi];
957
958           if (cs->su)
959             cs->sd (pvd, pvd->cell_stats[i]);
960         }
961     }
962 }
963
964 static void
965 run_means (struct means *cmd, struct casereader *input,
966            const struct dataset *ds UNUSED)
967 {
968   int t;
969   const struct variable *wv = dict_get_weight (cmd->dict);
970   struct ccase *c;
971   struct casereader *reader;
972
973   struct payload payload;
974   payload.create = create_n;
975   payload.update = update_n;
976   payload.calculate = calculate_n;
977   payload.destroy = destroy_n;
978
979   for (t = 0; t < cmd->n_tables; ++t)
980     {
981       struct mtable *table = &cmd->table[t];
982       table->cats
983         = categoricals_create (table->interactions,
984                                table->n_layers, wv, cmd->exclude);
985
986       categoricals_set_payload (table->cats, &payload, cmd, table);
987     }
988
989   for (reader = input;
990        (c = casereader_read (reader)) != NULL; case_unref (c))
991     {
992       for (t = 0; t < cmd->n_tables; ++t)
993         {
994           bool something_missing = false;
995           int  v;
996           struct mtable *table = &cmd->table[t];
997
998           for (v = 0; v < table->n_dep_vars; ++v)
999             {
1000               int i;
1001               for (i = 0; i < table->n_layers; ++i)
1002                 {
1003                   const bool missing =
1004                     is_missing (cmd, table->dep_vars[v],
1005                                 table->interactions[i], c);
1006                   if (missing)
1007                     {
1008                       something_missing = true;
1009                       table->summary[v * table->n_layers + i].missing++;
1010                     }
1011                   else
1012                     table->summary[v * table->n_layers  + i].non_missing++;
1013                 }
1014             }
1015           if ( something_missing && cmd->listwise_exclude)
1016             continue;
1017
1018           categoricals_update (table->cats, c);
1019         }
1020     }
1021   casereader_destroy (reader);
1022
1023   for (t = 0; t < cmd->n_tables; ++t)
1024     {
1025       struct mtable *table = &cmd->table[t];
1026
1027       categoricals_done (table->cats);
1028     }
1029
1030
1031   for (t = 0; t < cmd->n_tables; ++t)
1032     {
1033       int i;
1034       const struct mtable *table = &cmd->table[t];
1035
1036       output_case_processing_summary (table);
1037
1038       for (i = 0; i < table->n_layers; ++i)
1039         {
1040           output_report (cmd, i, table);
1041         }
1042       categoricals_destroy (table->cats);
1043     }
1044
1045 }
1046
1047
1048
1049 static void
1050 output_case_processing_summary (const struct mtable *table)
1051 {
1052   int i, v;
1053   const int heading_columns = 1;
1054   const int heading_rows = 3;
1055   struct tab_table *t;
1056
1057   const int nr = heading_rows + table->n_layers * table->n_dep_vars;
1058   const int nc = 7;
1059
1060   t = tab_create (nc, nr);
1061   tab_title (t, _("Case Processing Summary"));
1062
1063   tab_headers (t, heading_columns, 0, heading_rows, 0);
1064
1065   tab_box (t, TAL_2, TAL_2, -1, TAL_1, 0, 0, nc - 1, nr - 1);
1066
1067   tab_hline (t, TAL_2, 0, nc - 1, heading_rows);
1068   tab_vline (t, TAL_2, heading_columns, 0, nr - 1);
1069
1070
1071   tab_joint_text (t, heading_columns, 0,
1072                   nc - 1, 0, TAB_CENTER | TAT_TITLE, _("Cases"));
1073
1074   tab_joint_text (t, 1, 1, 2, 1, TAB_CENTER | TAT_TITLE, _("Included"));
1075   tab_joint_text (t, 3, 1, 4, 1, TAB_CENTER | TAT_TITLE, _("Excluded"));
1076   tab_joint_text (t, 5, 1, 6, 1, TAB_CENTER | TAT_TITLE, _("Total"));
1077
1078   tab_hline (t, TAL_1, heading_columns, nc - 1, 1);
1079   tab_hline (t, TAL_1, heading_columns, nc - 1, 2);
1080
1081
1082   for (i = 0; i < 3; ++i)
1083     {
1084       tab_text (t, heading_columns + i * 2, 2, TAB_CENTER | TAT_TITLE,
1085                 _("N"));
1086       tab_text (t, heading_columns + i * 2 + 1, 2, TAB_CENTER | TAT_TITLE,
1087                 _("Percent"));
1088     }
1089
1090   for (v = 0; v < table->n_dep_vars; ++v)
1091     {
1092       const struct variable *var = table->dep_vars[v];
1093       const char *dv_name = var_to_string (var);
1094       for (i = 0; i < table->n_layers; ++i)
1095         {
1096           const int row = v * table->n_layers + i;
1097           const struct interaction *iact = table->interactions[i];
1098           casenumber n_total;
1099
1100           struct string str;
1101           ds_init_cstr (&str, dv_name);
1102           ds_put_cstr (&str, ": ");
1103
1104           interaction_to_string (iact, &str);
1105
1106           tab_text (t, 0, row + heading_rows,
1107                     TAB_LEFT | TAT_TITLE, ds_cstr (&str));
1108
1109
1110           n_total = table->summary[row].missing +
1111             table->summary[row].non_missing;
1112
1113           tab_double (t, 1, row + heading_rows,
1114                       0, table->summary[row].non_missing, NULL, RC_INTEGER);
1115
1116           tab_text_format (t, 2, row + heading_rows,
1117                            0, _("%g%%"),
1118                            table->summary[row].non_missing / (double) n_total * 100.0);
1119
1120
1121           tab_double (t, 3, row + heading_rows,
1122                       0, table->summary[row].missing, NULL, RC_INTEGER);
1123
1124
1125           tab_text_format (t, 4, row + heading_rows,
1126                            0, _("%g%%"),
1127                            table->summary[row].missing / (double) n_total * 100.0);
1128
1129
1130           tab_double (t, 5, row + heading_rows,
1131                       0, table->summary[row].missing +
1132                       table->summary[row].non_missing, NULL, RC_INTEGER);
1133
1134           tab_text_format (t, 6, row + heading_rows,
1135                            0, _("%g%%"),
1136                            n_total / (double) n_total * 100.0);
1137
1138
1139           ds_destroy (&str);
1140         }
1141     }
1142
1143   tab_submit (t);
1144 }
1145
1146
1147 static void
1148 output_report (const struct means *cmd,  int iact_idx,
1149                const struct mtable *table)
1150 {
1151   int grp;
1152   int i;
1153
1154   const struct interaction *iact = table->interactions[iact_idx];
1155
1156   const int heading_columns = 1 + iact->n_vars;
1157   const int heading_rows = 1;
1158   struct tab_table *t;
1159
1160   const int n_cats = categoricals_n_count (table->cats, iact_idx);
1161
1162   const int nr = n_cats * table->n_dep_vars + heading_rows;
1163
1164   const int nc = heading_columns + cmd->n_cells;
1165
1166   t = tab_create (nc, nr);
1167   tab_title (t, _("Report"));
1168
1169   tab_headers (t, heading_columns, 0, heading_rows, 0);
1170
1171   tab_box (t, TAL_2, TAL_2, -1, TAL_1, 0, 0, nc - 1, nr - 1);
1172
1173   tab_hline (t, TAL_2, 0, nc - 1, heading_rows);
1174   tab_vline (t, TAL_2, heading_columns, 0, nr - 1);
1175
1176   for (i = 0; i < iact->n_vars; ++i)
1177     {
1178       tab_text (t, 1 + i, 0, TAB_CENTER | TAT_TITLE,
1179                 var_to_string (iact->vars[i]));
1180     }
1181
1182   for (i = 0; i < cmd->n_cells; ++i)
1183     {
1184       tab_text (t, heading_columns + i, 0,
1185                 TAB_CENTER | TAT_TITLE,
1186                 gettext (cell_spec[cmd->cells[i]].title));
1187     }
1188
1189
1190   for (i = 0; i < n_cats; ++i)
1191     {
1192       int v, dv;
1193       const struct ccase *c =
1194         categoricals_get_case_by_category_real (table->cats, iact_idx, i);
1195
1196       for (dv = 0; dv < table->n_dep_vars; ++dv)
1197         {
1198           tab_text (t, 0,
1199                     heading_rows + dv * n_cats,
1200                     TAB_RIGHT | TAT_TITLE,
1201                     var_to_string (table->dep_vars[dv])
1202                     );
1203
1204           if ( dv > 0)
1205             tab_hline (t, TAL_1, 0, nc - 1, heading_rows + dv * n_cats);
1206
1207           for (v = 0; v < iact->n_vars; ++v)
1208             {
1209               const struct variable *var = iact->vars[v];
1210               const union value *val = case_data (c, var);
1211               struct string str;
1212               ds_init_empty (&str);
1213               var_append_value_name (var, val, &str);
1214
1215               tab_text (t, 1 + v, heading_rows + dv * n_cats + i,
1216                         TAB_RIGHT | TAT_TITLE, ds_cstr (&str));
1217
1218               ds_destroy (&str);
1219             }
1220         }
1221     }
1222
1223   for (grp = 0; grp < n_cats; ++grp)
1224     {
1225       int dv;
1226       struct per_cat_data *per_cat_data =
1227         categoricals_get_user_data_by_category_real (table->cats, iact_idx, grp);
1228
1229       for (dv = 0; dv < table->n_dep_vars; ++dv)
1230         {
1231           const struct per_var_data *pvd = &per_cat_data->pvd[dv];
1232           for (i = 0; i < cmd->n_cells; ++i)
1233             {
1234               const int csi = cmd->cells[i];
1235               const struct cell_spec *cs = &cell_spec[csi];
1236
1237               double result = cs->sd (pvd, pvd->cell_stats[i]);
1238
1239               tab_double (t, heading_columns + i,
1240                           heading_rows + grp + dv * n_cats,
1241                           0, result, NULL, RC_OTHER);
1242             }
1243         }
1244     }
1245
1246   tab_submit (t);
1247 }