X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Fexamine.q;h=d9b9bece6fbc79dca18519859325beae4332052b;hb=89135f74964ca9277c46006377068f22721a26a7;hp=b08f6d7a725b38f84bf6dd04d3a957db712ff08a;hpb=164d1274fcb70c54897f2a03fc7c27152ed4821a;p=pspp-builds.git diff --git a/src/language/stats/examine.q b/src/language/stats/examine.q index b08f6d7a..d9b9bece 100644 --- a/src/language/stats/examine.q +++ b/src/language/stats/examine.q @@ -1,21 +1,18 @@ -/* PSPP - EXAMINE data for normality . -*-c-*- +/* PSPP - a program for statistical analysis. + Copyright (C) 2004 Free Software Foundation, Inc. -Copyright (C) 2004 Free Software Foundation, Inc. + 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 3 of the License, or + (at your option) any later version. -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. -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 -02110-1301, USA. */ + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ #include @@ -26,7 +23,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA #include #include -#include +#include +#include #include #include #include @@ -84,7 +82,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA static struct cmd_examine cmd; -static struct variable **dependent_vars; +static const struct variable **dependent_vars; static size_t n_dependent_vars; @@ -116,19 +114,19 @@ static int examine_parse_independent_vars (struct lexer *lexer, const struct dic /* Output functions */ -static void show_summary (struct variable **dependent_var, int n_dep_var, +static void show_summary (const struct variable **dependent_var, int n_dep_var, const struct factor *f); -static void show_extremes (struct variable **dependent_var, +static void show_extremes (const struct variable **dependent_var, int n_dep_var, const struct factor *factor, int n_extremities); -static void show_descriptives (struct variable **dependent_var, +static void show_descriptives (const struct variable **dependent_var, int n_dep_var, struct factor *factor); -static void show_percentiles (struct variable **dependent_var, +static void show_percentiles (const struct variable **dependent_var, int n_dep_var, struct factor *factor); @@ -152,8 +150,8 @@ void box_plot_variables (const struct factor *fctr, /* Per Split function */ -static bool run_examine (const struct ccase *, - const struct casefile *cf, void *cmd_, const struct dataset *); +static void run_examine (struct cmd_examine *, struct casereader *, + struct dataset *); static void output_examine (void); @@ -178,9 +176,8 @@ const char *factor_to_string_concise (const struct factor *fctr, -/* Function to use for testing for missing values */ -static var_is_missing_func *value_is_missing; - +/* Categories of missing values to exclude. */ +static enum mv_class exclude_values; /* PERCENTILES */ @@ -194,6 +191,8 @@ static short sbc_percentile; int cmd_examine (struct lexer *lexer, struct dataset *ds) { + struct casegrouper *grouper; + struct casereader *group; bool ok; subc_list_double_create (&percentile_list); @@ -206,10 +205,7 @@ cmd_examine (struct lexer *lexer, struct dataset *ds) } /* If /MISSING=INCLUDE is set, then user missing values are ignored */ - if (cmd.incl == XMN_INCLUDE ) - value_is_missing = var_is_value_system_missing; - else - value_is_missing = var_is_value_missing; + exclude_values = cmd.incl == XMN_INCLUDE ? MV_SYSTEM : MV_ANY; if ( cmd.st_n == SYSMIS ) cmd.st_n = 5; @@ -226,7 +222,11 @@ cmd_examine (struct lexer *lexer, struct dataset *ds) subc_list_double_push (&percentile_list, 75); } - ok = multipass_procedure_with_splits (ds, run_examine, &cmd); + grouper = casegrouper_create_splits (proc_open (ds), dataset_dict (ds)); + while (casegrouper_get_next_group (grouper, &group)) + run_examine (&cmd, group, ds); + ok = casegrouper_destroy (grouper); + ok = proc_commit (ds) && ok; if ( totals ) { @@ -529,7 +529,7 @@ xmn_custom_variables (struct lexer *lexer, struct dataset *ds, struct cmd_examin return 2; } - if (!parse_variables (lexer, dict, &dependent_vars, &n_dependent_vars, + if (!parse_variables_const (lexer, dict, &dependent_vars, &n_dependent_vars, PV_NO_DUPLICATE | PV_NUMERIC | PV_NO_SCRATCH) ) { free (dependent_vars); @@ -631,9 +631,6 @@ void populate_summary (struct tab_table *t, int col, int row, -static bool bad_weight_warn = true; - - /* Perform calculations for the sub factors */ void factor_calc (const struct ccase *c, int case_no, double weight, @@ -695,7 +692,7 @@ factor_calc (const struct ccase *c, int case_no, double weight, var_get_width (var) ); - if ( value_is_missing (var, val) || case_missing ) + if (case_missing || var_is_value_missing (var, val, exclude_values)) { free (val); continue; @@ -710,23 +707,28 @@ factor_calc (const struct ccase *c, int case_no, double weight, } } -static bool -run_examine (const struct ccase *first, const struct casefile *cf, - void *cmd_, const struct dataset *ds) +static void +run_examine (struct cmd_examine *cmd, struct casereader *input, + struct dataset *ds) { struct dictionary *dict = dataset_dict (ds); - struct casereader *r; + casenumber case_no; struct ccase c; int v; - - const struct cmd_examine *cmd = (struct cmd_examine *) cmd_; + bool ok; struct factor *fctr; - output_split_file_values (ds, first); + if (!casereader_peek (input, 0, &c)) + return; + output_split_file_values (ds, &c); + case_destroy (&c); + + input = casereader_create_filter_weight (input, dict, NULL, NULL); + input = casereader_create_counter (input, &case_no, 0); /* Make sure we haven't got rubbish left over from a - previous split */ + previous split. */ fctr = factors; while (fctr) { @@ -742,15 +744,10 @@ run_examine (const struct ccase *first, const struct casefile *cf, for ( v = 0 ; v < n_dependent_vars ; ++v ) metrics_precalc (&totals[v]); - for (r = casefile_get_reader (cf, NULL); - casereader_read (r, &c) ; - case_destroy (&c) ) + for (; casereader_read (input, &c); case_destroy (&c)) { - int case_missing=0; - const int case_no = casereader_cnum (r); - - const double weight = - dict_get_case_weight (dict, &c, &bad_weight_warn); + int case_missing = 0; + const double weight = dict_get_case_weight (dict, &c, NULL); if ( cmd->miss == XMN_LISTWISE ) { @@ -762,7 +759,7 @@ run_examine (const struct ccase *first, const struct casefile *cf, var_get_width (var) ); - if ( value_is_missing (var, val)) + if ( var_is_value_missing (var, val, exclude_values)) case_missing = 1; free (val); @@ -777,7 +774,8 @@ run_examine (const struct ccase *first, const struct casefile *cf, var_get_width (var) ); - if ( value_is_missing (var, val) || case_missing ) + if ( var_is_value_missing (var, val, exclude_values) + || case_missing ) { free (val) ; continue ; @@ -790,6 +788,7 @@ run_examine (const struct ccase *first, const struct casefile *cf, factor_calc (&c, case_no, weight, case_missing); } + ok = casereader_destroy (input); for ( v = 0 ; v < n_dependent_vars ; ++v) { @@ -885,7 +884,8 @@ run_examine (const struct ccase *first, const struct casefile *cf, fctr = fctr->next; } - output_examine (); + if (ok) + output_examine (); if ( totals ) @@ -896,13 +896,11 @@ run_examine (const struct ccase *first, const struct casefile *cf, metrics_destroy (&totals[i]); } } - - return true; } static void -show_summary (struct variable **dependent_var, int n_dep_var, +show_summary (const struct variable **dependent_var, int n_dep_var, const struct factor *fctr) { static const char *subtitle[]= @@ -1127,7 +1125,7 @@ populate_summary (struct tab_table *t, int col, int row, static void -show_extremes (struct variable **dependent_var, int n_dep_var, +show_extremes (const struct variable **dependent_var, int n_dep_var, const struct factor *fctr, int n_extremities) { int i; @@ -1364,7 +1362,7 @@ populate_extremes (struct tab_table *t, /* Show the descriptives table */ void -show_descriptives (struct variable **dependent_var, +show_descriptives (const struct variable **dependent_var, int n_dep_var, struct factor *fctr) { @@ -1510,18 +1508,14 @@ show_descriptives (struct variable **dependent_var, } - - /* Fill in the descriptives data */ void populate_descriptives (struct tab_table *tbl, int col, int row, const struct metrics *m) { - - const double t = gsl_cdf_tdist_Qinv (1 - cmd.n_cinterval[0]/100.0/2.0, \ + const double t = gsl_cdf_tdist_Qinv ((1 - cmd.n_cinterval[0] / 100.0)/2.0, m->n -1); - tab_text (tbl, col, row, TAB_LEFT | TAT_TITLE, @@ -1950,7 +1944,7 @@ np_plot (const struct metrics *m, const char *factorname) /* Show the percentiles */ void -show_percentiles (struct variable **dependent_var, +show_percentiles (const struct variable **dependent_var, int n_dep_var, struct factor *fctr) { @@ -2260,3 +2254,9 @@ factor_to_string_concise (const struct factor *fctr, return buf; } + +/* + Local Variables: + mode: c + End: +*/