Added scope and explanation of use of conditional inverse; added appropriate enum...
[pspp-builds.git] / src / math / linreg / linreg.c
index 9ba84f60ece9d8c3991be31cce09766129e886ef..3c086a98f22ce1868ac581e1cdc4bc359671483f 100644 (file)
@@ -110,7 +110,7 @@ pspp_linreg_get_vars (const void *c_, const struct variable **v)
   /*
      Start at c->coeff[1] to avoid the intercept.
    */
-  v[result] =  pspp_coeff_get_var (c->coeff[1], 0);
+  v[result] = pspp_coeff_get_var (c->coeff[1], 0);
   result = (v[result] == NULL) ? 0 : 1;
 
   for (coef = c->coeff[2]; coef < c->coeff[c->n_coeffs]; coef++)
@@ -366,6 +366,18 @@ pspp_linreg (const gsl_vector * Y, const gsl_matrix * X,
        }
       gsl_matrix_free (sw);
     }
+  else if (cache->method == PSPP_LINREG_CONDITIONAL_INVERSE)
+    {
+      /*
+       Use the SVD of X^T X to find a conditional inverse of X^TX. If
+       the SVD is X^T X = U D V^T, then set the conditional inverse
+       to (X^T X)^c = V D^- U^T. D^- is defined as follows: If entry
+       (i, i) has value sigma_i, then entry (i, i) of D^- is 1 /
+       sigma_i if sigma_i > 0, and 0 otherwise. Then solve the normal
+       equations by setting the estimated parameter vector to 
+       (X^TX)^c X^T Y.
+       */
+    }
   else
     {
       gsl_multifit_linear_workspace *wk;