X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Fexamine.q;h=592bb56b13fa18d02279a6c50082f448e51849d5;hb=49a428e6e922f86b94f8559347d3fb90031b119a;hp=aded6a8f7384bce9b8a822b5659ea78a7ed73531;hpb=f5c108becd49d78f4898cab11352291f5689d24e;p=pspp-builds.git diff --git a/src/language/stats/examine.q b/src/language/stats/examine.q index aded6a8f..592bb56b 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, 2009 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 @@ -32,13 +29,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA #include #include #include +#include #include #include #include -#include #include #include -#include #include #include #include @@ -51,6 +47,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA #include #include "minmax.h" +#include "xalloc.h" #include "gettext.h" #define _(msgid) gettext (msgid) @@ -118,12 +115,13 @@ static int examine_parse_independent_vars (struct lexer *lexer, const struct dic /* Output functions */ static void show_summary (const struct variable **dependent_var, int n_dep_var, - const struct factor *f); + const struct dictionary *dict, + const struct factor *f); static void show_extremes (const struct variable **dependent_var, - int n_dep_var, - const struct factor *factor, - int n_extremities); + int n_dep_var, + const struct factor *factor, + int n_extremities); static void show_descriptives (const struct variable **dependent_var, int n_dep_var, @@ -156,25 +154,27 @@ void box_plot_variables (const struct factor *fctr, static void run_examine (struct cmd_examine *, struct casereader *, struct dataset *); -static void output_examine (void); +static void output_examine (const struct dictionary *dict); void factor_calc (const struct ccase *c, int case_no, - double weight, int case_missing); + double weight, bool case_missing); /* Represent a factor as a string, so it can be printed in a human readable fashion */ -const char * factor_to_string (const struct factor *fctr, +static void factor_to_string (const struct factor *fctr, const struct factor_statistics *fs, - const struct variable *var); - + const struct variable *var, + struct string *str + ); /* Represent a factor as a string, so it can be printed in a human readable fashion, but sacrificing some readablility for the sake of brevity */ -const char *factor_to_string_concise (const struct factor *fctr, - struct factor_statistics *fs); +static void factor_to_string_concise (const struct factor *fctr, + const struct factor_statistics *fs, + struct string *); @@ -262,14 +262,14 @@ cmd_examine (struct lexer *lexer, struct dataset *ds) /* Show all the appropriate tables */ static void -output_examine (void) +output_examine (const struct dictionary *dict) { struct factor *fctr; /* Show totals if appropriate */ if ( ! cmd.sbc_nototal || factors == 0 ) { - show_summary (dependent_vars, n_dependent_vars, 0); + show_summary (dependent_vars, n_dependent_vars, dict, 0); if ( cmd.sbc_statistics ) { @@ -336,7 +336,7 @@ output_examine (void) fctr = factors; while ( fctr ) { - show_summary (dependent_vars, n_dependent_vars, fctr); + show_summary (dependent_vars, n_dependent_vars, dict, fctr); if ( cmd.sbc_statistics ) { @@ -374,10 +374,12 @@ output_examine (void) for ( fs = fctr->fs ; *fs ; ++fs ) { - const char *s = factor_to_string (fctr, *fs, dependent_vars[v]); + struct string str; + ds_init_empty (&str); + factor_to_string (fctr, *fs, dependent_vars[v], &str); if ( cmd.a_plot[XMN_PLT_NPPLOT] ) - np_plot (& (*fs)->m[v], s); + np_plot (& (*fs)->m[v], ds_cstr (&str)); if ( cmd.a_plot[XMN_PLT_HISTOGRAM] ) { @@ -388,9 +390,11 @@ output_examine (void) normal.stddev = (*fs)->m[v].stddev; histogram_plot ((*fs)->m[v].histogram, - s, &normal, 0); + ds_cstr (&str) , &normal, 0); } + ds_destroy (&str); + } /* for ( fs .... */ } /* for ( v = 0 ..... */ @@ -619,17 +623,20 @@ examine_parse_independent_vars (struct lexer *lexer, const struct dictionary *di -void populate_percentiles (struct tab_table *tbl, int col, int row, - const struct metrics *m); +static void populate_percentiles (struct tab_table *tbl, int col, int row, + const struct metrics *m); -void populate_descriptives (struct tab_table *t, int col, int row, - const struct metrics *fs); +static void populate_descriptives (struct tab_table *t, int col, int row, + const struct variable *, + const struct metrics *fs); -void populate_extremes (struct tab_table *t, int col, int row, int n, - const struct metrics *m); +static void populate_extremes (struct tab_table *t, int col, int row, int n, + const struct variable *var, + const struct metrics *m); -void populate_summary (struct tab_table *t, int col, int row, - const struct metrics *m); +static void populate_summary (struct tab_table *t, int col, int row, + const struct dictionary *dict, + const struct metrics *m); @@ -637,7 +644,7 @@ void populate_summary (struct tab_table *t, int col, int row, /* Perform calculations for the sub factors */ void factor_calc (const struct ccase *c, int case_no, double weight, - int case_missing) + bool case_missing) { size_t v; struct factor *fctr = factors; @@ -698,7 +705,7 @@ factor_calc (const struct ccase *c, int case_no, double weight, if (case_missing || var_is_value_missing (var, val, exclude_values)) { free (val); - continue; + val = NULL; } metrics_calc ( & (*foo)->m[v], val, weight, case_no); @@ -723,7 +730,10 @@ run_examine (struct cmd_examine *cmd, struct casereader *input, struct factor *fctr; if (!casereader_peek (input, 0, &c)) - return; + { + casereader_destroy (input); + return; + } output_split_file_values (ds, &c); case_destroy (&c); @@ -749,7 +759,7 @@ run_examine (struct cmd_examine *cmd, struct casereader *input, for (; casereader_read (input, &c); case_destroy (&c)) { - int case_missing = 0; + bool case_missing = false; const double weight = dict_get_case_weight (dict, &c, NULL); if ( cmd->miss == XMN_LISTWISE ) @@ -763,7 +773,7 @@ run_examine (struct cmd_examine *cmd, struct casereader *input, ); if ( var_is_value_missing (var, val, exclude_values)) - case_missing = 1; + case_missing = true; free (val); } @@ -781,7 +791,7 @@ run_examine (struct cmd_examine *cmd, struct casereader *input, || case_missing ) { free (val) ; - continue ; + val = NULL; } metrics_calc (&totals[v], val, weight, case_no); @@ -830,17 +840,17 @@ run_examine (struct cmd_examine *cmd, struct casereader *input, struct hsh_iterator hi1; struct factor_statistics *fs; - struct hsh_table *idh0=0; - struct hsh_table *idh1=0; - union value *val0; - union value *val1; + struct hsh_table *idh0 = NULL; + struct hsh_table *idh1 = NULL; + union value **val0; + union value **val1; - idh0 = hsh_create (4, (hsh_compare_func *) compare_values, - (hsh_hash_func *) hash_value, + idh0 = hsh_create (4, (hsh_compare_func *) compare_ptr_values, + (hsh_hash_func *) hash_ptr_value, 0,0); - idh1 = hsh_create (4, (hsh_compare_func *) compare_values, - (hsh_hash_func *) hash_value, + idh1 = hsh_create (4, (hsh_compare_func *) compare_ptr_values, + (hsh_hash_func *) hash_ptr_value, 0,0); @@ -848,8 +858,8 @@ run_examine (struct cmd_examine *cmd, struct casereader *input, fs != 0 ; fs = hsh_next (fctr->fstats, &hi)) { - hsh_insert (idh0, (void *) &fs->id[0]); - hsh_insert (idh1, (void *) &fs->id[1]); + hsh_insert (idh0, &fs->id[0]); + hsh_insert (idh1, &fs->id[1]); } /* Ensure that the factors combination is complete */ @@ -862,17 +872,17 @@ run_examine (struct cmd_examine *cmd, struct casereader *input, val1 = hsh_next (idh1, &hi1)) { struct factor_statistics **ffs; - union value key[2]; + union value *key[2]; key[0] = *val0; key[1] = *val1; ffs = (struct factor_statistics **) - hsh_probe (fctr->fstats, (void *) &key ); + hsh_probe (fctr->fstats, &key ); if ( !*ffs ) { size_t i; (*ffs) = create_factor_statistics (n_dependent_vars, - &key[0], &key[1]); + key[0], key[1]); for ( i = 0 ; i < n_dependent_vars ; ++i ) metrics_precalc ( & (*ffs)->m[i]); } @@ -888,7 +898,7 @@ run_examine (struct cmd_examine *cmd, struct casereader *input, } if (ok) - output_examine (); + output_examine (dict); if ( totals ) @@ -904,7 +914,8 @@ run_examine (struct cmd_examine *cmd, struct casereader *input, static void show_summary (const struct variable **dependent_var, int n_dep_var, - const struct factor *fctr) + const struct dictionary *dict, + const struct factor *fctr) { static const char *subtitle[]= { @@ -970,7 +981,6 @@ show_summary (const struct variable **dependent_var, int n_dep_var, tab_title (tbl, _ ("Case Processing Summary")); - tab_joint_text (tbl, heading_columns, 0, n_cols -1, 0, TAB_CENTER | TAT_TITLE, @@ -985,22 +995,21 @@ show_summary (const struct variable **dependent_var, int n_dep_var, for ( i = 0 ; i < 3 ; ++i ) { - tab_text (tbl, heading_columns + i*2 , 2, TAB_CENTER | TAT_TITLE, + tab_text (tbl, heading_columns + i * 2 , 2, TAB_CENTER | TAT_TITLE, _ ("N")); - tab_text (tbl, heading_columns + i*2 + 1, 2, TAB_CENTER | TAT_TITLE, + tab_text (tbl, heading_columns + i * 2 + 1, 2, TAB_CENTER | TAT_TITLE, _ ("Percent")); tab_joint_text (tbl, heading_columns + i*2 , 1, - heading_columns + i*2 + 1, 1, + heading_columns + i * 2 + 1, 1, TAB_CENTER | TAT_TITLE, subtitle[i]); tab_box (tbl, -1, -1, TAL_0, TAL_0, - heading_columns + i*2, 1, - heading_columns + i*2 + 1, 1); - + heading_columns + i * 2, 1, + heading_columns + i * 2 + 1, 1); } @@ -1015,7 +1024,6 @@ show_summary (const struct variable **dependent_var, int n_dep_var, tab_text (tbl, 2, heading_rows - 1, TAB_CENTER | TAT_TITLE, var_to_string (fctr->indep_var[1])); } - } @@ -1025,7 +1033,6 @@ show_summary (const struct variable **dependent_var, int n_dep_var, if ( fctr ) n_factors = hsh_count (fctr->fstats); - if ( i > 0 ) tab_hline (tbl, TAL_1, 0, n_cols -1 , i * n_factors + heading_rows); @@ -1035,13 +1042,11 @@ show_summary (const struct variable **dependent_var, int n_dep_var, var_to_string (dependent_var[i]) ); - if ( !fctr ) populate_summary (tbl, heading_columns, (i * n_factors) + heading_rows, + dict, &totals[i]); - - else { struct factor_statistics **fs = fctr->fs; @@ -1054,37 +1059,49 @@ show_summary (const struct variable **dependent_var, int n_dep_var, 0 != compare_values (prev, (*fs)->id[0], var_get_width (fctr->indep_var[0]))) { + struct string vstr; + ds_init_empty (&vstr); + var_append_value_name (fctr->indep_var[0], + (*fs)->id[0], &vstr); + tab_text (tbl, 1, (i * n_factors ) + count + heading_rows, TAB_LEFT | TAT_TITLE, - var_get_value_name (fctr->indep_var[0], - (*fs)->id[0]) + ds_cstr (&vstr) ); + ds_destroy (&vstr); + if (fctr->indep_var[1] && count > 0 ) tab_hline (tbl, TAL_1, 1, n_cols - 1, (i * n_factors ) + count + heading_rows); - } prev = (*fs)->id[0]; - if ( fctr->indep_var[1]) - tab_text (tbl, - 2, - (i * n_factors ) + count + - heading_rows, - TAB_LEFT | TAT_TITLE, - var_get_value_name (fctr->indep_var[1], (*fs)->id[1]) - ); + { + struct string vstr; + ds_init_empty (&vstr); + var_append_value_name (fctr->indep_var[1], + (*fs)->id[1], &vstr); + tab_text (tbl, + 2, + (i * n_factors ) + count + + heading_rows, + TAB_LEFT | TAT_TITLE, + ds_cstr (&vstr) + ); + ds_destroy (&vstr); + } populate_summary (tbl, heading_columns, - (i * n_factors) + count - + heading_rows, - & (*fs)->m[i]); + (i * n_factors) + count + + heading_rows, + dict, + & (*fs)->m[i]); count++ ; fs++; @@ -1096,16 +1113,22 @@ show_summary (const struct variable **dependent_var, int n_dep_var, } -void +static void populate_summary (struct tab_table *t, int col, int row, - const struct metrics *m) + const struct dictionary *dict, + const struct metrics *m) { const double total = m->n + m->n_missing ; - tab_float (t, col + 0, row + 0, TAB_RIGHT, m->n, 8, 0); - tab_float (t, col + 2, row + 0, TAB_RIGHT, m->n_missing, 8, 0); - tab_float (t, col + 4, row + 0, TAB_RIGHT, total, 8, 0); + const struct variable *wv = dict_get_weight (dict); + const struct fmt_spec *wfmt = wv ? var_get_print_format (wv) : & F_8_0; + + tab_double (t, col + 0, row + 0, TAB_RIGHT, m->n, wfmt); + + tab_double (t, col + 2, row + 0, TAB_RIGHT, m->n_missing, wfmt); + + tab_double (t, col + 4, row + 0, TAB_RIGHT, total, wfmt); if ( total > 0 ) { @@ -1118,18 +1141,15 @@ populate_summary (struct tab_table *t, int col, int row, /* This seems a bit pointless !!! */ tab_text (t, col + 5, row + 0, TAB_RIGHT | TAT_PRINTF, "%2.0f%%", 100.0 * total / total ); - - } - - } static void show_extremes (const struct variable **dependent_var, int n_dep_var, - const struct factor *fctr, int n_extremities) + const struct factor *fctr, + int n_extremities) { int i; int heading_columns ; @@ -1137,6 +1157,8 @@ show_extremes (const struct variable **dependent_var, int n_dep_var, const int heading_rows = 1; struct tab_table *tbl; + + int n_factors = 1; int n_rows ; @@ -1209,9 +1231,10 @@ show_extremes (const struct variable **dependent_var, int n_dep_var, if ( !fctr ) populate_extremes (tbl, heading_columns - 2, - i * 2 * n_extremities * n_factors + heading_rows, - n_extremities, &totals[i]); - + i * 2 * n_extremities * n_factors + heading_rows, + n_extremities, + dependent_var[i], + &totals[i]); else { struct factor_statistics **fs = fctr->fs; @@ -1227,6 +1250,10 @@ show_extremes (const struct variable **dependent_var, int n_dep_var, if ( !prev || 0 != compare_values (prev, (*fs)->id[0], var_get_width (fctr->indep_var[0]))) { + struct string vstr; + ds_init_empty (&vstr); + var_append_value_name (fctr->indep_var[0], + (*fs)->id[0], &vstr); if ( count > 0 ) tab_hline (tbl, TAL_1, 1, n_cols - 1, row); @@ -1234,9 +1261,10 @@ show_extremes (const struct variable **dependent_var, int n_dep_var, tab_text (tbl, 1, row, TAB_LEFT | TAT_TITLE, - var_get_value_name (fctr->indep_var[0], - (*fs)->id[0]) + ds_cstr (&vstr) ); + + ds_destroy (&vstr); } prev = (*fs)->id[0]; @@ -1245,14 +1273,23 @@ show_extremes (const struct variable **dependent_var, int n_dep_var, tab_hline (tbl, TAL_1, 2, n_cols - 1, row); if ( fctr->indep_var[1]) + { + struct string vstr; + ds_init_empty (&vstr); + var_append_value_name (fctr->indep_var[1], (*fs)->id[1], &vstr); + tab_text (tbl, 2, row, TAB_LEFT | TAT_TITLE, - var_get_value_name (fctr->indep_var[1], (*fs)->id[1]) + ds_cstr (&vstr) ); + ds_destroy (&vstr); + } + populate_extremes (tbl, heading_columns - 2, - row, n_extremities, - & (*fs)->m[i]); + row, n_extremities, + dependent_var[i], + & (*fs)->m[i]); count++ ; fs++; @@ -1266,14 +1303,15 @@ show_extremes (const struct variable **dependent_var, int n_dep_var, /* Fill in the extremities table */ -void +static void populate_extremes (struct tab_table *t, - int col, int row, int n, const struct metrics *m) + int col, int row, int n, + const struct variable *var, + const struct metrics *m) { int extremity; int idx=0; - tab_text (t, col, row, TAB_RIGHT | TAT_TITLE , _ ("Highest") @@ -1290,13 +1328,13 @@ populate_extremes (struct tab_table *t, for (extremity = 0; extremity < n ; ++extremity ) { /* Highest */ - tab_float (t, col + 1, row + extremity, + tab_fixed (t, col + 1, row + extremity, TAB_RIGHT, extremity + 1, 8, 0); /* Lowest */ - tab_float (t, col + 1, row + extremity + n, + tab_fixed (t, col + 1, row + extremity + n, TAB_RIGHT, extremity + 1, 8, 0); @@ -1316,13 +1354,13 @@ populate_extremes (struct tab_table *t, if ( extremity + j >= n ) break ; - tab_float (t, col + 3, row + extremity + j + n, - TAB_RIGHT, - wv->v.f, 8, 2); + tab_value (t, col + 3, row + extremity + j + n, + TAB_RIGHT, + &wv->v, var_get_print_format (var)); - tab_float (t, col + 2, row + extremity + j + n, - TAB_RIGHT, - cn->num, 8, 0); + tab_fixed (t, col + 2, row + extremity + j + n, + TAB_RIGHT, + cn->num, 10, 0); if ( cn->next ) cn = cn->next; @@ -1345,13 +1383,13 @@ populate_extremes (struct tab_table *t, if ( extremity + j >= n ) break ; - tab_float (t, col + 3, row + extremity + j, - TAB_RIGHT, - wv->v.f, 8, 2); + tab_value (t, col + 3, row + extremity + j, + TAB_RIGHT, + &wv->v, var_get_print_format (var)); - tab_float (t, col + 2, row + extremity + j, + tab_fixed (t, col + 2, row + extremity + j, TAB_RIGHT, - cn->num, 8, 0); + cn->num, 10, 0); if ( cn->next ) cn = cn->next; @@ -1465,6 +1503,10 @@ show_descriptives (const struct variable **dependent_var, if ( !prev || 0 != compare_values (prev, (*fs)->id[0], var_get_width (fctr->indep_var[0]))) { + struct string vstr; + ds_init_empty (&vstr); + var_append_value_name (fctr->indep_var[0], + (*fs)->id[0], &vstr); if ( count > 0 ) tab_hline (tbl, TAL_1, 1, n_cols - 1, row); @@ -1472,9 +1514,10 @@ show_descriptives (const struct variable **dependent_var, tab_text (tbl, 1, row, TAB_LEFT | TAT_TITLE, - var_get_value_name (fctr->indep_var[0], - (*fs)->id[0]) + ds_cstr (&vstr) ); + + ds_destroy (&vstr); } prev = (*fs)->id[0]; @@ -1483,13 +1526,23 @@ show_descriptives (const struct variable **dependent_var, tab_hline (tbl, TAL_1, 2, n_cols - 1, row); if ( fctr->indep_var[1]) + { + struct string vstr; + ds_init_empty (&vstr); + var_append_value_name (fctr->indep_var[1], (*fs)->id[1], &vstr); + tab_text (tbl, 2, row, TAB_LEFT | TAT_TITLE, - var_get_value_name (fctr->indep_var[1], (*fs)->id[1]) + ds_cstr (&vstr) ); + ds_destroy (&vstr); + } + populate_descriptives (tbl, heading_columns - 2, - row, & (*fs)->m[i]); + row, + dependent_var[i], + & (*fs)->m[i]); count++ ; fs++; @@ -1501,40 +1554,41 @@ show_descriptives (const struct variable **dependent_var, { populate_descriptives (tbl, heading_columns - 2, - i * n_stat_rows * n_factors + heading_rows, - &totals[i]); + i * n_stat_rows * n_factors + heading_rows, + dependent_var[i], + &totals[i]); } } tab_submit (tbl); - } /* Fill in the descriptives data */ -void +static void populate_descriptives (struct tab_table *tbl, int col, int row, - const struct metrics *m) + const struct variable *var, + const struct metrics *m) { const double t = gsl_cdf_tdist_Qinv ((1 - cmd.n_cinterval[0] / 100.0)/2.0, - m->n -1); + m->n -1); tab_text (tbl, col, row, TAB_LEFT | TAT_TITLE, _ ("Mean")); - tab_float (tbl, col + 2, - row, - TAB_CENTER, - m->mean, - 8,2); + tab_double (tbl, col + 2, + row, + TAB_CENTER, + m->mean, + NULL); - tab_float (tbl, col + 3, - row, - TAB_CENTER, - m->se_mean, - 8,3); + tab_double (tbl, col + 3, + row, + TAB_CENTER, + m->se_mean, + NULL); tab_text (tbl, col, @@ -1548,11 +1602,11 @@ populate_descriptives (struct tab_table *tbl, int col, int row, TAB_LEFT | TAT_TITLE, _ ("Lower Bound")); - tab_float (tbl, col + 2, - row + 1, - TAB_CENTER, - m->mean - t * m->se_mean, - 8,3); + tab_double (tbl, col + 2, + row + 1, + TAB_CENTER, + m->mean - t * m->se_mean, + NULL); tab_text (tbl, col + 1, row + 2, @@ -1560,22 +1614,22 @@ populate_descriptives (struct tab_table *tbl, int col, int row, _ ("Upper Bound")); - tab_float (tbl, col + 2, - row + 2, - TAB_CENTER, - m->mean + t * m->se_mean, - 8,3); + tab_double (tbl, col + 2, + row + 2, + TAB_CENTER, + m->mean + t * m->se_mean, + NULL); tab_text (tbl, col, row + 3, TAB_LEFT | TAT_TITLE | TAT_PRINTF, _ ("5%% Trimmed Mean")); - tab_float (tbl, col + 2, - row + 3, - TAB_CENTER, - m->trimmed_mean, - 8,2); + tab_double (tbl, col + 2, + row + 3, + TAB_CENTER, + m->trimmed_mean, + NULL); tab_text (tbl, col, row + 4, @@ -1591,11 +1645,11 @@ populate_descriptives (struct tab_table *tbl, int col, int row, assert (p); - tab_float (tbl, col + 2, - row + 4, - TAB_CENTER, - p->v, - 8, 2); + tab_double (tbl, col + 2, + row + 4, + TAB_CENTER, + p->v, + NULL); } @@ -1604,11 +1658,11 @@ populate_descriptives (struct tab_table *tbl, int col, int row, TAB_LEFT | TAT_TITLE, _ ("Variance")); - tab_float (tbl, col + 2, - row + 5, - TAB_CENTER, - m->var, - 8,3); + tab_double (tbl, col + 2, + row + 5, + TAB_CENTER, + m->var, + NULL); tab_text (tbl, col, @@ -1617,11 +1671,11 @@ populate_descriptives (struct tab_table *tbl, int col, int row, _ ("Std. Deviation")); - tab_float (tbl, col + 2, - row + 6, - TAB_CENTER, - m->stddev, - 8,3); + tab_double (tbl, col + 2, + row + 6, + TAB_CENTER, + m->stddev, + NULL); tab_text (tbl, col, @@ -1629,23 +1683,20 @@ populate_descriptives (struct tab_table *tbl, int col, int row, TAB_LEFT | TAT_TITLE, _ ("Minimum")); - tab_float (tbl, col + 2, - row + 7, - TAB_CENTER, - m->min, - 8,3); + tab_double (tbl, col + 2, + row + 7, + TAB_CENTER, + m->min, var_get_print_format (var)); tab_text (tbl, col, row + 8, TAB_LEFT | TAT_TITLE, _ ("Maximum")); - tab_float (tbl, col + 2, - row + 8, - TAB_CENTER, - m->max, - 8,3); - + tab_double (tbl, col + 2, + row + 8, + TAB_CENTER, + m->max, var_get_print_format (var)); tab_text (tbl, col, row + 9, @@ -1653,11 +1704,11 @@ populate_descriptives (struct tab_table *tbl, int col, int row, _ ("Range")); - tab_float (tbl, col + 2, - row + 9, - TAB_CENTER, - m->max - m->min, - 8,3); + tab_double (tbl, col + 2, + row + 9, + TAB_CENTER, + m->max - m->min, + NULL); tab_text (tbl, col, row + 10, @@ -1677,34 +1728,31 @@ populate_descriptives (struct tab_table *tbl, int col, int row, assert (p1); assert (p2); - tab_float (tbl, col + 2, - row + 10, - TAB_CENTER, - p1->v - p2->v, - 8, 2); + tab_double (tbl, col + 2, + row + 10, + TAB_CENTER, + p1->v - p2->v, + NULL); } - - tab_text (tbl, col, row + 11, TAB_LEFT | TAT_TITLE, _ ("Skewness")); - tab_float (tbl, col + 2, - row + 11, - TAB_CENTER, - m->skewness, - 8,3); + tab_double (tbl, col + 2, + row + 11, + TAB_CENTER, + m->skewness, + NULL); /* stderr of skewness */ - tab_float (tbl, col + 3, - row + 11, - TAB_CENTER, - calc_seskew (m->n), - 8,3); - + tab_double (tbl, col + 3, + row + 11, + TAB_CENTER, + calc_seskew (m->n), + NULL); tab_text (tbl, col, row + 12, @@ -1712,20 +1760,18 @@ populate_descriptives (struct tab_table *tbl, int col, int row, _ ("Kurtosis")); - tab_float (tbl, col + 2, - row + 12, - TAB_CENTER, - m->kurtosis, - 8,3); + tab_double (tbl, col + 2, + row + 12, + TAB_CENTER, + m->kurtosis, + NULL); /* stderr of kurtosis */ - tab_float (tbl, col + 3, - row + 12, - TAB_CENTER, - calc_sekurt (m->n), - 8,3); - - + tab_double (tbl, col + 3, + row + 12, + TAB_CENTER, + calc_sekurt (m->n), + NULL); } @@ -1747,12 +1793,17 @@ box_plot_variables (const struct factor *fctr, for ( fs = fctr->fs ; *fs ; ++fs ) { + struct string str; double y_min = DBL_MAX; double y_max = -DBL_MAX; struct chart *ch = chart_create (); - const char *s = factor_to_string (fctr, *fs, 0 ); + if (ch == NULL) + break; - chart_write_title (ch, s); + ds_init_empty (&str); + factor_to_string (fctr, *fs, 0, &str ); + + chart_write_title (ch, "%s", ds_cstr (&str)); for ( i = 0 ; i < n_vars ; ++i ) { @@ -1780,7 +1831,7 @@ box_plot_variables (const struct factor *fctr, } chart_submit (ch); - + ds_destroy (&str); } } @@ -1804,6 +1855,8 @@ box_plot_group (const struct factor *fctr, struct chart *ch; ch = chart_create (); + if (ch == NULL) + break; boxplot_draw_yscale (ch, totals[i].max, totals[i].min); @@ -1819,19 +1872,21 @@ box_plot_group (const struct factor *fctr, for ( fs = fctr->fs ; *fs ; ++fs ) { - - const char *s = factor_to_string_concise (fctr, *fs); - + struct string str; const double box_width = (ch->data_right - ch->data_left) / (n_factors * 2.0 ) ; const double box_centre = ( f++ * 2 + 1) * box_width + ch->data_left; + ds_init_empty (&str); + factor_to_string_concise (fctr, *fs, &str); + boxplot_draw_boxplot (ch, box_centre, box_width, & (*fs)->m[i], - s); + ds_cstr (&str)); + ds_destroy (&str); } } else if ( ch ) @@ -2041,10 +2096,10 @@ show_percentiles (const struct variable **dependent_var, i = 0; while ( (*p) ) { - tab_float (tbl, n_heading_columns + i++ , 1, - TAB_CENTER, - (*p)->p, 8, 0); - + tab_fixed (tbl, n_heading_columns + i++ , 1, + TAB_CENTER, + (*p)->p, + 8, 0); p++; } @@ -2088,6 +2143,11 @@ show_percentiles (const struct variable **dependent_var, if ( !prev || 0 != compare_values (prev, (*fs)->id[0], var_get_width (fctr->indep_var[0]))) { + struct string vstr; + ds_init_empty (&vstr); + var_append_value_name (fctr->indep_var[0], + (*fs)->id[0], &vstr); + if ( count > 0 ) tab_hline (tbl, TAL_1, 1, n_cols - 1, row); @@ -2095,11 +2155,10 @@ show_percentiles (const struct variable **dependent_var, tab_text (tbl, 1, row, TAB_LEFT | TAT_TITLE, - var_get_value_name (fctr->indep_var[0], - (*fs)->id[0]) + ds_cstr (&vstr) ); - + ds_destroy (&vstr); } prev = (*fs)->id[0]; @@ -2108,14 +2167,23 @@ show_percentiles (const struct variable **dependent_var, tab_hline (tbl, TAL_1, 2, n_cols - 1, row); if ( fctr->indep_var[1]) + { + struct string vstr; + ds_init_empty (&vstr); + var_append_value_name (fctr->indep_var[1], (*fs)->id[1], &vstr); + tab_text (tbl, 2, row, TAB_LEFT | TAT_TITLE, - var_get_value_name (fctr->indep_var[1], (*fs)->id[1]) + ds_cstr (&vstr) ); + ds_destroy (&vstr); + } + populate_percentiles (tbl, n_heading_columns - 1, - row, & (*fs)->m[i]); + row, + & (*fs)->m[i]); count++ ; @@ -2127,25 +2195,21 @@ show_percentiles (const struct variable **dependent_var, else { populate_percentiles (tbl, n_heading_columns - 1, - i * n_stat_rows * n_factors + n_heading_rows, - &totals[i]); + i * n_stat_rows * n_factors + n_heading_rows, + &totals[i]); } - - } tab_submit (tbl); - - } -void +static void populate_percentiles (struct tab_table *tbl, int col, int row, - const struct metrics *m) + const struct metrics *m) { int i; @@ -2167,93 +2231,86 @@ populate_percentiles (struct tab_table *tbl, int col, int row, i = 0; while ( (*p) ) { - tab_float (tbl, col + i + 1 , row, - TAB_CENTER, - (*p)->v, 8, 2); - if ( (*p)->p == 25 ) - tab_float (tbl, col + i + 1 , row + 1, + tab_double (tbl, col + i + 1 , row, TAB_CENTER, - m->hinge[0], 8, 2); + (*p)->v, + NULL); - if ( (*p)->p == 50 ) - tab_float (tbl, col + i + 1 , row + 1, - TAB_CENTER, - m->hinge[1], 8, 2); + if ( (*p)->p == 25 ) + tab_double (tbl, col + i + 1 , row + 1, + TAB_CENTER, + m->hinge[0], + NULL); - if ( (*p)->p == 75 ) - tab_float (tbl, col + i + 1 , row + 1, - TAB_CENTER, - m->hinge[2], 8, 2); + if ( (*p)->p == 50 ) + tab_double (tbl, col + i + 1 , row + 1, + TAB_CENTER, + m->hinge[1], + NULL); + if ( (*p)->p == 75 ) + tab_double (tbl, col + i + 1 , row + 1, + TAB_CENTER, + m->hinge[2], + NULL); i++; - p++; } - } - - -const char * +static void factor_to_string (const struct factor *fctr, const struct factor_statistics *fs, - const struct variable *var) + const struct variable *var, + struct string *str + ) { - - static char buf1[100]; - char buf2[100]; - - strcpy (buf1,""); - if (var) - sprintf (buf1, "%s (",var_to_string (var) ); + ds_put_format (str, "%s (",var_to_string (var) ); - snprintf (buf2, 100, "%s = %s", - var_to_string (fctr->indep_var[0]), - var_get_value_name (fctr->indep_var[0], fs->id[0])); + ds_put_format (str, "%s = ", + var_to_string (fctr->indep_var[0])); - strcat (buf1, buf2); + var_append_value_name (fctr->indep_var[0], fs->id[0], str); if ( fctr->indep_var[1] ) { - sprintf (buf2, "; %s = %s)", - var_to_string (fctr->indep_var[1]), - var_get_value_name (fctr->indep_var[1], fs->id[1])); - strcat (buf1, buf2); + ds_put_format (str, "; %s = )", + var_to_string (fctr->indep_var[1])); + + var_append_value_name (fctr->indep_var[1], fs->id[1], str); } else { if ( var ) - strcat (buf1, ")"); + ds_put_cstr (str, ")"); } - - return buf1; } - -const char * +static void factor_to_string_concise (const struct factor *fctr, - struct factor_statistics *fs) + const struct factor_statistics *fs, + struct string *str + ) { - - static char buf[100]; - - char buf2[100]; - - snprintf (buf, 100, "%s", - var_get_value_name (fctr->indep_var[0], fs->id[0])); + var_append_value_name (fctr->indep_var[0], fs->id[0], str); if ( fctr->indep_var[1] ) { - sprintf (buf2, ",%s)", var_get_value_name (fctr->indep_var[1], - fs->id[1]) ); - strcat (buf, buf2); - } + ds_put_cstr (str, ","); + var_append_value_name (fctr->indep_var[1],fs->id[1], str); - return buf; + ds_put_cstr (str, ")"); + } } + +/* + Local Variables: + mode: c + End: +*/