Set final element in covariance matrix. Use accessor functions for linreg struct...
[pspp-builds.git] / src / math / linreg.c
index b6d1c16c7c6105629dfa28b448cb46fd873cf7b2..6a0d57f4c3eb20bb67026ff2c36959580cac4174 100644 (file)
@@ -70,10 +70,15 @@ linreg_alloc (const struct variable *depvar, const struct variable **indep_vars,
              double n, size_t p)
 {
   linreg *c;
+  size_t i;
 
-  c = (linreg *) malloc (sizeof (linreg));
+  c = xmalloc (sizeof (*c));
   c->depvar = depvar;
-  c->indep_vars = indep_vars;
+  c->indep_vars = xnmalloc (p, sizeof (*indep_vars));
+  for (i = 0; i < p; i++)
+    {
+      c->indep_vars[i] = indep_vars[i];
+    }
   c->indep_means = gsl_vector_alloc (p);
   c->indep_std = gsl_vector_alloc (p);
   c->ssx = gsl_vector_alloc (p);       /* Sums of squares for the
@@ -95,8 +100,8 @@ linreg_alloc (const struct variable *depvar, const struct variable **indep_vars,
      Default settings.
    */
   c->method = LINREG_SWEEP;
-  c->resid = NULL;             /* The variable storing my residuals. */
-  c->pred = NULL;              /* The variable storing my predicted values. */
+  c->pred = NULL;
+  c->resid = NULL;
 
   return c;
 }
@@ -111,6 +116,7 @@ linreg_free (void *m)
       gsl_vector_free (c->indep_std);
       gsl_matrix_free (c->cov);
       gsl_vector_free (c->ssx);
+      free (c->indep_vars);
       free (c->coeff);
       free (c);
     }
@@ -359,6 +365,7 @@ linreg_fit (const gsl_matrix *cov, linreg *l)
 
   params = gsl_matrix_calloc (cov->size1, cov->size2);
   gsl_matrix_memcpy (params, cov);
+  l->sst = gsl_matrix_get (cov, cov->size1 - 1, cov->size2 - 1);
 
   if (l->method == LINREG_SWEEP)
     {
@@ -413,10 +420,21 @@ linreg_n_obs (const linreg *c)
   return c->n_obs;
 }
 
+double
+linreg_sse (const linreg *c)
+{
+  return c->sse;
+}
+
 double
 linreg_ssreg (const linreg *c)
 {
-  return c->ssm;
+  return (c->sst - c->sse);
+}
+
+double linreg_sst (const linreg *c)
+{
+  return c->sst;
 }
 
 double