Implemented the recently used files menus.
[pspp] / src / language / stats / regression.q
index 14280be65c6caaaf8caddabdd1a5346658a79626..995c862006b22ef8eafd4a3accdde75a66fcd4ea 100644 (file)
@@ -88,8 +88,8 @@ static struct cmd_regression cmd;
  */
 struct moments_var
 {
-  struct moments *m;
-  struct variable *v;
+  struct moments1 *m;
+  const struct variable *v;
 };
 
 /* Linear regression models. */
@@ -108,7 +108,7 @@ struct reg_trns
 /*
   Variables used (both explanatory and response).
  */
-static struct variable **v_variables;
+static const struct variable **v_variables;
 
 /*
   Number of variables.
@@ -974,13 +974,15 @@ is_depvar (size_t k, const struct variable *v)
   Compute the first two moments.
  */
 static size_t
-mark_missing_cases (const struct casefile *cf, struct variable *v,
-                   int *is_missing_case, double n_data, struct moments_var *mom)
+mark_missing_cases (const struct casefile *cf, const struct variable *v,
+                   int *is_missing_case, double n_data,
+                    struct moments_var *mom)
 {
   struct casereader *r;
   struct ccase c;
   size_t row;
   const union value *val;
+  double w = 1.0;
 
   for (r = casefile_get_reader (cf, NULL);
        casereader_read (r, &c); case_destroy (&c))
@@ -990,7 +992,7 @@ mark_missing_cases (const struct casefile *cf, struct variable *v,
       val = case_data (&c, v);
       if (mom != NULL)
        {
-         moments_pass_one (mom->m, val->f, 1.0);
+         moments1_add (mom->m, val->f, w);
        }
       cat_value_update (v, val);
       if (var_is_value_missing (v, val, MV_ANY))
@@ -1023,7 +1025,7 @@ regression_custom_variables (struct lexer *lexer, struct dataset *ds,
     return 2;
 
 
-  if (!parse_variables (lexer, dict, &v_variables, &n_variables, PV_NONE))
+  if (!parse_variables_const (lexer, dict, &v_variables, &n_variables, PV_NONE))
     {
       free (v_variables);
       return 0;
@@ -1063,8 +1065,9 @@ get_n_indep (const struct variable *v)
 */
 static int
 prepare_data (int n_data, int is_missing_case[],
-             struct variable **indep_vars,
-             struct variable *depvar, const struct casefile *cf, struct moments_var *mom)
+             const struct variable **indep_vars,
+             const struct variable *depvar, const struct casefile *cf,
+              struct moments_var *mom)
 {
   int i;
   int j;
@@ -1103,6 +1106,37 @@ coeff_init (pspp_linreg_cache * c, struct design_matrix *dm)
   pspp_coeff_init (c->coeff + 1, dm);
 }
 
+/*
+  Put the moments in the linreg cache.
+ */
+static void
+compute_moments (pspp_linreg_cache *c, struct moments_var *mom, struct design_matrix *dm, size_t n)
+{
+  size_t i;
+  size_t j;
+  double weight;
+  double mean;
+  double variance;
+  double skewness;
+  double kurtosis;
+  /*
+    Scan the variable names in the columns of the design matrix.
+    When we find the variable we need, insert its mean in the cache.
+   */
+  for (i = 0; i < dm->m->size2; i++)
+    {
+      for (j = 0; j < n; j++)
+       {
+         if (design_matrix_col_to_var (dm, i) == (mom + j)->v)
+           {
+             moments1_calculate ((mom + j)->m, &weight, &mean, &variance,
+                                 &skewness, &kurtosis);
+             gsl_vector_set (c->indep_means, i, mean);
+             gsl_vector_set (c->indep_std, i, sqrt (variance));
+           }
+       }
+    }
+}
 static bool
 run_regression (const struct ccase *first,
                const struct casefile *cf, void *cmd_ UNUSED, const struct dataset *ds)
@@ -1121,7 +1155,7 @@ run_regression (const struct ccase *first,
   const union value *val;
   struct casereader *r;
   struct ccase c;
-  struct variable **indep_vars;
+  const struct variable **indep_vars;
   struct design_matrix *X;
   struct moments_var *mom;
   gsl_vector *Y;
@@ -1154,7 +1188,7 @@ run_regression (const struct ccase *first,
   mom = xnmalloc (n_variables, sizeof (*mom));
   for (i = 0; i < n_variables; i++)
     {
-      (mom + i)->m = moments_create (MOMENT_VARIANCE);
+      (mom + i)->m = moments1_create (MOMENT_VARIANCE);
       (mom + i)->v = v_variables[i];
     }
   lopts.get_depvar_mean_std = 1;
@@ -1249,6 +1283,7 @@ run_regression (const struct ccase *first,
          Find the least-squares estimates and other statistics.
        */
       pspp_linreg ((const gsl_vector *) Y, X->m, &lopts, models[k]);
+      compute_moments (models[k], mom, X, n_variables);
       subcommand_statistics (cmd.a_statistics, models[k]);
       subcommand_export (cmd.sbc_export, models[k]);
 
@@ -1260,7 +1295,7 @@ run_regression (const struct ccase *first,
     }
   for (i = 0; i < n_variables; i++)
     {
-      moments_destroy ((mom + i)->m);
+      moments1_destroy ((mom + i)->m);
     }
   free (mom);
   free (is_missing_case);