X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Fregression.q;h=8f9979ae73306476c8eec5a6c42105a01a951d7a;hb=dc7b35971ff0214f6dc5f1a2c909a63a053a95b7;hp=c7e8179a579086620064f53e0bd6bb5eace213ce;hpb=f550aee00a62fe1d8baf62d83cd7efef6cc2ee92;p=pspp diff --git a/src/language/stats/regression.q b/src/language/stats/regression.q index c7e8179a57..8f9979ae73 100644 --- a/src/language/stats/regression.q +++ b/src/language/stats/regression.q @@ -862,9 +862,57 @@ fill_covariance (gsl_matrix *cov, struct covariance *all_cov, gsl_matrix_set (cov, cov->size1 - 1, cov->size1 - 1, gsl_matrix_get (cm, dep_subscript, dep_subscript)); free (rows); + gsl_matrix_free (cm); return result; } +static size_t +get_n_all_vars (struct cmd_regression *cmd) +{ + size_t result = n_variables; + size_t i; + size_t j; + result += cmd->n_dependent; + for (i = 0; i < cmd->n_dependent; i++) + { + for (j = 0; j < n_variables; j++) + { + if (v_variables[j] == cmd->v_dependent[i]) + { + result--; + } + } + } + return result; +} +static void +fill_all_vars (const struct variable **vars, struct cmd_regression *cmd) +{ + size_t i; + size_t j; + bool absent; + + for (i = 0; i < n_variables; i++) + { + vars[i] = v_variables[i]; + } + for (i = 0; i < cmd->n_dependent; i++) + { + absent = true; + for (j = 0; j < n_variables; j++) + { + if (cmd->v_dependent[i] == v_variables[j]) + { + absent = false; + break; + } + } + if (absent) + { + vars[i + n_variables] = cmd->v_dependent[i]; + } + } +} static bool run_regression (struct casereader *input, struct cmd_regression *cmd, struct dataset *ds, linreg **models) @@ -877,10 +925,11 @@ run_regression (struct casereader *input, struct cmd_regression *cmd, struct ccase *c; struct covariance *cov; const struct variable **vars; + const struct variable **all_vars; const struct variable *dep_var; struct casereader *reader; const struct dictionary *dict; - gsl_matrix *this_cm; + size_t n_all_vars; assert (models != NULL); @@ -907,9 +956,12 @@ run_regression (struct casereader *input, struct cmd_regression *cmd, { dict_get_vars (dict, &v_variables, &n_variables, 0); } + n_all_vars = get_n_all_vars (cmd); + all_vars = xnmalloc (n_all_vars, sizeof (*all_vars)); + fill_all_vars (all_vars, cmd); vars = xnmalloc (n_variables, sizeof (*vars)); - means = xnmalloc (n_variables, sizeof (*means)); - cov = covariance_1pass_create (n_variables, v_variables, + means = xnmalloc (n_all_vars, sizeof (*means)); + cov = covariance_1pass_create (n_all_vars, all_vars, dict_get_weight (dict), MV_ANY); reader = casereader_clone (input); @@ -922,12 +974,13 @@ run_regression (struct casereader *input, struct cmd_regression *cmd, for (k = 0; k < cmd->n_dependent; k++) { + gsl_matrix *this_cm; dep_var = cmd->v_dependent[k]; n_indep = identify_indep_vars (vars, dep_var); this_cm = gsl_matrix_alloc (n_indep + 1, n_indep + 1); n_data = fill_covariance (this_cm, cov, vars, n_indep, - dep_var, v_variables, n_variables, means); + dep_var, all_vars, n_all_vars, means); models[k] = linreg_alloc (dep_var, (const struct variable **) vars, n_data, n_indep); models[k]->depvar = dep_var; @@ -963,10 +1016,12 @@ run_regression (struct casereader *input, struct cmd_regression *cmd, linreg_free (models[k]); models[k] = NULL; } + gsl_matrix_free (this_cm); } casereader_destroy (reader); free (vars); + free (all_vars); free (means); casereader_destroy (input); covariance_destroy (cov);