pass only the variables in the model to pspp_linreg_predict()
authorJason Stover <jhs@math.gcsu.edu>
Fri, 28 Apr 2006 19:17:15 +0000 (19:17 +0000)
committerJason Stover <jhs@math.gcsu.edu>
Fri, 28 Apr 2006 19:17:15 +0000 (19:17 +0000)
src/language/stats/ChangeLog
src/language/stats/regression.q

index fce036c1aa214df65d633217db59ba03343d29ba..6f7c271f141832fc12d5447a157ebe2f7bc11dfa 100644 (file)
@@ -3,6 +3,9 @@
        * regression.q (regression_trns_resid_proc): Pass only the
        variables used in the model to (*model->residual)().
 
+       * regression.q (regression_trns_pred_proc): Pass only the
+       variables used in the model to (*model->pred)().
+
 2006-04-26  Jason Stover  <jhs@math.gcsu.edu>
 
        * regression.q: Added support for multiple transformations.
index c9e245d23de4ca95a6fdbe204d93d64dd2f35e67..793d8325662de50bb5a174285022ba54ac80b6f5 100644 (file)
@@ -539,58 +539,34 @@ static int
 regression_trns_pred_proc (void *t_, struct ccase *c, int case_idx UNUSED)
 {
   size_t i;
-  size_t n_vars;
-  size_t n_vals = 0;
-  union value *tmp = NULL;
-  struct reg_trns *t = t_;
+  size_t n_vals;
+  struct reg_trns *trns = t_;
   pspp_linreg_cache *model;
-  union value *output;
+  union value *output = NULL;
   const union value **vals = NULL;
   struct variable **vars = NULL;
-  struct variable **model_vars = NULL;
   
-  assert (t != NULL);
-  model = t->c;
+  assert (trns!= NULL);
+  model = trns->c;
   assert (model != NULL);
   assert (model->depvar != NULL);
   assert (model->pred != NULL);
-  
-  dict_get_vars (default_dict, &vars, &n_vars, 1u << DC_SYSTEM);
-  vals = xnmalloc (n_vars, sizeof (*vals));
-  model_vars = xnmalloc (n_vars, sizeof (*model_vars));
-  assert (vals != NULL);
+
+  vars = xnmalloc (model->n_coeffs, sizeof (*vars));
+  n_vals = (*model->get_vars) (model, vars);
+
+  vals = xnmalloc (n_vals, sizeof (*vals));
   output = case_data_rw (c, model->pred->fv);
   assert (output != NULL);
 
-  for (i = 0; i < n_vars; i++)
+  for (i = 0; i < n_vals; i++)
     {
-      /* Use neither the predicted values nor the dependent variable. */
-      if (vars[i]->index != model->pred->index &&
-         vars[i]->index != model->depvar->index)
-       {
-         if (vars[i]->type == ALPHA && vars[i]->obs_vals != NULL)
-           {
-             tmp = vars[i]->obs_vals->vals;
-           }
-         else 
-           {
-             tmp = NULL;
-           }
-         /* 
-            Make sure the variable we use is in the linear model.
-         */
-         if (pspp_linreg_get_coeff (model, vars[i], tmp) != NULL)
-           {
-             vals[n_vals] = case_data (c, i);
-             model_vars[n_vals] = vars[i];
-             n_vals++;
-           }
-       }
+      vals[i] = case_data (c, vars[i]->fv);
     }
   output->f = (*model->predict) ((const struct variable **) vars, 
                                  vals, model, n_vals);
   free (vals);
-  free (model_vars);
+  free (vars);
   return TRNS_CONTINUE;
 }
 /*