Added coefficient-handling routines
[pspp] / lib / linreg / pspp_linreg.h
index 92e78a0f24b3b853f094b76cf75d8f10371d781d..a83f7b3d11ec7a8b5d240ec194b838082d0e3da9 100644 (file)
@@ -54,6 +54,9 @@
 #include <gsl/gsl_multifit.h>
 #include <gsl/gsl_blas.h>
 #include <gsl/gsl_cblas.h>
+#include <src/design-matrix.h>
+#include <src/var.h>
+#define PSPP_LINREG_VAL_NOT_FOUND -1
 enum
 {
   PSPP_LINREG_SWEEP,
@@ -62,18 +65,47 @@ enum
 
 /*
   Cache for the relevant data from the model. There are several
-  members which the caller may not use, and which could use a lot of
+  members which the caller might not use, and which could use a lot of
   storage. Therefore non-essential members of the struct will be
   allocated only when requested.
  */
+struct pspp_linreg_coeff
+{
+  double estimate; /* Estimated coefficient. */
+  double std_err; /* Standard error of the estimate. */
+  struct varinfo *v_info;  /* Information pertaining to the
+                             variable(s) associated with this
+                             coefficient.  The calling function
+                             should initialize this value with the
+                             functions in coefficient.c.  The
+                             estimation procedure ignores this
+                             member. It is here so the caller can
+                             match parameters with relevant variables
+                             and values. If the coefficient is
+                             associated with an interaction, then
+                             v_info contains information for multiple
+                             variables.
+                          */
+  int n_vars; /* Number of variables associated with this coefficient.
+                Coefficients corresponding to interaction terms will
+                have more than one variable.
+             */
+};
 struct pspp_linreg_cache_struct
 {
   int n_obs;                   /* Number of observations. */
   int n_indeps;                        /* Number of independent variables. */
-  gsl_vector *depvar;
-  gsl_matrix *indepvar;
+  int n_coeffs;
+
+  /* 
+     The variable struct is ignored during estimation.
+     It is here so the calling procedure can
+     find the variable used in the model.
+  */
+  const struct variable *depvar;
+
   gsl_vector *residuals;
-  gsl_vector *param_estimates;
+  struct pspp_linreg_coeff *coeff;
   int method;                  /* Method to use to estimate parameters. */
   /*
      Means and standard deviations of the variables.
@@ -81,8 +113,8 @@ struct pspp_linreg_cache_struct
      called, pspp_linreg() will compute their values.
 
      Entry i of indep_means is the mean of independent
-     variable i, whose observations are stored in column i
-     of indepvar.
+     variable i, whose observations are stored in the ith
+     column of the design matrix.
    */
   double depvar_mean;
   double depvar_std;
@@ -158,4 +190,17 @@ void pspp_linreg_cache_free (pspp_linreg_cache * cache);
 
 int pspp_linreg (const gsl_vector * Y, const gsl_matrix * X,
                 const pspp_linreg_opts * opts, pspp_linreg_cache * cache);
+void pspp_linreg_coeff_init (pspp_linreg_cache *, struct design_matrix *);
+
+void pspp_linreg_coeff_free (struct pspp_linreg_coeff *);
+
+void pspp_linreg_coeff_set_estimate (struct pspp_linreg_coeff *, double);
+
+void pspp_linreg_coeff_set_std_err (struct pspp_linreg_coeff *, double);
+
+int pspp_linreg_coeff_get_n_vars (struct pspp_linreg_coeff *);
+
+const struct variable *pspp_linreg_coeff_get_var (struct pspp_linreg_coeff *, int);
+
+const union value *pspp_linreg_coeff_get_value (struct pspp_linreg_coeff *, const struct variable *);
 #endif