X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fmath%2Flinreg%2Fcoefficient.c;h=c98c9abcc49d8713e8c83e7615cb01aff47be3fc;hb=82a9572a7a0ec2f7fc572cc9807bc5205a5e8a8d;hp=cca02bcba81363cb4329b3d685ebf45a251746dd;hpb=c12ea6023d97118ffffbfb9053b7f863dabacff5;p=pspp-builds.git diff --git a/src/math/linreg/coefficient.c b/src/math/linreg/coefficient.c index cca02bcb..c98c9abc 100644 --- a/src/math/linreg/coefficient.c +++ b/src/math/linreg/coefficient.c @@ -1,23 +1,22 @@ -/* lib/linreg/coefficient.c - - Copyright (C) 2005 Free Software Foundation, Inc. - Written by Jason H Stover. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or (at - your option) any later version. - - This program is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02111-1307, USA. - */ +/* + lib/linreg/coefficient.c + + Copyright (C) 2005 Free Software Foundation, Inc. Written by Jason H Stover. + + This program is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. + + You should have received a copy of the GNU General Public License along with + this program; if not, write to the Free Software Foundation, Inc., 51 + Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA. +*/ /* Accessor functions for matching coefficients and variables. @@ -32,20 +31,20 @@ struct varinfo { const struct variable *v; /* Variable associated with this - coefficient. Note this variable may not - be unique. In other words, a - coefficient structure may have other - v_info's, each with its own variable. - */ - const union value *val; /* Value of the variable v which this - varinfo refers to. This member is relevant - only to categorical variables. - */ + coefficient. Note this variable + may not be unique. In other words, + a coefficient structure may have + other v_info's, each with its own + variable. */ + const union value *val; /* Value of the variable v which this varinfo + refers to. This member is relevant only to + categorical variables. */ }; void pspp_linreg_coeff_free (struct pspp_linreg_coeff *c) { + free (c->v_info); free (c); } @@ -62,14 +61,17 @@ pspp_linreg_coeff_init (pspp_linreg_cache * c, struct design_matrix *X) struct pspp_linreg_coeff *coeff; c->coeff = xnmalloc (X->m->size2 + 1, sizeof (*c->coeff)); + c->coeff[0] = xmalloc (sizeof (*c->coeff[0])); + c->coeff[0]->v_info = NULL; /* Intercept has no associated variable. */ for (i = 0; i < X->m->size2; i++) { j = i + 1; /* The first coefficient is the intercept. */ - coeff = c->coeff + j; + c->coeff[j] = xmalloc (sizeof (*c->coeff[j])); + coeff = c->coeff[j]; coeff->n_vars = n_vals; /* Currently, no procedures allow - interactions. This will have to + interactions. This line will have to change when procedures that allow - interaction terms are written. + interaction terms are written. */ coeff->v_info = xnmalloc (coeff->n_vars, sizeof (*coeff->v_info)); assert (coeff->v_info != NULL); @@ -111,10 +113,11 @@ pspp_linreg_coeff_get_est (const struct pspp_linreg_coeff *c) } return c->estimate; } + /* Return the standard error of the estimated coefficient. */ -double +double pspp_linreg_coeff_get_std_err (const struct pspp_linreg_coeff *c) { if (c == NULL) @@ -123,6 +126,7 @@ pspp_linreg_coeff_get_std_err (const struct pspp_linreg_coeff *c) } return c->std_err; } + /* How many variables are associated with this coefficient? */ @@ -137,7 +141,8 @@ pspp_linreg_coeff_get_n_vars (struct pspp_linreg_coeff *c) } /* - Which variable does this coefficient match? + Which variable does this coefficient match? I should be + 0 unless the coefficient refers to an interaction term. */ const struct variable * pspp_linreg_coeff_get_var (struct pspp_linreg_coeff *c, int i) @@ -150,9 +155,9 @@ pspp_linreg_coeff_get_var (struct pspp_linreg_coeff *c, int i) return (c->v_info + i)->v; } -/* - Which value is associated with this coefficient/variable comination? -*/ +/* + Which value is associated with this coefficient/variable combination? + */ const union value * pspp_linreg_coeff_get_value (struct pspp_linreg_coeff *c, const struct variable *v) @@ -164,6 +169,10 @@ pspp_linreg_coeff_get_value (struct pspp_linreg_coeff *c, { return NULL; } + if (v->type == NUMERIC) + { + return NULL; + } while (i < c->n_vars) { candidate = pspp_linreg_coeff_get_var (c, i); @@ -175,33 +184,37 @@ pspp_linreg_coeff_get_value (struct pspp_linreg_coeff *c, } return NULL; } + /* Which coefficient is associated with V? The VAL argument is relevant only to categorical variables. */ const struct pspp_linreg_coeff * -pspp_linreg_get_coeff (const pspp_linreg_cache *c, - const struct variable *v, - const union value *val) +pspp_linreg_get_coeff (const pspp_linreg_cache * c, + const struct variable *v, const union value *val) { int i = 1; - struct pspp_linreg_coeff *result; - const struct variable *tmp; + struct pspp_linreg_coeff *result = NULL; + const struct variable *tmp = NULL; - if (c == NULL || c->coeff == NULL || c->n_indeps == NULL || v == NULL) + if (c == NULL) { return NULL; } - - result = c->coeff + i; + if (c->coeff == NULL || c->n_indeps == 0 || v == NULL) + { + return NULL; + } + + result = c->coeff[i]; tmp = pspp_linreg_coeff_get_var (result, 0); while (tmp->index != v->index && i < c->n_coeffs) { - i++; - result = c->coeff + i; + result = c->coeff[i]; tmp = pspp_linreg_coeff_get_var (result, 0); + i++; } - if (i == c->n_coeffs) + if (i > c->n_coeffs) { return NULL; } @@ -212,14 +225,15 @@ pspp_linreg_get_coeff (const pspp_linreg_cache *c, else if (val != NULL) { /* - If v is categorical, we need to ensure the coefficient - matches the VAL. + If v is categorical, we need to ensure the coefficient + matches the VAL. */ - while (tmp->index != v->index && i < c->n_coeffs && - compare_values (pspp_linreg_coeff_get_value (result, tmp), val, v->width))/*FIX THIS*/ - { + while (tmp->index != v->index && i < c->n_coeffs + && compare_values (pspp_linreg_coeff_get_value (result, tmp), + val, v->width)) + { /* FIX THIS */ i++; - result = c->coeff + i; + result = c->coeff[i]; tmp = pspp_linreg_coeff_get_var (result, 0); } if (i == c->n_coeffs) @@ -230,4 +244,3 @@ pspp_linreg_get_coeff (const pspp_linreg_cache *c, } return NULL; } -