+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
/*
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++)
}
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;