Added scope and explanation of use of conditional inverse; added appropriate enum...
authorJason Stover <jhs@math.gcsu.edu>
Sun, 12 Aug 2007 02:36:50 +0000 (02:36 +0000)
committerJason Stover <jhs@math.gcsu.edu>
Sun, 12 Aug 2007 02:36:50 +0000 (02:36 +0000)
src/math/linreg/ChangeLog
src/math/linreg/linreg.c
src/math/linreg/linreg.h

index 5f5a617b8eae210579d28dae39f233f676867d62..a45216fd1e1f63241331094428572b6f577a3875 100644 (file)
@@ -1,3 +1,11 @@
+2007-08-11  Jason Stover  <jhs@math.gcsu.edu>
+
+       * linreg.h (enum): Dropped ambiguous PSPP_LINREG_SVD in favor of
+       PSPP_LINREG_QR. Added PSPP_LINREG_CONDITIONAL_INVERSE.
+
+       * linreg.c (pspp_linreg): Added scope and comment for use of
+       generalized inverse to solve normal equations.
+
 2007-04-12  Jason Stover  <jhs@math.gcsu.edu>
 
        * linreg.c: (pspp_linreg_cache_free) Check for null pointer before
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;
index f256ef9d3fca6ea7f208022d258a7a605f16568c..d09752a21b50e272663039fcdcedb9b0c26480af 100644 (file)
@@ -27,8 +27,9 @@ union value;
 
 enum
 {
+  PSPP_LINREG_CONDITIONAL_INVERSE,
+  PSPP_LINREG_QR,
   PSPP_LINREG_SWEEP,
-  PSPP_LINREG_SVD
 };