Logistic Regression: Added categorical variable support
[pspp] / src / language / stats / logistic.c
1 /* pspp - a program for statistical analysis.
2    Copyright (C) 2012 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
18 /* 
19    References: 
20    1. "Coding Logistic Regression with Newton-Raphson", James McCaffrey
21    http://msdn.microsoft.com/en-us/magazine/jj618304.aspx
22
23    2. "SPSS Statistical Algorithms" Chapter LOGISTIC REGRESSION Algorithms
24
25
26    The Newton Raphson method finds successive approximations to $\bf b$ where 
27    approximation ${\bf b}_t$ is (hopefully) better than the previous ${\bf b}_{t-1}$.
28
29    $ {\bf b}_t = {\bf b}_{t -1} + ({\bf X}^T{\bf W}_{t-1}{\bf X})^{-1}{\bf X}^T({\bf y} - {\bf \pi}_{t-1})$
30    where:
31
32    $\bf X$ is the $n \times p$ design matrix, $n$ being the number of cases, 
33    $p$ the number of parameters, \par
34    $\bf W$ is the diagonal matrix whose diagonal elements are
35    $\hat{\pi}_0(1 - \hat{\pi}_0), \, \hat{\pi}_1(1 - \hat{\pi}_2)\dots \hat{\pi}_{n-1}(1 - \hat{\pi}_{n-1})$
36    \par
37
38 */
39
40 #include <config.h>
41
42 #include <gsl/gsl_blas.h> 
43
44 #include <gsl/gsl_linalg.h>
45 #include <gsl/gsl_cdf.h>
46 #include <gsl/gsl_matrix.h>
47 #include <gsl/gsl_vector.h>
48 #include <math.h>
49
50 #include "data/case.h"
51 #include "data/casegrouper.h"
52 #include "data/casereader.h"
53 #include "data/dataset.h"
54 #include "data/dictionary.h"
55 #include "data/format.h"
56 #include "data/value.h"
57 #include "language/command.h"
58 #include "language/dictionary/split-file.h"
59 #include "language/lexer/lexer.h"
60 #include "language/lexer/value-parser.h"
61 #include "language/lexer/variable-parser.h"
62 #include "libpspp/assertion.h"
63 #include "libpspp/ll.h"
64 #include "libpspp/message.h"
65 #include "libpspp/misc.h"
66 #include "math/categoricals.h"
67 #include "math/interaction.h"
68
69 #include "output/tab.h"
70
71 #include "gettext.h"
72 #define _(msgid) gettext (msgid)
73
74
75
76
77 #define   PRINT_EACH_STEP  0x01
78 #define   PRINT_SUMMARY    0x02
79 #define   PRINT_CORR       0x04
80 #define   PRINT_ITER       0x08
81 #define   PRINT_GOODFIT    0x10
82 #define   PRINT_CI         0x20
83
84
85 #define PRINT_DEFAULT (PRINT_SUMMARY | PRINT_EACH_STEP)
86
87 /*
88   The constant parameters of the procedure.
89   That is, those which are set by the user.
90 */
91 struct lr_spec
92 {
93   /* The dependent variable */
94   const struct variable *dep_var;
95
96   /* The predictor variables (excluding categorical ones) */
97   const struct variable **predictor_vars;
98   size_t n_predictor_vars;
99
100   /* The categorical predictors */
101   struct interaction **cat_predictors;
102   size_t n_cat_predictors;
103
104   /* Which classes of missing vars are to be excluded */
105   enum mv_class exclude;
106
107   /* The weight variable */
108   const struct variable *wv;
109
110   /* The dictionary of the dataset */
111   const struct dictionary *dict;
112
113   /* True iff the constant (intercept) is to be included in the model */
114   bool constant;
115
116   /* Ths maximum number of iterations */
117   int max_iter;
118
119   /* Other iteration limiting conditions */
120   double bcon;
121   double min_epsilon;
122   double lcon;
123
124   /* The confidence interval (in percent) */
125   int confidence;
126
127   /* What results should be presented */
128   unsigned int print;
129
130   double cut_point;
131 };
132
133
134 /* The results and intermediate result of the procedure.
135    These are mutated as the procedure runs. Used for
136    temporary variables etc.
137 */
138 struct lr_result
139 {
140   /* Used to indicate if a pass should flag a warning when 
141      invalid (ie negative or missing) weight values are encountered */
142   bool warn_bad_weight;
143
144   /* The two values of the dependent variable. */
145   union value y0;
146   union value y1;
147
148
149   /* The sum of caseweights */
150   double cc;
151
152   /* The number of missing and nonmissing cases */
153   casenumber n_missing;
154   casenumber n_nonmissing;
155
156
157   gsl_matrix *hessian;
158
159   /* The categoricals and their payload. Null if  the analysis has no
160    categorical predictors */
161   struct categoricals *cats;
162   struct payload cp;
163 };
164
165
166 /*
167   Convert INPUT into a dichotomous scalar, according to how the dependent variable's
168   values are mapped.
169   For simple cases, this is a 1:1 mapping
170   The return value is always either 0 or 1
171 */
172 static double
173 map_dependent_var (const struct lr_spec *cmd, const struct lr_result *res, const union value *input)
174 {
175   const int width = var_get_width (cmd->dep_var);
176   if (value_equal (input, &res->y0, width))
177     return 0;
178
179   if (value_equal (input, &res->y1, width))
180     return 1;
181
182   /* This should never happen.  If it does,  then y0 and/or y1 have probably not been set */
183   NOT_REACHED ();
184
185   return SYSMIS;
186 }
187
188
189 static void output_categories (const struct lr_spec *cmd, const struct lr_result *res);
190
191 static void output_depvarmap (const struct lr_spec *cmd, const struct lr_result *);
192
193 static void output_variables (const struct lr_spec *cmd, 
194                               const struct lr_result *,
195                               const gsl_vector *);
196
197 static void output_model_summary (const struct lr_result *,
198                                   double initial_likelihood, double likelihood);
199
200 static void case_processing_summary (const struct lr_result *);
201
202
203 /* Return the value of case C corresponding to the INDEX'th entry in the
204    model */
205 static double
206 predictor_value (const struct ccase *c, 
207                     const struct variable **x, size_t n_x, 
208                     const struct categoricals *cats,
209                     size_t index)
210 {
211   /* Values of the scalar predictor variables */
212   if (index < n_x) 
213     return case_data (c, x[index])->f;
214
215   /* Coded values of categorical predictor variables (or interactions) */
216   if (cats && index - n_x  < categoricals_df_total (cats))
217     {
218       double x = categoricals_get_dummy_code_for_case (cats, index - n_x, c);
219       return x;
220     }
221
222   /* The constant term */
223   return 1.0;
224 }
225
226
227 /*
228   Return the probability estimator (that is the estimator of logit(y) )
229   corresponding to the coefficient estimator beta_hat for case C
230 */
231 static double 
232 pi_hat (const struct lr_spec *cmd, 
233         struct lr_result *res,
234         const gsl_vector *beta_hat,
235         const struct variable **x, size_t n_x,
236         const struct ccase *c)
237 {
238   int v0;
239   double pi = 0;
240   size_t n_coeffs = beta_hat->size;
241
242   if (cmd->constant)
243     {
244       pi += gsl_vector_get (beta_hat, beta_hat->size - 1);
245       n_coeffs--;
246     }
247   
248   for (v0 = 0; v0 < n_coeffs; ++v0)
249     {
250       pi += gsl_vector_get (beta_hat, v0) * 
251         predictor_value (c, x, n_x, res->cats, v0);
252     }
253
254   pi = 1.0 / (1.0 + exp(-pi));
255
256   return pi;
257 }
258
259
260 /*
261   Calculates the Hessian matrix X' V  X,
262   where: X is the n by N_X matrix comprising the n cases in INPUT
263   V is a diagonal matrix { (pi_hat_0)(1 - pi_hat_0), (pi_hat_1)(1 - pi_hat_1), ... (pi_hat_{N-1})(1 - pi_hat_{N-1})} 
264   (the partial derivative of the predicted values)
265
266   If ALL predicted values derivatives are close to zero or one, then CONVERGED
267   will be set to true.
268 */
269 static void
270 hessian (const struct lr_spec *cmd, 
271          struct lr_result *res,
272          struct casereader *input,
273          const struct variable **x, size_t n_x,
274          const gsl_vector *beta_hat,
275          bool *converged)
276 {
277   struct casereader *reader;
278   struct ccase *c;
279
280   double max_w = -DBL_MAX;
281
282   gsl_matrix_set_zero (res->hessian);
283
284   for (reader = casereader_clone (input);
285        (c = casereader_read (reader)) != NULL; case_unref (c))
286     {
287       int v0, v1;
288       double pi = pi_hat (cmd, res, beta_hat, x, n_x, c);
289
290       double weight = dict_get_case_weight (cmd->dict, c, &res->warn_bad_weight);
291       double w = pi * (1 - pi);
292       if (w > max_w)
293         max_w = w;
294       w *= weight;
295
296       for (v0 = 0; v0 < beta_hat->size; ++v0)
297         {
298           double in0 = predictor_value (c, x, n_x, res->cats, v0);
299           for (v1 = 0; v1 < beta_hat->size; ++v1)
300             {
301               double in1 = predictor_value (c, x, n_x, res->cats, v1);
302               double *o = gsl_matrix_ptr (res->hessian, v0, v1);
303               *o += in0 * w * in1;
304             }
305         }
306     }
307   casereader_destroy (reader);
308
309   if ( max_w < cmd->min_epsilon)
310     {
311       *converged = true;
312       msg (MN, _("All predicted values are either 1 or 0"));
313     }
314 }
315
316
317 /* Calculates the value  X' (y - pi)
318    where X is the design model, 
319    y is the vector of observed independent variables
320    pi is the vector of estimates for y
321
322    As a side effect, the likelihood is stored in LIKELIHOOD
323 */
324 static gsl_vector *
325 xt_times_y_pi (const struct lr_spec *cmd,
326                struct lr_result *res,
327                struct casereader *input,
328                const struct variable **x, size_t n_x,
329                const struct variable *y_var,
330                const gsl_vector *beta_hat,
331                double *likelihood)
332 {
333   struct casereader *reader;
334   struct ccase *c;
335   gsl_vector *output = gsl_vector_calloc (beta_hat->size);
336
337   *likelihood = 1.0;
338   for (reader = casereader_clone (input);
339        (c = casereader_read (reader)) != NULL; case_unref (c))
340     {
341       int v0;
342       double pi = pi_hat (cmd, res, beta_hat, x, n_x, c);
343       double weight = dict_get_case_weight (cmd->dict, c, &res->warn_bad_weight);
344
345
346       double y = map_dependent_var (cmd, res, case_data (c, y_var));
347
348       *likelihood *= pow (pi, weight * y) * pow (1 - pi, weight * (1 - y));
349
350       for (v0 = 0; v0 < beta_hat->size; ++v0)
351         {
352           double in0 = predictor_value (c, x, n_x, res->cats, v0);
353           double *o = gsl_vector_ptr (output, v0);
354           *o += in0 * (y - pi) * weight;
355         }
356     }
357
358   casereader_destroy (reader);
359
360   return output;
361 }
362
363 \f
364
365 /* "payload" functions for the categoricals.
366    The only function is to accumulate the frequency of each
367    category.
368  */
369
370 static void *
371 frq_create  (const void *aux1 UNUSED, void *aux2 UNUSED)
372 {
373   return xzalloc (sizeof (double));
374 }
375
376 static void
377 frq_update  (const void *aux1 UNUSED, void *aux2 UNUSED,
378              void *ud, const struct ccase *c UNUSED , double weight)
379 {
380   double *freq = ud;
381   *freq += weight;
382 }
383
384 static void 
385 frq_destroy (const void *aux1 UNUSED, void *aux2 UNUSED, void *user_data UNUSED)
386 {
387   free (user_data);
388 }
389
390 \f
391
392 /* 
393    Makes an initial pass though the data, doing the following:
394
395    * Checks that the dependent variable is  dichotomous,
396    * Creates and initialises the categoricals,
397    * Accumulates summary results,
398    * Calculates necessary initial values.
399
400    Returns an initial value for \hat\beta the vector of estimators of \beta
401 */
402 static gsl_vector * 
403 beta_hat_initial (const struct lr_spec *cmd, struct lr_result *res, struct casereader *input)
404 {
405   const int width = var_get_width (cmd->dep_var);
406
407   struct ccase *c;
408   struct casereader *reader;
409   gsl_vector *b0 ;
410   double sum;
411   double sumA = 0.0;
412   double sumB = 0.0;
413
414   bool v0set = false;
415   bool v1set = false;
416
417   size_t n_coefficients = cmd->n_predictor_vars;
418   if (cmd->constant)
419     n_coefficients++;
420
421   /* Create categoricals if appropriate */
422   if (cmd->n_cat_predictors > 0)
423     {
424       res->cp.create = frq_create;
425       res->cp.update = frq_update;
426       res->cp.calculate = NULL;
427       res->cp.destroy = frq_destroy;
428
429       res->cats = categoricals_create (cmd->cat_predictors, cmd->n_cat_predictors,
430                                        cmd->wv, cmd->exclude, MV_ANY);
431
432       categoricals_set_payload (res->cats, &res->cp, cmd, res);
433     }
434
435   res->cc = 0;
436   for (reader = casereader_clone (input);
437        (c = casereader_read (reader)) != NULL; case_unref (c))
438     {
439       int v;
440       bool missing = false;
441       double weight = dict_get_case_weight (cmd->dict, c, &res->warn_bad_weight);
442       const union value *depval = case_data (c, cmd->dep_var);
443
444       for (v = 0; v < cmd->n_predictor_vars; ++v)
445         {
446           const union value *val = case_data (c, cmd->predictor_vars[v]);
447           if (var_is_value_missing (cmd->predictor_vars[v], val, cmd->exclude))
448             {
449               missing = true;
450               break;
451             }
452         }
453
454       /* Accumulate the missing and non-missing counts */
455       if (missing)
456         {
457           res->n_missing++;
458           continue;
459         }
460       res->n_nonmissing++;
461
462       /* Find the values of the dependent variable */
463       if (!v0set)
464         {
465           value_clone (&res->y0, depval, width);
466           v0set = true;
467         }
468       else if (!v1set)
469         {
470           if ( !value_equal (&res->y0, depval, width))
471             {
472               value_clone (&res->y1, depval, width);
473               v1set = true;
474             }
475         }
476       else
477         {
478           if (! value_equal (&res->y0, depval, width)
479               &&
480               ! value_equal (&res->y1, depval, width)
481               )
482             {
483               msg (ME, _("Dependent variable's values are not dichotomous."));
484               goto error;
485             }
486         }
487
488       if (v0set && value_equal (&res->y0, depval, width))
489           sumA += weight;
490
491       if (v1set && value_equal (&res->y1, depval, width))
492           sumB += weight;
493
494
495       res->cc += weight;
496
497       categoricals_update (res->cats, c);
498     }
499   casereader_destroy (reader);
500
501   categoricals_done (res->cats);
502
503   sum = sumB;
504
505   /* Ensure that Y0 is less than Y1.  Otherwise the mapping gets
506      inverted, which is confusing to users */
507   if (var_is_numeric (cmd->dep_var) && value_compare_3way (&res->y0, &res->y1, width) > 0)
508     {
509       union value tmp;
510       value_clone (&tmp, &res->y0, width);
511       value_copy (&res->y0, &res->y1, width);
512       value_copy (&res->y1, &tmp, width);
513       value_destroy (&tmp, width);
514       sum = sumA;
515     }
516
517   n_coefficients += categoricals_df_total (res->cats);
518   b0 = gsl_vector_calloc (n_coefficients);
519
520   if ( cmd->constant)
521     {
522       double mean = sum / res->cc;
523       gsl_vector_set (b0, b0->size - 1, log (mean / (1 - mean)));
524     }
525
526   return b0;
527
528  error:
529   casereader_destroy (reader);
530   return NULL;
531 }
532
533
534
535 /* Start of the logistic regression routine proper */
536 static bool
537 run_lr (const struct lr_spec *cmd, struct casereader *input,
538         const struct dataset *ds UNUSED)
539 {
540   int i;
541
542   gsl_vector *beta_hat;
543
544   bool converged = false;
545
546   /* Set the likelihoods to a negative sentinel value */
547   double likelihood = -1;
548   double prev_likelihood = -1;
549   double initial_likelihood = -1;
550
551   struct lr_result work;
552   work.n_missing = 0;
553   work.n_nonmissing = 0;
554   work.warn_bad_weight = true;
555   work.cats = NULL;
556
557
558   /* Get the initial estimates of \beta and their standard errors */
559   beta_hat = beta_hat_initial (cmd, &work, input);
560   if (NULL == beta_hat)
561     return false;
562
563   output_depvarmap (cmd, &work);
564
565   case_processing_summary (&work);
566
567
568   input = casereader_create_filter_missing (input,
569                                             cmd->predictor_vars,
570                                             cmd->n_predictor_vars,
571                                             cmd->exclude,
572                                             NULL,
573                                             NULL);
574
575
576   work.hessian = gsl_matrix_calloc (beta_hat->size, beta_hat->size);
577
578   /* Start the Newton Raphson iteration process... */
579   for( i = 0 ; i < cmd->max_iter ; ++i)
580     {
581       double min, max;
582       gsl_vector *v ;
583
584       
585       hessian (cmd, &work, input,
586                    cmd->predictor_vars, cmd->n_predictor_vars,
587                    beta_hat,
588                    &converged);
589
590       gsl_linalg_cholesky_decomp (work.hessian);
591       gsl_linalg_cholesky_invert (work.hessian);
592
593       v = xt_times_y_pi (cmd, &work, input,
594                          cmd->predictor_vars, cmd->n_predictor_vars,
595                          cmd->dep_var,
596                          beta_hat,
597                          &likelihood);
598
599       {
600         /* delta = M.v */
601         gsl_vector *delta = gsl_vector_alloc (v->size);
602         gsl_blas_dgemv (CblasNoTrans, 1.0, work.hessian, v, 0, delta);
603         gsl_vector_free (v);
604
605
606         gsl_vector_add (beta_hat, delta);
607
608         gsl_vector_minmax (delta, &min, &max);
609
610         if ( fabs (min) < cmd->bcon && fabs (max) < cmd->bcon)
611           {
612             msg (MN, _("Estimation terminated at iteration number %d because parameter estimates changed by less than %g"),
613                  i + 1, cmd->bcon);
614             converged = true;
615           }
616
617         gsl_vector_free (delta);
618       }
619
620       if ( prev_likelihood >= 0)
621         {
622           if (-log (likelihood) > -(1.0 - cmd->lcon) * log (prev_likelihood))
623             {
624               msg (MN, _("Estimation terminated at iteration number %d because Log Likelihood decreased by less than %g%%"), i + 1, 100 * cmd->lcon);
625               converged = true;
626             }
627         }
628       if (i == 0)
629         initial_likelihood = likelihood;
630       prev_likelihood = likelihood;
631
632       if (converged)
633         break;
634     }
635   casereader_destroy (input);
636   assert (initial_likelihood >= 0);
637
638   if ( ! converged) 
639     msg (MW, _("Estimation terminated at iteration number %d because maximum iterations has been reached"), i );
640
641
642   output_model_summary (&work, initial_likelihood, likelihood);
643
644   if (work.cats)
645     output_categories (cmd, &work);
646
647   output_variables (cmd, &work, beta_hat);
648
649   gsl_matrix_free (work.hessian);
650   gsl_vector_free (beta_hat); 
651   
652   categoricals_destroy (work.cats);
653
654   return true;
655 }
656
657 /* Parse the LOGISTIC REGRESSION command syntax */
658 int
659 cmd_logistic (struct lexer *lexer, struct dataset *ds)
660 {
661   /* Temporary location for the predictor variables.
662      These may or may not include the categorical predictors */
663   const struct variable **pred_vars;
664   size_t n_pred_vars;
665
666   int v, x;
667   struct lr_spec lr;
668   lr.dict = dataset_dict (ds);
669   lr.n_predictor_vars = 0;
670   lr.predictor_vars = NULL;
671   lr.exclude = MV_ANY;
672   lr.wv = dict_get_weight (lr.dict);
673   lr.max_iter = 20;
674   lr.lcon = 0.0000;
675   lr.bcon = 0.001;
676   lr.min_epsilon = 0.00000001;
677   lr.cut_point = 0.5;
678   lr.constant = true;
679   lr.confidence = 95;
680   lr.print = PRINT_DEFAULT;
681   lr.cat_predictors = NULL;
682   lr.n_cat_predictors = 0;
683
684
685
686   if (lex_match_id (lexer, "VARIABLES"))
687     lex_match (lexer, T_EQUALS);
688
689   if (! (lr.dep_var = parse_variable_const (lexer, lr.dict)))
690     goto error;
691
692   lex_force_match (lexer, T_WITH);
693
694   if (!parse_variables_const (lexer, lr.dict,
695                               &pred_vars, &n_pred_vars,
696                               PV_NO_DUPLICATE))
697     goto error;
698
699
700   while (lex_token (lexer) != T_ENDCMD)
701     {
702       lex_match (lexer, T_SLASH);
703
704       if (lex_match_id (lexer, "MISSING"))
705         {
706           lex_match (lexer, T_EQUALS);
707           while (lex_token (lexer) != T_ENDCMD
708                  && lex_token (lexer) != T_SLASH)
709             {
710               if (lex_match_id (lexer, "INCLUDE"))
711                 {
712                   lr.exclude = MV_SYSTEM;
713                 }
714               else if (lex_match_id (lexer, "EXCLUDE"))
715                 {
716                   lr.exclude = MV_ANY;
717                 }
718               else
719                 {
720                   lex_error (lexer, NULL);
721                   goto error;
722                 }
723             }
724         }
725       else if (lex_match_id (lexer, "ORIGIN"))
726         {
727           lr.constant = false;
728         }
729       else if (lex_match_id (lexer, "NOORIGIN"))
730         {
731           lr.constant = true;
732         }
733       else if (lex_match_id (lexer, "NOCONST"))
734         {
735           lr.constant = false;
736         }
737       else if (lex_match_id (lexer, "EXTERNAL"))
738         {
739           /* This is for compatibility.  It does nothing */
740         }
741       else if (lex_match_id (lexer, "CATEGORICAL"))
742         {
743           lex_match (lexer, T_EQUALS);
744           do
745             {
746               lr.cat_predictors = xrealloc (lr.cat_predictors,
747                                   sizeof (*lr.cat_predictors) * ++lr.n_cat_predictors);
748               lr.cat_predictors[lr.n_cat_predictors - 1] = 0;
749             }
750           while (parse_design_interaction (lexer, lr.dict, 
751                                            lr.cat_predictors + lr.n_cat_predictors - 1));
752           lr.n_cat_predictors--;
753         }
754       else if (lex_match_id (lexer, "PRINT"))
755         {
756           lex_match (lexer, T_EQUALS);
757           while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH)
758             {
759               if (lex_match_id (lexer, "DEFAULT"))
760                 {
761                   lr.print |= PRINT_DEFAULT;
762                 }
763               else if (lex_match_id (lexer, "SUMMARY"))
764                 {
765                   lr.print |= PRINT_SUMMARY;
766                 }
767 #if 0
768               else if (lex_match_id (lexer, "CORR"))
769                 {
770                   lr.print |= PRINT_CORR;
771                 }
772               else if (lex_match_id (lexer, "ITER"))
773                 {
774                   lr.print |= PRINT_ITER;
775                 }
776               else if (lex_match_id (lexer, "GOODFIT"))
777                 {
778                   lr.print |= PRINT_GOODFIT;
779                 }
780 #endif
781               else if (lex_match_id (lexer, "CI"))
782                 {
783                   lr.print |= PRINT_CI;
784                   if (lex_force_match (lexer, T_LPAREN))
785                     {
786                       if (! lex_force_int (lexer))
787                         {
788                           lex_error (lexer, NULL);
789                           goto error;
790                         }
791                       lr.confidence = lex_integer (lexer);
792                       lex_get (lexer);
793                       if ( ! lex_force_match (lexer, T_RPAREN))
794                         {
795                           lex_error (lexer, NULL);
796                           goto error;
797                         }
798                     }
799                 }
800               else if (lex_match_id (lexer, "ALL"))
801                 {
802                   lr.print = ~0x0000;
803                 }
804               else
805                 {
806                   lex_error (lexer, NULL);
807                   goto error;
808                 }
809             }
810         }
811       else if (lex_match_id (lexer, "CRITERIA"))
812         {
813           lex_match (lexer, T_EQUALS);
814           while (lex_token (lexer) != T_ENDCMD && lex_token (lexer) != T_SLASH)
815             {
816               if (lex_match_id (lexer, "BCON"))
817                 {
818                   if (lex_force_match (lexer, T_LPAREN))
819                     {
820                       if (! lex_force_num (lexer))
821                         {
822                           lex_error (lexer, NULL);
823                           goto error;
824                         }
825                       lr.bcon = lex_number (lexer);
826                       lex_get (lexer);
827                       if ( ! lex_force_match (lexer, T_RPAREN))
828                         {
829                           lex_error (lexer, NULL);
830                           goto error;
831                         }
832                     }
833                 }
834               else if (lex_match_id (lexer, "ITERATE"))
835                 {
836                   if (lex_force_match (lexer, T_LPAREN))
837                     {
838                       if (! lex_force_int (lexer))
839                         {
840                           lex_error (lexer, NULL);
841                           goto error;
842                         }
843                       lr.max_iter = lex_integer (lexer);
844                       lex_get (lexer);
845                       if ( ! lex_force_match (lexer, T_RPAREN))
846                         {
847                           lex_error (lexer, NULL);
848                           goto error;
849                         }
850                     }
851                 }
852               else if (lex_match_id (lexer, "LCON"))
853                 {
854                   if (lex_force_match (lexer, T_LPAREN))
855                     {
856                       if (! lex_force_num (lexer))
857                         {
858                           lex_error (lexer, NULL);
859                           goto error;
860                         }
861                       lr.lcon = lex_number (lexer);
862                       lex_get (lexer);
863                       if ( ! lex_force_match (lexer, T_RPAREN))
864                         {
865                           lex_error (lexer, NULL);
866                           goto error;
867                         }
868                     }
869                 }
870               else if (lex_match_id (lexer, "EPS"))
871                 {
872                   if (lex_force_match (lexer, T_LPAREN))
873                     {
874                       if (! lex_force_num (lexer))
875                         {
876                           lex_error (lexer, NULL);
877                           goto error;
878                         }
879                       lr.min_epsilon = lex_number (lexer);
880                       lex_get (lexer);
881                       if ( ! lex_force_match (lexer, T_RPAREN))
882                         {
883                           lex_error (lexer, NULL);
884                           goto error;
885                         }
886                     }
887                 }
888               else
889                 {
890                   lex_error (lexer, NULL);
891                   goto error;
892                 }
893             }
894         }
895       else
896         {
897           lex_error (lexer, NULL);
898           goto error;
899         }
900     }
901
902   /* Copy the predictor variables from the temporary location into the 
903      final one, dropping any categorical variables which appear there.
904      FIXME: This is O(NxM).
905   */
906   for (v = x = 0; v < n_pred_vars; ++v)
907     {
908       bool drop = false;
909       const struct variable *var = pred_vars[v];
910       int cv = 0;
911       for (cv = 0; cv < lr.n_cat_predictors ; ++cv)
912         {
913           int iv;
914           const struct interaction *iact = lr.cat_predictors[cv];
915           for (iv = 0 ; iv < iact->n_vars ; ++iv)
916             {
917               if (var == iact->vars[iv])
918                 {
919                   drop = true;
920                   goto dropped;
921                 }
922             }
923         }
924
925     dropped:
926       if (drop)
927         continue;
928
929       lr.predictor_vars = xrealloc (lr.predictor_vars, sizeof *lr.predictor_vars * (x + 1));
930       lr.predictor_vars[x++] = var;
931       lr.n_predictor_vars++;
932     }
933   free (pred_vars);
934
935
936   /* Run logistical regression for each split group */
937   {
938     struct casegrouper *grouper;
939     struct casereader *group;
940     bool ok;
941
942     grouper = casegrouper_create_splits (proc_open (ds), lr.dict);
943     while (casegrouper_get_next_group (grouper, &group))
944       ok = run_lr (&lr, group, ds);
945     ok = casegrouper_destroy (grouper);
946     ok = proc_commit (ds) && ok;
947   }
948
949   free (lr.predictor_vars);
950   free (lr.cat_predictors);
951   return CMD_SUCCESS;
952
953  error:
954
955   free (lr.predictor_vars);
956   free (lr.cat_predictors);
957   return CMD_FAILURE;
958 }
959
960
961 \f
962
963 /* Show the Dependent Variable Encoding box.
964    This indicates how the dependent variable
965    is mapped to the internal zero/one values.
966 */
967 static void
968 output_depvarmap (const struct lr_spec *cmd, const struct lr_result *res)
969 {
970   const int heading_columns = 0;
971   const int heading_rows = 1;
972   struct tab_table *t;
973   struct string str;
974
975   const int nc = 2;
976   int nr = heading_rows + 2;
977
978   t = tab_create (nc, nr);
979   tab_title (t, _("Dependent Variable Encoding"));
980
981   tab_headers (t, heading_columns, 0, heading_rows, 0);
982
983   tab_box (t, TAL_2, TAL_2, -1, TAL_1, 0, 0, nc - 1, nr - 1);
984
985   tab_hline (t, TAL_2, 0, nc - 1, heading_rows);
986   tab_vline (t, TAL_2, heading_columns, 0, nr - 1);
987
988   tab_text (t,  0, 0, TAB_CENTER | TAT_TITLE, _("Original Value"));
989   tab_text (t,  1, 0, TAB_CENTER | TAT_TITLE, _("Internal Value"));
990
991
992
993   ds_init_empty (&str);
994   var_append_value_name (cmd->dep_var, &res->y0, &str);
995   tab_text (t,  0, 0 + heading_rows,  0, ds_cstr (&str));
996
997   ds_clear (&str);
998   var_append_value_name (cmd->dep_var, &res->y1, &str);
999   tab_text (t,  0, 1 + heading_rows,  0, ds_cstr (&str));
1000
1001
1002   tab_double (t, 1, 0 + heading_rows, 0, map_dependent_var (cmd, res, &res->y0), &F_8_0);
1003   tab_double (t, 1, 1 + heading_rows, 0, map_dependent_var (cmd, res, &res->y1), &F_8_0);
1004   ds_destroy (&str);
1005
1006   tab_submit (t);
1007 }
1008
1009
1010 /* Show the Variables in the Equation box */
1011 static void
1012 output_variables (const struct lr_spec *cmd, 
1013                   const struct lr_result *res,
1014                   const gsl_vector *beta)
1015 {
1016   int row = 0;
1017   const int heading_columns = 1;
1018   int heading_rows = 1;
1019   struct tab_table *t;
1020
1021   int nc = 8;
1022   int nr ;
1023   int i = 0;
1024   int ivar = 0;
1025   int idx_correction = 0;
1026
1027   if (cmd->print & PRINT_CI)
1028     {
1029       nc += 2;
1030       heading_rows += 1;
1031       row++;
1032     }
1033   nr = heading_rows + cmd->n_predictor_vars;
1034   if (cmd->constant)
1035     nr++;
1036
1037   if (res->cats)
1038     nr += categoricals_df_total (res->cats) + cmd->n_cat_predictors;
1039
1040   t = tab_create (nc, nr);
1041   tab_title (t, _("Variables in the Equation"));
1042
1043   tab_headers (t, heading_columns, 0, heading_rows, 0);
1044
1045   tab_box (t, TAL_2, TAL_2, -1, TAL_1, 0, 0, nc - 1, nr - 1);
1046
1047   tab_hline (t, TAL_2, 0, nc - 1, heading_rows);
1048   tab_vline (t, TAL_2, heading_columns, 0, nr - 1);
1049
1050   tab_text (t,  0, row + 1, TAB_CENTER | TAT_TITLE, _("Step 1"));
1051
1052   tab_text (t,  2, row, TAB_CENTER | TAT_TITLE, _("B"));
1053   tab_text (t,  3, row, TAB_CENTER | TAT_TITLE, _("S.E."));
1054   tab_text (t,  4, row, TAB_CENTER | TAT_TITLE, _("Wald"));
1055   tab_text (t,  5, row, TAB_CENTER | TAT_TITLE, _("df"));
1056   tab_text (t,  6, row, TAB_CENTER | TAT_TITLE, _("Sig."));
1057   tab_text (t,  7, row, TAB_CENTER | TAT_TITLE, _("Exp(B)"));
1058
1059   if (cmd->print & PRINT_CI)
1060     {
1061       tab_joint_text_format (t, 8, 0, 9, 0,
1062                              TAB_CENTER | TAT_TITLE, _("%d%% CI for Exp(B)"), cmd->confidence);
1063
1064       tab_text (t,  8, row, TAB_CENTER | TAT_TITLE, _("Lower"));
1065       tab_text (t,  9, row, TAB_CENTER | TAT_TITLE, _("Upper"));
1066     }
1067  
1068   for (row = heading_rows ; row < nr; ++row)
1069     {
1070       const int idx = row - heading_rows - idx_correction;
1071
1072       const double b = gsl_vector_get (beta, idx);
1073       const double sigma2 = gsl_matrix_get (res->hessian, idx, idx);
1074       const double wald = pow2 (b) / sigma2;
1075       const double df = 1;
1076
1077       if (idx < cmd->n_predictor_vars)
1078         {
1079           tab_text (t, 1, row, TAB_LEFT | TAT_TITLE, 
1080                     var_to_string (cmd->predictor_vars[idx]));
1081         }
1082       else if (i < cmd->n_cat_predictors)
1083         {
1084           double wald;
1085           bool summary = false;
1086           struct string str;
1087           const struct interaction *cat_predictors = cmd->cat_predictors[i];
1088           const int df = categoricals_df (res->cats, i);
1089
1090           ds_init_empty (&str);
1091           interaction_to_string (cat_predictors, &str);
1092
1093           if (ivar == 0)
1094             {
1095               /* Calculate the Wald statistic,
1096                  which is \beta' C^-1 \beta .
1097                  where \beta is the vector of the coefficient estimates comprising this
1098                  categorial variable. and C is the corresponding submatrix of the 
1099                  hessian matrix.
1100               */
1101               gsl_matrix_const_view mv =
1102                 gsl_matrix_const_submatrix (res->hessian, idx, idx, df, df);
1103               gsl_matrix *subhessian = gsl_matrix_alloc (mv.matrix.size1, mv.matrix.size2);
1104               gsl_vector_const_view vv = gsl_vector_const_subvector (beta, idx, df);
1105               gsl_vector *temp = gsl_vector_alloc (df);
1106
1107               gsl_matrix_memcpy (subhessian, &mv.matrix);
1108               gsl_linalg_cholesky_decomp (subhessian);
1109               gsl_linalg_cholesky_invert (subhessian);
1110
1111               gsl_blas_dgemv (CblasTrans, 1.0, subhessian, &vv.vector, 0, temp);
1112               gsl_blas_ddot (temp, &vv.vector, &wald);
1113
1114               tab_double (t, 4, row, 0, wald, 0);
1115               tab_double (t, 5, row, 0, df, &F_8_0);
1116               tab_double (t, 6, row, 0, gsl_cdf_chisq_Q (wald, df), 0);
1117
1118               idx_correction ++;
1119               summary = true;
1120               gsl_matrix_free (subhessian);
1121               gsl_vector_free (temp);
1122             }
1123           else
1124             {
1125               ds_put_format (&str, "(%d)", ivar);
1126             }
1127
1128           tab_text (t, 1, row, TAB_LEFT | TAT_TITLE, ds_cstr (&str));
1129           if (ivar++ == df)
1130             {
1131               ++i; /* next interaction */
1132               ivar = 0;
1133             }
1134
1135           ds_destroy (&str);
1136
1137           if (summary)
1138             continue;
1139         }
1140       else
1141         {
1142           tab_text (t, 1, row, TAB_LEFT | TAT_TITLE, _("Constant"));
1143         }
1144
1145       tab_double (t, 2, row, 0, b, 0);
1146       tab_double (t, 3, row, 0, sqrt (sigma2), 0);
1147       tab_double (t, 4, row, 0, wald, 0);
1148       tab_double (t, 5, row, 0, df, &F_8_0);
1149       tab_double (t, 6, row, 0, gsl_cdf_chisq_Q (wald, df), 0);
1150       tab_double (t, 7, row, 0, exp (b), 0);
1151
1152       if (cmd->print & PRINT_CI)
1153         {
1154           double wc = gsl_cdf_ugaussian_Pinv (0.5 + cmd->confidence / 200.0);
1155           wc *= sqrt (sigma2);
1156
1157           if (idx < cmd->n_predictor_vars)
1158             {
1159               tab_double (t, 8, row, 0, exp (b - wc), 0);
1160               tab_double (t, 9, row, 0, exp (b + wc), 0);
1161             }
1162         }
1163     }
1164
1165   tab_submit (t);
1166 }
1167
1168
1169 /* Show the model summary box */
1170 static void
1171 output_model_summary (const struct lr_result *res,
1172                       double initial_likelihood, double likelihood)
1173 {
1174   const int heading_columns = 0;
1175   const int heading_rows = 1;
1176   struct tab_table *t;
1177
1178   const int nc = 4;
1179   int nr = heading_rows + 1;
1180   double cox;
1181
1182   t = tab_create (nc, nr);
1183   tab_title (t, _("Model Summary"));
1184
1185   tab_headers (t, heading_columns, 0, heading_rows, 0);
1186
1187   tab_box (t, TAL_2, TAL_2, -1, TAL_1, 0, 0, nc - 1, nr - 1);
1188
1189   tab_hline (t, TAL_2, 0, nc - 1, heading_rows);
1190   tab_vline (t, TAL_2, heading_columns, 0, nr - 1);
1191
1192   tab_text (t,  0, 0, TAB_LEFT | TAT_TITLE, _("Step 1"));
1193   tab_text (t,  1, 0, TAB_CENTER | TAT_TITLE, _("-2 Log likelihood"));
1194   tab_double (t,  1, 1, 0, -2 * log (likelihood), 0);
1195
1196
1197   tab_text (t,  2, 0, TAB_CENTER | TAT_TITLE, _("Cox & Snell R Square"));
1198   cox =  1.0 - pow (initial_likelihood /likelihood, 2 / res->cc);
1199   tab_double (t,  2, 1, 0, cox, 0);
1200
1201   tab_text (t,  3, 0, TAB_CENTER | TAT_TITLE, _("Nagelkerke R Square"));
1202   tab_double (t,  3, 1, 0, cox / ( 1.0 - pow (initial_likelihood, 2 / res->cc)), 0);
1203
1204
1205   tab_submit (t);
1206 }
1207
1208 /* Show the case processing summary box */
1209 static void
1210 case_processing_summary (const struct lr_result *res)
1211 {
1212   const int heading_columns = 1;
1213   const int heading_rows = 1;
1214   struct tab_table *t;
1215
1216   const int nc = 3;
1217   const int nr = heading_rows + 3;
1218   casenumber total;
1219
1220   t = tab_create (nc, nr);
1221   tab_title (t, _("Case Processing Summary"));
1222
1223   tab_headers (t, heading_columns, 0, heading_rows, 0);
1224
1225   tab_box (t, TAL_2, TAL_2, -1, TAL_1, 0, 0, nc - 1, nr - 1);
1226
1227   tab_hline (t, TAL_2, 0, nc - 1, heading_rows);
1228   tab_vline (t, TAL_2, heading_columns, 0, nr - 1);
1229
1230   tab_text (t,  0, 0, TAB_LEFT | TAT_TITLE, _("Unweighted Cases"));
1231   tab_text (t,  1, 0, TAB_CENTER | TAT_TITLE, _("N"));
1232   tab_text (t,  2, 0, TAB_CENTER | TAT_TITLE, _("Percent"));
1233
1234
1235   tab_text (t,  0, 1, TAB_LEFT | TAT_TITLE, _("Included in Analysis"));
1236   tab_text (t,  0, 2, TAB_LEFT | TAT_TITLE, _("Missing Cases"));
1237   tab_text (t,  0, 3, TAB_LEFT | TAT_TITLE, _("Total"));
1238
1239   tab_double (t,  1, 1, 0, res->n_nonmissing, &F_8_0);
1240   tab_double (t,  1, 2, 0, res->n_missing, &F_8_0);
1241
1242   total = res->n_nonmissing + res->n_missing;
1243   tab_double (t,  1, 3, 0, total , &F_8_0);
1244
1245   tab_double (t,  2, 1, 0, 100 * res->n_nonmissing / (double) total, 0);
1246   tab_double (t,  2, 2, 0, 100 * res->n_missing / (double) total, 0);
1247   tab_double (t,  2, 3, 0, 100 * total / (double) total, 0);
1248
1249   tab_submit (t);
1250 }
1251
1252 static void
1253 output_categories (const struct lr_spec *cmd, const struct lr_result *res)
1254 {
1255   const struct fmt_spec *wfmt =
1256     cmd->wv ? var_get_print_format (cmd->wv) : &F_8_0;
1257
1258   int cumulative_df;
1259   int i = 0;
1260   const int heading_columns = 2;
1261   const int heading_rows = 2;
1262   struct tab_table *t;
1263
1264   int nc ;
1265   int nr ;
1266
1267   int v;
1268   int r = 0;
1269
1270   int max_df = 0;
1271   int total_cats = 0;
1272   for (i = 0; i < cmd->n_cat_predictors; ++i)
1273     {
1274       size_t n = categoricals_n_count (res->cats, i);
1275       size_t df = categoricals_df (res->cats, i);
1276       if (max_df < df)
1277         max_df = df;
1278       total_cats += n;
1279     }
1280
1281   nc = heading_columns + 1 + max_df;
1282   nr = heading_rows + total_cats;
1283
1284   t = tab_create (nc, nr);
1285   tab_title (t, _("Categorical Variables' Codings"));
1286
1287   tab_headers (t, heading_columns, 0, heading_rows, 0);
1288
1289   tab_box (t, TAL_2, TAL_2, -1, TAL_1, 0, 0, nc - 1, nr - 1);
1290
1291   tab_hline (t, TAL_2, 0, nc - 1, heading_rows);
1292   tab_vline (t, TAL_2, heading_columns, 0, nr - 1);
1293
1294
1295   tab_text (t, heading_columns, 1, TAB_CENTER | TAT_TITLE, _("Frequency"));
1296
1297   tab_joint_text_format (t, heading_columns + 1, 0, nc - 1, 0,
1298                          TAB_CENTER | TAT_TITLE, _("Parameter coding"));
1299
1300
1301   for (i = 0; i < max_df; ++i)
1302     {
1303       int c = heading_columns + 1 + i;
1304       tab_text_format (t,  c, 1, TAB_CENTER | TAT_TITLE, _("(%d)"), i + 1);
1305     }
1306
1307   cumulative_df = 0;
1308   for (v = 0; v < cmd->n_cat_predictors; ++v)
1309     {
1310       int cat;
1311       const struct interaction *cat_predictors = cmd->cat_predictors[v];
1312       int df =  categoricals_df (res->cats, v);
1313       struct string str;
1314       ds_init_empty (&str);
1315
1316       interaction_to_string (cat_predictors, &str);
1317
1318       tab_text (t, 0, heading_rows + r, TAB_LEFT | TAT_TITLE, ds_cstr (&str) );
1319
1320       ds_destroy (&str);
1321
1322       for (cat = 0; cat < categoricals_n_count (res->cats, v) ; ++cat)
1323         {
1324           struct string str;
1325           const struct ccase *c = categoricals_get_case_by_category_real (res->cats, v, cat);
1326           const double *freq = categoricals_get_user_data_by_category_real (res->cats, v, cat);
1327           
1328           int x;
1329           ds_init_empty (&str);
1330
1331           for (x = 0; x < cat_predictors->n_vars; ++x)
1332             {
1333               const union value *val = case_data (c, cat_predictors->vars[x]);
1334               var_append_value_name (cat_predictors->vars[x], val, &str);
1335
1336               if (x < cat_predictors->n_vars - 1)
1337                 ds_put_cstr (&str, " ");
1338             }
1339           
1340           tab_text   (t, 1, heading_rows + r, 0, ds_cstr (&str));
1341           ds_destroy (&str);
1342           tab_double (t, 2, heading_rows + r, 0, *freq, wfmt);
1343
1344           for (x = 0; x < df; ++x)
1345             {
1346               tab_double (t, heading_columns + 1 + x, heading_rows + r, 0, (cat == x), &F_8_0);
1347             }
1348           ++r;
1349         }
1350       cumulative_df += df;
1351     }
1352
1353   tab_submit (t);
1354
1355 }