X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Fregression.q;h=8f9979ae73306476c8eec5a6c42105a01a951d7a;hb=fb763770be9335ecdda998155febc58b795c7bfe;hp=c27d8a40a7e1eb0314d5d8c088d86ec5988d88c1;hpb=e80304e52b4c7cb2e2924570f97c34c2f69f8aae;p=pspp diff --git a/src/language/stats/regression.q b/src/language/stats/regression.q index c27d8a40a7..8f9979ae73 100644 --- a/src/language/stats/regression.q +++ b/src/language/stats/regression.q @@ -24,7 +24,6 @@ #include #include #include -#include #include #include #include @@ -41,7 +40,7 @@ #include #include #include -#include +#include #include "xalloc.h" @@ -147,8 +146,7 @@ reg_stats_r (linreg *c, void *aux UNUSED) rsq = linreg_ssreg (c) / linreg_sst (c); adjrsq = 1.0 - (1.0 - rsq) * (linreg_n_obs (c) - 1.0) / (linreg_n_obs (c) - linreg_n_coeffs (c)); std_error = sqrt (linreg_mse (c)); - t = tab_create (n_cols, n_rows, 0); - tab_dim (t, tab_natural_dimensions, NULL); + t = tab_create (n_cols, n_rows); tab_box (t, TAL_2, TAL_2, -1, TAL_1, 0, 0, n_cols - 1, n_rows - 1); tab_hline (t, TAL_2, 0, n_cols - 1, 1); tab_vline (t, TAL_2, 2, 0, n_rows - 1); @@ -184,14 +182,13 @@ reg_stats_coeff (linreg * c, void *aux_) const struct variable *v; struct tab_table *t; + gsl_matrix *cov = aux_; assert (c != NULL); - gsl_matrix *cov = (gsl_matrix *) aux_; n_rows = linreg_n_coeffs (c) + 3; - t = tab_create (n_cols, n_rows, 0); + t = tab_create (n_cols, n_rows); tab_headers (t, 2, 0, 1, 0); - tab_dim (t, tab_natural_dimensions, NULL); tab_box (t, TAL_2, TAL_2, -1, TAL_1, 0, 0, n_cols - 1, n_rows - 1); tab_hline (t, TAL_2, 0, n_cols - 1, 1); tab_vline (t, TAL_2, 2, 0, n_rows - 1); @@ -274,9 +271,8 @@ reg_stats_anova (linreg * c, void *aux UNUSED) struct tab_table *t; assert (c != NULL); - t = tab_create (n_cols, n_rows, 0); + t = tab_create (n_cols, n_rows); tab_headers (t, 2, 0, 1, 0); - tab_dim (t, tab_natural_dimensions, NULL); tab_box (t, TAL_2, TAL_2, -1, TAL_1, 0, 0, n_cols - 1, n_rows - 1); @@ -365,9 +361,8 @@ reg_stats_bcov (linreg * c, void *aux UNUSED) assert (c != NULL); n_cols = c->n_indeps + 1 + 2; n_rows = 2 * (c->n_indeps + 1); - t = tab_create (n_cols, n_rows, 0); + t = tab_create (n_cols, n_rows); tab_headers (t, 2, 0, 1, 0); - tab_dim (t, tab_natural_dimensions, NULL); tab_box (t, TAL_2, TAL_2, -1, TAL_1, 0, 0, n_cols - 1, n_rows - 1); tab_hline (t, TAL_2, 0, n_cols - 1, 1); tab_vline (t, TAL_2, 2, 0, n_rows - 1); @@ -867,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) @@ -882,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); @@ -912,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); @@ -927,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; @@ -968,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);