X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Fregression.q;h=463d18f9ad16dc26eef74dfd015a4989cd8aa8fc;hb=6f135ae2a14a178f850c25cb4bad6c0aae88c920;hp=c7dc7d504f660a0034a53ecd210eb308d4f64f75;hpb=08703a888d1cc31459e6028a61e3940f6d4b2c5f;p=pspp diff --git a/src/language/stats/regression.q b/src/language/stats/regression.q index c7dc7d504f..463d18f9ad 100644 --- a/src/language/stats/regression.q +++ b/src/language/stats/regression.q @@ -18,32 +18,37 @@ 02110-1301, USA. */ #include -#include + #include -#include #include +#include #include -#include +#include + +#include "regression-export.h" #include #include -#include #include -#include -#include -#include +#include #include -#include +#include +#include +#include +#include +#include +#include +#include #include -#include "gettext.h" #include -#include +#include +#include +#include +#include #include -#include -#include "regression-export.h" +#include #include -#include -#include -#include + +#include "gettext.h" #define REG_LARGE_DATA 1000 @@ -112,7 +117,8 @@ struct file_handle *model_file; */ int pspp_reg_rc = CMD_SUCCESS; -static bool run_regression (const struct casefile *, void *); +static bool run_regression (const struct ccase *, + const struct casefile *, void *); /* STATISTICS subcommand output functions. @@ -539,58 +545,34 @@ static int regression_trns_pred_proc (void *t_, struct ccase *c, int case_idx UNUSED) { size_t i; - size_t n_vars; - size_t n_vals = 0; - union value *tmp = NULL; - struct reg_trns *t = t_; + size_t n_vals; + struct reg_trns *trns = t_; pspp_linreg_cache *model; - union value *output; + union value *output = NULL; const union value **vals = NULL; struct variable **vars = NULL; - struct variable **model_vars = NULL; - assert (t != NULL); - model = t->c; + assert (trns!= NULL); + model = trns->c; assert (model != NULL); assert (model->depvar != NULL); assert (model->pred != NULL); - - dict_get_vars (default_dict, &vars, &n_vars, 1u << DC_SYSTEM); - vals = xnmalloc (n_vars, sizeof (*vals)); - model_vars = xnmalloc (n_vars, sizeof (*model_vars)); - assert (vals != NULL); + + vars = xnmalloc (model->n_coeffs, sizeof (*vars)); + n_vals = (*model->get_vars) (model, vars); + + vals = xnmalloc (n_vals, sizeof (*vals)); output = case_data_rw (c, model->pred->fv); assert (output != NULL); - for (i = 0; i < n_vars; i++) + for (i = 0; i < n_vals; i++) { - /* Use neither the predicted values nor the dependent variable. */ - if (vars[i]->index != model->pred->index && - vars[i]->index != model->depvar->index) - { - if (vars[i]->type == ALPHA && vars[i]->obs_vals != NULL) - { - tmp = vars[i]->obs_vals->vals; - } - else - { - tmp = NULL; - } - /* - Make sure the variable we use is in the linear model. - */ - if (pspp_linreg_get_coeff (model, vars[i], tmp) != NULL) - { - vals[n_vals] = case_data (c, i); - model_vars[n_vals] = vars[i]; - n_vals++; - } - } + vals[i] = case_data (c, vars[i]->fv); } output->f = (*model->predict) ((const struct variable **) vars, vals, model, n_vals); free (vals); - free (model_vars); + free (vars); return TRNS_CONTINUE; } /* @@ -600,64 +582,36 @@ static int regression_trns_resid_proc (void *t_, struct ccase *c, int case_idx UNUSED) { size_t i; - size_t n_vars; - size_t n_vals = 0; - struct reg_trns *t = t_; + size_t n_vals; + struct reg_trns *trns = t_; pspp_linreg_cache *model; - union value *output; - union value *tmp; + union value *output = NULL; const union value **vals = NULL; const union value *obs = NULL; struct variable **vars = NULL; - struct variable **model_vars = NULL; - assert (t!= NULL); - model = t->c; + assert (trns!= NULL); + model = trns->c; assert (model != NULL); assert (model->depvar != NULL); assert (model->resid != NULL); - - dict_get_vars (default_dict, &vars, &n_vars, 1u << DC_SYSTEM); - vals = xnmalloc (n_vars, sizeof (*vals)); - model_vars = xnmalloc (n_vars, sizeof (*model_vars)); - assert (vals != NULL); + + vars = xnmalloc (model->n_coeffs, sizeof (*vars)); + n_vals = (*model->get_vars) (model, vars); + + vals = xnmalloc (n_vals, sizeof (*vals)); output = case_data_rw (c, model->resid->fv); assert (output != NULL); - for (i = 0; i < n_vars; i++) + for (i = 0; i < n_vals; i++) { - /* Use neither the predicted values nor the dependent variable. */ - if (vars[i]->index != model->resid->index && - vars[i]->index != model->depvar->index) - { - if (vars[i]->type == ALPHA && vars[i]->obs_vals != NULL) - { - tmp = vars[i]->obs_vals->vals; - } - else - { - tmp = NULL; - } - /* - Make sure the variable we use is in the linear model. - */ - if (pspp_linreg_get_coeff (model, vars[i], tmp) != NULL) - { - vals[n_vals] = case_data (c, i); - model_vars[n_vals] = vars[i]; - n_vals++; - } - } - if (vars[i]->index == model->depvar->index) - { - obs = case_data (c, i); - assert (obs != NULL); - } + vals[i] = case_data (c, vars[i]->fv); } + obs = case_data (c, model->depvar->fv); output->f = (*model->residual) ((const struct variable **) vars, vals, obs, model, n_vals); free (vals); - free (model_vars); + free (vars); return TRNS_CONTINUE; } /* @@ -689,12 +643,11 @@ reg_save_var (const char *prefix, trns_proc_func *f, int n_trns) { static int trns_index = 1; - char name[LONG_NAME_LEN + 1]; + char name[LONG_NAME_LEN]; struct variable *new_var; struct reg_trns *t = NULL; t = xmalloc (sizeof (*t)); - assert (t != NULL); t->trns_id = trns_index; t->n_trns = n_trns; t->c = c; @@ -1119,7 +1072,8 @@ int prepare_data (int n_data, int is_missing_case[], return n_data; } static bool -run_regression (const struct casefile *cf, void *cmd_ UNUSED) +run_regression (const struct ccase *first, + const struct casefile *cf, void *cmd_ UNUSED) { size_t i; size_t n_data = 0; /* Number of valide cases. */ @@ -1142,6 +1096,9 @@ run_regression (const struct casefile *cf, void *cmd_ UNUSED) pspp_linreg_opts lopts; assert (models != NULL); + + output_split_file_values (first); + if (!v_variables) { dict_get_vars (default_dict, &v_variables, &n_variables,