From da299bd9871b178336a440c6ac53aebc3cea672e Mon Sep 17 00:00:00 2001 From: John Darrington Date: Tue, 7 Apr 2009 10:30:13 +0800 Subject: [PATCH] Allow users to set the precision of output statistics. Instead of hard coding the width and decimals of output numbers, respect the default format in most instances. Counts are normally displayed with the format of the weight variable, if any. Closes patch #6785 --- src/data/format.c | 2 + src/data/format.h | 2 + src/language/stats/binomial.c | 31 ++- src/language/stats/chisquare.c | 48 ++-- src/language/stats/crosstabs.q | 103 ++++---- src/language/stats/descriptives.c | 3 +- src/language/stats/examine.q | 350 +++++++++++++------------- src/language/stats/frequencies.q | 79 +++--- src/language/stats/npar-summary.c | 24 +- src/language/stats/npar-summary.h | 7 - src/language/stats/oneway.q | 159 ++++++------ src/language/stats/regression.q | 46 ++-- src/language/stats/t-test.q | 228 ++++++++++------- src/output/table.c | 63 ++++- src/output/table.h | 7 +- tests/bugs/multipass.sh | 10 +- tests/bugs/t-test-alpha.sh | 32 +-- tests/bugs/t-test-alpha3.sh | 24 +- tests/bugs/temp-freq.sh | 26 +- tests/command/examine-extremes.sh | 52 ++-- tests/command/examine.sh | 230 ++++++++--------- tests/command/npar-binomial.sh | 82 +++--- tests/command/npar-chisquare.sh | 176 ++++++------- tests/command/oneway.sh | 32 +-- tests/command/regression-qr.sh | 14 +- tests/command/regression.sh | 14 +- tests/command/t-test-1-indep-val.sh | 24 +- tests/command/t-test-1s.sh | 20 +- tests/command/t-test-pairs.sh | 24 +- tests/command/trimmed-mean.sh | 38 +-- tests/command/weight.sh | 153 +++++------ tests/stats/descript-basic.sh | 42 ++-- tests/stats/descript-mean-bug.sh | 2 + tests/stats/descript-missing.sh | 56 ++--- tests/stats/percentiles-compatible.sh | 38 +-- tests/stats/percentiles-enhanced.sh | 152 +++++------ 36 files changed, 1279 insertions(+), 1114 deletions(-) diff --git a/src/data/format.c b/src/data/format.c index ecf41487..aa872348 100644 --- a/src/data/format.c +++ b/src/data/format.c @@ -978,3 +978,5 @@ get_fmt_desc (enum fmt_type type) assert (is_fmt_type (type)); return &formats[type]; } + +const struct fmt_spec F_8_0 = {FMT_F, 8, 0}; diff --git a/src/data/format.h b/src/data/format.h index 15d13ef9..049ffc6f 100644 --- a/src/data/format.h +++ b/src/data/format.h @@ -164,4 +164,6 @@ int fmt_grouping_char (const struct fmt_number_style *, enum fmt_type); void fmt_set_decimal (struct fmt_number_style *, char); +extern const struct fmt_spec F_8_0 ; + #endif /* data/format.h */ diff --git a/src/language/stats/binomial.c b/src/language/stats/binomial.c index d9209f1b..7a0ac722 100644 --- a/src/language/stats/binomial.c +++ b/src/language/stats/binomial.c @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -146,6 +147,7 @@ binomial_execute (const struct dataset *ds, const struct npar_test *test) { int v; + const struct dictionary *dict = dataset_dict (ds); const struct binomial_test *bst = (const struct binomial_test *) test; const struct one_sample_test *ost = (const struct one_sample_test*) test; @@ -168,8 +170,12 @@ binomial_execute (const struct dataset *ds, cat2->value = value_dup (&v, 0); } - if (do_binomial (dataset_dict(ds), input, bst, cat1, cat2, exclude)) + if (do_binomial (dict, input, bst, cat1, cat2, exclude)) { + const struct variable *wvar = dict_get_weight (dict); + const struct fmt_spec *wfmt = wvar ? + var_get_print_format (wvar) : & F_8_0; + struct tab_table *table = tab_create (7, ost->n_vars * 3 + 1, 0); tab_dim (table, tab_natural_dimensions); @@ -203,30 +209,31 @@ binomial_execute (const struct dataset *ds, tab_text (table, 1, 3 + v * 3, TAB_LEFT, _("Total")); /* Test Prop */ - tab_float (table, 5, 1 + v * 3, TAB_NONE, bst->p, 8, 3); + tab_double (table, 5, 1 + v * 3, TAB_NONE, bst->p, NULL); /* Category labels */ tab_text (table, 2, 1 + v * 3, TAB_NONE, ds_cstr (&catstr1)); tab_text (table, 2, 2 + v * 3, TAB_NONE, ds_cstr (&catstr2)); /* Observed N */ - tab_float (table, 3, 1 + v * 3, TAB_NONE, cat1[v].count, 8, 0); - tab_float (table, 3, 2 + v * 3, TAB_NONE, cat2[v].count, 8, 0); + tab_double (table, 3, 1 + v * 3, TAB_NONE, cat1[v].count, wfmt); + tab_double (table, 3, 2 + v * 3, TAB_NONE, cat2[v].count, wfmt); n_total = cat1[v].count + cat2[v].count; - tab_float (table, 3, 3 + v * 3, TAB_NONE, n_total, 8, 0); + tab_double (table, 3, 3 + v * 3, TAB_NONE, n_total, wfmt); /* Observed Proportions */ - tab_float (table, 4, 1 + v * 3, TAB_NONE, - cat1[v].count / n_total, 8, 3); - tab_float (table, 4, 2 + v * 3, TAB_NONE, - cat2[v].count / n_total, 8, 3); - tab_float (table, 4, 3 + v * 3, TAB_NONE, - (cat1[v].count + cat2[v].count) / n_total, 8, 2); + tab_double (table, 4, 1 + v * 3, TAB_NONE, + cat1[v].count / n_total, NULL); + tab_double (table, 4, 2 + v * 3, TAB_NONE, + cat2[v].count / n_total, NULL); + + tab_double (table, 4, 3 + v * 3, TAB_NONE, + (cat1[v].count + cat2[v].count) / n_total, wfmt); /* Significance */ sig = calculate_binomial (cat1[v].count, cat2[v].count, bst->p); - tab_float (table, 6, 1 + v * 3, TAB_NONE, sig, 8, 3); + tab_double (table, 6, 1 + v * 3, TAB_NONE, sig, NULL); ds_destroy (&catstr1); ds_destroy (&catstr2); diff --git a/src/language/stats/chisquare.c b/src/language/stats/chisquare.c index 158064dc..6287977b 100644 --- a/src/language/stats/chisquare.c +++ b/src/language/stats/chisquare.c @@ -21,6 +21,7 @@ #include #include +#include #include #include #include @@ -269,8 +270,8 @@ create_combo_frequency_table (const struct chisquare_test *test) } for ( i = test->lo ; i <= test->hi ; ++i ) - tab_float (table, 0, 2 + i - test->lo, - TAB_LEFT, 1 + i - test->lo, 8, 0); + tab_fixed (table, 0, 2 + i - test->lo, + TAB_LEFT, 1 + i - test->lo, 8, 0); tab_headers (table, 1, 0, 2, 0); @@ -328,6 +329,9 @@ chisquare_execute (const struct dataset *ds, struct chisquare_test *cst = (struct chisquare_test *) test; int n_cells = 0; double total_expected = 0.0; + const struct variable *wvar = dict_get_weight (dict); + const struct fmt_spec *wfmt = wvar ? + var_get_print_format (wvar) : & F_8_0; double *df = xzalloc (sizeof (*df) * ost->n_vars); double *xsq = xzalloc (sizeof (*df) * ost->n_vars); @@ -375,28 +379,28 @@ chisquare_execute (const struct dataset *ds, /* The observed N */ - tab_float (freq_table, 1, i + 1, TAB_NONE, - ff[i]->count, 8, 0); + tab_double (freq_table, 1, i + 1, TAB_NONE, + ff[i]->count, wfmt); if ( cst->n_expected > 0 ) exp = cst->expected[i] * total_obs / total_expected ; else exp = total_obs / (double) n_cells; - tab_float (freq_table, 2, i + 1, TAB_NONE, - exp, 8, 2); + tab_double (freq_table, 2, i + 1, TAB_NONE, + exp, NULL); /* The residual */ - tab_float (freq_table, 3, i + 1, TAB_NONE, - ff[i]->count - exp, 8, 2); + tab_double (freq_table, 3, i + 1, TAB_NONE, + ff[i]->count - exp, NULL); xsq[v] += (ff[i]->count - exp) * (ff[i]->count - exp) / exp; } df[v] = n_cells - 1.0; - tab_float (freq_table, 1, i + 1, TAB_NONE, - total_obs, 8, 0); + tab_double (freq_table, 1, i + 1, TAB_NONE, + total_obs, wfmt); tab_submit (freq_table); @@ -446,8 +450,8 @@ chisquare_execute (const struct dataset *ds, ds_destroy (&str); /* The observed N */ - tab_float (freq_table, v * 4 + 2, i + 2 , TAB_NONE, - ff[i]->count, 8, 0); + tab_double (freq_table, v * 4 + 2, i + 2 , TAB_NONE, + ff[i]->count, wfmt); if ( cst->n_expected > 0 ) exp = cst->expected[i] * total_obs / total_expected ; @@ -455,19 +459,19 @@ chisquare_execute (const struct dataset *ds, exp = total_obs / (double) hsh_count (freq_hash); /* The expected N */ - tab_float (freq_table, v * 4 + 3, i + 2 , TAB_NONE, - exp, 8, 2); + tab_double (freq_table, v * 4 + 3, i + 2 , TAB_NONE, + exp, NULL); /* The residual */ - tab_float (freq_table, v * 4 + 4, i + 2 , TAB_NONE, - ff[i]->count - exp, 8, 2); + tab_double (freq_table, v * 4 + 4, i + 2 , TAB_NONE, + ff[i]->count - exp, NULL); xsq[v] += (ff[i]->count - exp) * (ff[i]->count - exp) / exp; } - tab_float (freq_table, v * 4 + 2, tab_nr (freq_table) - 1, TAB_NONE, - total_obs, 8, 0); + tab_double (freq_table, v * 4 + 2, tab_nr (freq_table) - 1, TAB_NONE, + total_obs, wfmt); df[v] = n_cells - 1.0; @@ -490,11 +494,11 @@ chisquare_execute (const struct dataset *ds, tab_text (stats_table, 1 + v, 0, TAB_CENTER, var_get_name (var)); - tab_float (stats_table, 1 + v, 1, TAB_NONE, xsq[v], 8,3); - tab_float (stats_table, 1 + v, 2, TAB_NONE, df[v], 8,0); + tab_double (stats_table, 1 + v, 1, TAB_NONE, xsq[v], NULL); + tab_fixed (stats_table, 1 + v, 2, TAB_NONE, df[v], 8, 0); - tab_float (stats_table, 1 + v, 3, TAB_NONE, - gsl_cdf_chisq_Q (xsq[v], df[v]), 8,3); + tab_double (stats_table, 1 + v, 3, TAB_NONE, + gsl_cdf_chisq_Q (xsq[v], df[v]), NULL); } tab_submit (stats_table); } diff --git a/src/language/stats/crosstabs.q b/src/language/stats/crosstabs.q index e16c8dc2..186ee12b 100644 --- a/src/language/stats/crosstabs.q +++ b/src/language/stats/crosstabs.q @@ -179,7 +179,7 @@ static int internal_cmd_crosstabs (struct lexer *lexer, struct dataset *ds); static void precalc (struct casereader *, const struct dataset *); static void calc_general (struct ccase *, const struct dataset *); static void calc_integer (struct ccase *, const struct dataset *); -static void postcalc (void); +static void postcalc (const struct dataset *); static void submit (struct tab_table *); static void format_short (char *s, const struct fmt_spec *fp, @@ -318,7 +318,7 @@ internal_cmd_crosstabs (struct lexer *lexer, struct dataset *ds) } casereader_destroy (group); - postcalc (); + postcalc (ds); } ok = casegrouper_destroy (grouper); ok = proc_commit (ds) && ok; @@ -788,12 +788,13 @@ static void enum_var_values (struct table_entry **entries, int entry_cnt, int var_idx, union value **values, int *value_cnt); static void output_pivot_table (struct table_entry **, struct table_entry **, + const struct dictionary *, double **, double **, double **, int *, int *, int *); -static void make_summary_table (void); +static void make_summary_table (const struct dictionary *); static void -postcalc (void) +postcalc (const struct dataset *ds) { if (mode == GENERAL) { @@ -801,7 +802,7 @@ postcalc (void) sorted_tab = (struct table_entry **) hsh_sort (gen_tab); } - make_summary_table (); + make_summary_table (dataset_dict (ds)); /* Identify all the individual crosstabulation tables, and deal with them. */ @@ -818,7 +819,8 @@ postcalc (void) if (pe == NULL) break; - output_pivot_table (pb, pe, &mat, &row_tot, &col_tot, + output_pivot_table (pb, pe, dataset_dict (ds), + &mat, &row_tot, &col_tot, &maxrows, &maxcols, &maxcells); pb = pe; @@ -841,11 +843,13 @@ postcalc (void) } } -static void insert_summary (struct tab_table *, int tab_index, double valid); +static void insert_summary (struct tab_table *, int tab_index, + const struct dictionary *, + double valid); /* Output a table summarizing the cases processed. */ static void -make_summary_table (void) +make_summary_table (const struct dictionary *dict) { struct tab_table *summary; @@ -884,7 +888,7 @@ make_summary_table (void) break; while (cur_tab < (*pb)->table) - insert_summary (summary, cur_tab++, 0.); + insert_summary (summary, cur_tab++, dict, 0.); if (mode == GENERAL) for (valid = 0.; pb < pe; pb++) @@ -905,13 +909,13 @@ make_summary_table (void) valid += *data++; } } - insert_summary (summary, cur_tab++, valid); + insert_summary (summary, cur_tab++, dict, valid); pb = pe; } while (cur_tab < nxtab) - insert_summary (summary, cur_tab++, 0.); + insert_summary (summary, cur_tab++, dict, 0.); submit (summary); } @@ -919,10 +923,15 @@ make_summary_table (void) /* Inserts a line into T describing the crosstabulation at index TAB_INDEX, which has VALID valid observations. */ static void -insert_summary (struct tab_table *t, int tab_index, double valid) +insert_summary (struct tab_table *t, int tab_index, + const struct dictionary *dict, + double valid) { struct crosstab *x = xtab[tab_index]; + const struct variable *wv = dict_get_weight (dict); + const struct fmt_spec *wfmt = wv ? var_get_print_format (wv) : & F_8_0; + tab_hline (t, TAL_1, 0, 6, 0); /* Crosstabulation name. */ @@ -955,7 +964,7 @@ insert_summary (struct tab_table *t, int tab_index, double valid) for (i = 0; i < 3; i++) { - tab_float (t, i * 2 + 1, 0, TAB_RIGHT, n[i], 8, 0); + tab_double (t, i * 2 + 1, 0, TAB_RIGHT, n[i], wfmt); tab_text (t, i * 2 + 2, 0, TAB_RIGHT | TAT_PRINTF, "%.1f%%", n[i] / n[2] * 100.); } @@ -1004,9 +1013,9 @@ static double W; /* Grand total. */ static void display_dimensions (struct tab_table *, int first_difference, struct table_entry *); static void display_crosstabulation (void); -static void display_chisq (void); -static void display_symmetric (void); -static void display_risk (void); +static void display_chisq (const struct dictionary *); +static void display_symmetric (const struct dictionary *); +static void display_risk (const struct dictionary *); static void display_directional (void); static void crosstabs_dim (struct tab_table *, struct outp_driver *); static void table_value_missing (struct tab_table *table, int c, int r, @@ -1019,6 +1028,7 @@ static void delete_missing (void); hold *MAXROWS entries. */ static void output_pivot_table (struct table_entry **pb, struct table_entry **pe, + const struct dictionary *dict, double **matp, double **row_totp, double **col_totp, int *maxrows, int *maxcols, int *maxcells) { @@ -1425,11 +1435,11 @@ output_pivot_table (struct table_entry **pb, struct table_entry **pe, if (cmd.miss == CRS_REPORT) delete_missing (); if (chisq) - display_chisq (); + display_chisq (dict); if (sym) - display_symmetric (); + display_symmetric (dict); if (risk) - display_risk (); + display_risk (dict); if (direct) display_directional (); @@ -1969,8 +1979,11 @@ static void calc_chisq (double[N_CHISQ], int[N_CHISQ], double *, double *); /* Display chi-square statistics. */ static void -display_chisq (void) +display_chisq (const struct dictionary *dict) { + const struct variable *wv = dict_get_weight (dict); + const struct fmt_spec *wfmt = wv ? var_get_print_format (wv) : & F_8_0; + static const char *chisq_stats[N_CHISQ] = { N_("Pearson Chi-Square"), @@ -2000,22 +2013,22 @@ display_chisq (void) tab_text (chisq, 0, 0, TAB_LEFT, gettext (chisq_stats[i])); if (i != 2) { - tab_float (chisq, 1, 0, TAB_RIGHT, chisq_v[i], 8, 3); - tab_float (chisq, 2, 0, TAB_RIGHT, df[i], 8, 0); - tab_float (chisq, 3, 0, TAB_RIGHT, - gsl_cdf_chisq_Q (chisq_v[i], df[i]), 8, 3); + tab_double (chisq, 1, 0, TAB_RIGHT, chisq_v[i], NULL); + tab_double (chisq, 2, 0, TAB_RIGHT, df[i], wfmt); + tab_double (chisq, 3, 0, TAB_RIGHT, + gsl_cdf_chisq_Q (chisq_v[i], df[i]), NULL); } else { chisq_fisher = 1; - tab_float (chisq, 4, 0, TAB_RIGHT, fisher2, 8, 3); - tab_float (chisq, 5, 0, TAB_RIGHT, fisher1, 8, 3); + tab_double (chisq, 4, 0, TAB_RIGHT, fisher2, NULL); + tab_double (chisq, 5, 0, TAB_RIGHT, fisher1, NULL); } tab_next_row (chisq); } tab_text (chisq, 0, 0, TAB_LEFT, _("N of Valid Cases")); - tab_float (chisq, 1, 0, TAB_RIGHT, W, 8, 0); + tab_double (chisq, 1, 0, TAB_RIGHT, W, wfmt); tab_next_row (chisq); tab_offset (chisq, 0, -1); @@ -2026,8 +2039,11 @@ static int calc_symmetric (double[N_SYMMETRIC], double[N_SYMMETRIC], /* Display symmetric measures. */ static void -display_symmetric (void) +display_symmetric (const struct dictionary *dict) { + const struct variable *wv = dict_get_weight (dict); + const struct fmt_spec *wfmt = wv ? var_get_print_format (wv) : & F_8_0; + static const char *categories[] = { N_("Nominal by Nominal"), @@ -2075,17 +2091,17 @@ display_symmetric (void) } tab_text (sym, 1, 0, TAB_LEFT, gettext (stats[i])); - tab_float (sym, 2, 0, TAB_RIGHT, sym_v[i], 8, 3); + tab_double (sym, 2, 0, TAB_RIGHT, sym_v[i], NULL); if (sym_ase[i] != SYSMIS) - tab_float (sym, 3, 0, TAB_RIGHT, sym_ase[i], 8, 3); + tab_double (sym, 3, 0, TAB_RIGHT, sym_ase[i], NULL); if (sym_t[i] != SYSMIS) - tab_float (sym, 4, 0, TAB_RIGHT, sym_t[i], 8, 3); - /*tab_float (sym, 5, 0, TAB_RIGHT, normal_sig (sym_v[i]), 8, 3);*/ + tab_double (sym, 4, 0, TAB_RIGHT, sym_t[i], NULL); + /*tab_double (sym, 5, 0, TAB_RIGHT, normal_sig (sym_v[i]), NULL);*/ tab_next_row (sym); } tab_text (sym, 0, 0, TAB_LEFT, _("N of Valid Cases")); - tab_float (sym, 2, 0, TAB_RIGHT, W, 8, 0); + tab_double (sym, 2, 0, TAB_RIGHT, W, wfmt); tab_next_row (sym); tab_offset (sym, 0, -1); @@ -2095,8 +2111,11 @@ static int calc_risk (double[], double[], double[], union value *); /* Display risk estimate. */ static void -display_risk (void) +display_risk (const struct dictionary *dict) { + const struct variable *wv = dict_get_weight (dict); + const struct fmt_spec *wfmt = wv ? var_get_print_format (wv) : & F_8_0; + char buf[256]; double risk_v[3], lower[3], upper[3]; union value c[2]; @@ -2137,14 +2156,14 @@ display_risk (void) } tab_text (risk, 0, 0, TAB_LEFT, buf); - tab_float (risk, 1, 0, TAB_RIGHT, risk_v[i], 8, 3); - tab_float (risk, 2, 0, TAB_RIGHT, lower[i], 8, 3); - tab_float (risk, 3, 0, TAB_RIGHT, upper[i], 8, 3); + tab_double (risk, 1, 0, TAB_RIGHT, risk_v[i], NULL); + tab_double (risk, 2, 0, TAB_RIGHT, lower[i], NULL); + tab_double (risk, 3, 0, TAB_RIGHT, upper[i], NULL); tab_next_row (risk); } tab_text (risk, 0, 0, TAB_LEFT, _("N of Valid Cases")); - tab_float (risk, 1, 0, TAB_RIGHT, W, 8, 0); + tab_double (risk, 1, 0, TAB_RIGHT, W, wfmt); tab_next_row (risk); tab_offset (risk, 0, -1); @@ -2257,12 +2276,12 @@ display_directional (void) } } - tab_float (direct, 3, 0, TAB_RIGHT, direct_v[i], 8, 3); + tab_double (direct, 3, 0, TAB_RIGHT, direct_v[i], NULL); if (direct_ase[i] != SYSMIS) - tab_float (direct, 4, 0, TAB_RIGHT, direct_ase[i], 8, 3); + tab_double (direct, 4, 0, TAB_RIGHT, direct_ase[i], NULL); if (direct_t[i] != SYSMIS) - tab_float (direct, 5, 0, TAB_RIGHT, direct_t[i], 8, 3); - /*tab_float (direct, 6, 0, TAB_RIGHT, normal_sig (direct_v[i]), 8, 3);*/ + tab_double (direct, 5, 0, TAB_RIGHT, direct_t[i], NULL); + /*tab_double (direct, 6, 0, TAB_RIGHT, normal_sig (direct_v[i]), NULL);*/ tab_next_row (direct); } diff --git a/src/language/stats/descriptives.c b/src/language/stats/descriptives.c index 72f7476a..e26eadf9 100644 --- a/src/language/stats/descriptives.c +++ b/src/language/stats/descriptives.c @@ -906,9 +906,10 @@ display (struct dsc_proc *dsc) tab_text (t, nc++, i + 1, TAT_PRINTF, "%g", dv->valid); if (dsc->format == DSC_SERIAL) tab_text (t, nc++, i + 1, TAT_PRINTF, "%g", dv->missing); + for (j = 0; j < DSC_N_STATS; j++) if (dsc->show_stats & (1ul << j)) - tab_float (t, nc++, i + 1, TAB_NONE, dv->stats[j], 10, 3); + tab_double (t, nc++, i + 1, TAB_NONE, dv->stats[j], NULL); } tab_title (t, _("Valid cases = %g; cases with missing value(s) = %g."), diff --git a/src/language/stats/examine.q b/src/language/stats/examine.q index 9315e7e8..febb60fe 100644 --- a/src/language/stats/examine.q +++ b/src/language/stats/examine.q @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 2004 Free Software Foundation, Inc. + Copyright (C) 2004, 2009 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 @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -114,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, @@ -152,7 +154,7 @@ 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, @@ -260,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 ) { @@ -334,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 ) { @@ -621,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); @@ -893,7 +898,7 @@ run_examine (struct cmd_examine *cmd, struct casereader *input, } if (ok) - output_examine (); + output_examine (dict); if ( totals ) @@ -909,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[]= { @@ -1039,6 +1045,7 @@ show_summary (const struct variable **dependent_var, int n_dep_var, if ( !fctr ) populate_summary (tbl, heading_columns, (i * n_factors) + heading_rows, + dict, &totals[i]); else { @@ -1093,6 +1100,7 @@ show_summary (const struct variable **dependent_var, int n_dep_var, populate_summary (tbl, heading_columns, (i * n_factors) + count + heading_rows, + dict, & (*fs)->m[i]); count++ ; @@ -1105,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 ) { @@ -1134,7 +1148,8 @@ populate_summary (struct tab_table *t, int col, int row, 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 ; @@ -1142,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 ; @@ -1214,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; @@ -1269,8 +1287,9 @@ show_extremes (const struct variable **dependent_var, int n_dep_var, } populate_extremes (tbl, heading_columns - 2, - row, n_extremities, - & (*fs)->m[i]); + row, n_extremities, + dependent_var[i], + & (*fs)->m[i]); count++ ; fs++; @@ -1284,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") @@ -1308,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); @@ -1334,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; @@ -1363,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; @@ -1520,7 +1540,9 @@ show_descriptives (const struct variable **dependent_var, } populate_descriptives (tbl, heading_columns - 2, - row, & (*fs)->m[i]); + row, + dependent_var[i], + & (*fs)->m[i]); count++ ; fs++; @@ -1532,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, @@ -1579,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, @@ -1591,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, @@ -1622,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); } @@ -1635,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, @@ -1648,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, @@ -1660,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, @@ -1684,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, @@ -1708,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, @@ -1743,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); } @@ -2076,10 +2091,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++; } @@ -2162,7 +2177,8 @@ show_percentiles (const struct variable **dependent_var, populate_percentiles (tbl, n_heading_columns - 1, - row, & (*fs)->m[i]); + row, + & (*fs)->m[i]); count++ ; @@ -2174,25 +2190,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; @@ -2214,30 +2226,32 @@ 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++; } - } static void diff --git a/src/language/stats/frequencies.q b/src/language/stats/frequencies.q index 4f26f93d..a09ecc10 100644 --- a/src/language/stats/frequencies.q +++ b/src/language/stats/frequencies.q @@ -251,12 +251,12 @@ static void calc_stats (const struct variable *v, double d[frq_n_stats]); static void precalc (struct casereader *, struct dataset *); static void calc (const struct ccase *, const struct dataset *); -static void postcalc (void); +static void postcalc (const struct dataset *); static void postprocess_freq_tab (const struct variable *); -static void dump_full (const struct variable *); -static void dump_condensed (const struct variable *); -static void dump_statistics (const struct variable *, int show_varname); +static void dump_full ( const struct variable *, const struct variable *); +static void dump_condensed (const struct variable *, const struct variable *); +static void dump_statistics (const struct variable *, bool show_varname, const struct variable *); static void cleanup_freq_tab (const struct variable *); static hsh_compare_func compare_value_numeric_a, compare_value_alpha_a; @@ -381,7 +381,7 @@ internal_cmd_frequencies (struct lexer *lexer, struct dataset *ds) precalc (group, ds); for (; casereader_read (group, &c); case_destroy (&c)) calc (&c, ds); - postcalc (); + postcalc (ds); } ok = casegrouper_destroy (grouper); ok = proc_commit (ds) && ok; @@ -559,8 +559,10 @@ precalc (struct casereader *input, struct dataset *ds) /* Finishes up with the variables after frequencies have been calculated. Displays statistics, percentiles, ... */ static void -postcalc (void) +postcalc (const struct dataset *ds) { + const struct dictionary *dict = dataset_dict (ds); + const struct variable *wv = dict_get_weight (dict); size_t i; for (i = 0; i < n_variables; i++) @@ -580,16 +582,16 @@ postcalc (void) switch (cmd.cond) { case FRQ_CONDENSE: - dump_condensed (v); + dump_condensed (v, wv); break; case FRQ_STANDARD: - dump_full (v); + dump_full (v, wv); break; case FRQ_ONEPAGE: if (n_categories > cmd.onepage_limit) - dump_condensed (v); + dump_condensed (v, wv); else - dump_full (v); + dump_full (v, wv); break; default: NOT_REACHED (); @@ -599,7 +601,7 @@ postcalc (void) /* Statistics. */ if (n_stats) - dump_statistics (v, !dumped_freq_tab); + dump_statistics (v, !dumped_freq_tab, wv); @@ -1034,8 +1036,9 @@ full_dim (struct tab_table *t, struct outp_driver *d) /* Displays a full frequency table for variable V. */ static void -dump_full (const struct variable *v) +dump_full (const struct variable *v, const struct variable *wv) { + const struct fmt_spec *wfmt = wv ? var_get_print_format (wv) : &F_8_0; int n_categories; struct var_freqs *vf; struct freq_tab *ft; @@ -1104,10 +1107,10 @@ dump_full (const struct variable *v) } tab_value (t, 0 + lab, r, TAB_NONE, f->value, &vf->print); - tab_float (t, 1 + lab, r, TAB_NONE, f->count, 8, 0); - tab_float (t, 2 + lab, r, TAB_NONE, percent, 5, 1); - tab_float (t, 3 + lab, r, TAB_NONE, valid_percent, 5, 1); - tab_float (t, 4 + lab, r, TAB_NONE, cum_total, 5, 1); + tab_double (t, 1 + lab, r, TAB_NONE, f->count, wfmt); + tab_double (t, 2 + lab, r, TAB_NONE, percent, NULL); + tab_double (t, 3 + lab, r, TAB_NONE, valid_percent, NULL); + tab_double (t, 4 + lab, r, TAB_NONE, cum_total, NULL); r++; } for (; f < &ft->valid[n_categories]; f++) @@ -1122,9 +1125,9 @@ dump_full (const struct variable *v) } tab_value (t, 0 + lab, r, TAB_NONE, f->value, &vf->print); - tab_float (t, 1 + lab, r, TAB_NONE, f->count, 8, 0); - tab_float (t, 2 + lab, r, TAB_NONE, - f->count / ft->total_cases * 100.0, 5, 1); + tab_double (t, 1 + lab, r, TAB_NONE, f->count, wfmt); + tab_double (t, 2 + lab, r, TAB_NONE, + f->count / ft->total_cases * 100.0, NULL); tab_text (t, 3 + lab, r, TAB_NONE, _("Missing")); r++; } @@ -1136,9 +1139,9 @@ dump_full (const struct variable *v) tab_hline (t, TAL_2, 0, 4 + lab, r); tab_joint_text (t, 0, r, 0 + lab, r, TAB_RIGHT | TAT_TITLE, _("Total")); tab_vline (t, TAL_0, 1, r, r); - tab_float (t, 1 + lab, r, TAB_NONE, cum_freq, 8, 0); - tab_float (t, 2 + lab, r, TAB_NONE, 100.0, 5, 1); - tab_float (t, 3 + lab, r, TAB_NONE, 100.0, 5, 1); + tab_double (t, 1 + lab, r, TAB_NONE, cum_freq, wfmt); + tab_fixed (t, 2 + lab, r, TAB_NONE, 100.0, 5, 1); + tab_fixed (t, 3 + lab, r, TAB_NONE, 100.0, 5, 1); tab_title (t, "%s", var_to_string (v)); tab_submit (t); @@ -1165,8 +1168,9 @@ condensed_dim (struct tab_table *t, struct outp_driver *d) /* Display condensed frequency table for variable V. */ static void -dump_condensed (const struct variable *v) +dump_condensed (const struct variable *v, const struct variable *wv) { + const struct fmt_spec *wfmt = wv ? var_get_print_format (wv) : &F_8_0; int n_categories; struct var_freqs *vf; struct freq_tab *ft; @@ -1197,17 +1201,17 @@ dump_condensed (const struct variable *v) cum_total += f->count / ft->valid_cases * 100.0; tab_value (t, 0, r, TAB_NONE, f->value, &vf->print); - tab_float (t, 1, r, TAB_NONE, f->count, 8, 0); - tab_float (t, 2, r, TAB_NONE, percent, 3, 0); - tab_float (t, 3, r, TAB_NONE, cum_total, 3, 0); + tab_double (t, 1, r, TAB_NONE, f->count, wfmt); + tab_double (t, 2, r, TAB_NONE, percent, NULL); + tab_double (t, 3, r, TAB_NONE, cum_total, NULL); r++; } for (; f < &ft->valid[n_categories]; f++) { tab_value (t, 0, r, TAB_NONE, f->value, &vf->print); - tab_float (t, 1, r, TAB_NONE, f->count, 8, 0); - tab_float (t, 2, r, TAB_NONE, - f->count / ft->total_cases * 100.0, 3, 0); + tab_double (t, 1, r, TAB_NONE, f->count, wfmt); + tab_double (t, 2, r, TAB_NONE, + f->count / ft->total_cases * 100.0, NULL); r++; } @@ -1364,8 +1368,10 @@ calc_stats (const struct variable *v, double d[frq_n_stats]) /* Displays a table of all the statistics requested for variable V. */ static void -dump_statistics (const struct variable *v, int show_varname) +dump_statistics (const struct variable *v, bool show_varname, + const struct variable *wv) { + const struct fmt_spec *wfmt = wv ? var_get_print_format (wv) : &F_8_0; struct freq_tab *ft; double stat_value[frq_n_stats]; struct tab_table *t; @@ -1398,7 +1404,7 @@ dump_statistics (const struct variable *v, int show_varname) { tab_text (t, 0, r, TAB_LEFT | TAT_TITLE, gettext (st_name[i].s10)); - tab_float (t, 2, r, TAB_NONE, stat_value[i], 11, 3); + tab_double (t, 2, r, TAB_NONE, stat_value[i], NULL); r++; } @@ -1406,9 +1412,8 @@ dump_statistics (const struct variable *v, int show_varname) tab_text (t, 1, 0, TAB_LEFT | TAT_TITLE, _("Valid")); tab_text (t, 1, 1, TAB_LEFT | TAT_TITLE, _("Missing")); - tab_float(t, 2, 0, TAB_NONE, ft->valid_cases, 11, 0); - tab_float(t, 2, 1, TAB_NONE, ft->total_cases - ft->valid_cases, 11, 0); - + tab_double (t, 2, 0, TAB_NONE, ft->valid_cases, wfmt); + tab_double (t, 2, 1, TAB_NONE, ft->total_cases - ft->valid_cases, wfmt); for (i = 0; i < n_percentiles; i++, r++) { @@ -1420,9 +1425,9 @@ dump_statistics (const struct variable *v, int show_varname) if (percentiles[i].p == 0.5) tab_text (t, 1, r, TAB_LEFT, _("50 (Median)")); else - tab_float (t, 1, r, TAB_LEFT, percentiles[i].p * 100, 3, 0); - tab_float (t, 2, r, TAB_NONE, percentiles[i].value, 11, 3); - + tab_fixed (t, 1, r, TAB_LEFT, percentiles[i].p * 100, 3, 0); + tab_double (t, 2, r, TAB_NONE, percentiles[i].value, + var_get_print_format (v)); } tab_columns (t, SOM_COL_DOWN, 1); diff --git a/src/language/stats/npar-summary.c b/src/language/stats/npar-summary.c index c9c2c9da..db40dfc2 100644 --- a/src/language/stats/npar-summary.c +++ b/src/language/stats/npar-summary.c @@ -15,6 +15,8 @@ along with this program. If not, see . */ #include + +#include #include #include #include @@ -84,6 +86,11 @@ npar_summary_calc_descriptives (struct descriptives *desc, } +void +do_summary_box (const struct descriptives *desc, + const struct variable *const *vv, + int n_vars); + void do_summary_box (const struct descriptives *desc, @@ -97,7 +104,6 @@ do_summary_box (const struct descriptives *desc, int columns = 1 ; struct tab_table *table ; - if ( desc ) columns += 5; if ( quartiles ) columns += 3; @@ -152,15 +158,19 @@ do_summary_box (const struct descriptives *desc, col++; } + for ( v = 0 ; v < n_vars ; ++v ) { - tab_text (table, 0, 2 + v, TAT_NONE, var_to_string (vv[v])); + const struct variable *var = vv[v]; + const struct fmt_spec *fmt = var_get_print_format (var); + + tab_text (table, 0, 2 + v, TAT_NONE, var_to_string (var)); - tab_float (table, 1, 2 + v, TAT_NONE, desc[v].n, 8, 0); - tab_float (table, 2, 2 + v, TAT_NONE, desc[v].mean, 8, 3); - tab_float (table, 3, 2 + v, TAT_NONE, desc[v].std_dev, 8, 3); - tab_float (table, 4, 2 + v, TAT_NONE, desc[v].min, 8, 3); - tab_float (table, 5, 2 + v, TAT_NONE, desc[v].max, 8, 3); + tab_double (table, 1, 2 + v, TAT_NONE, desc[v].n, fmt); + tab_double (table, 2, 2 + v, TAT_NONE, desc[v].mean, fmt); + tab_double (table, 3, 2 + v, TAT_NONE, desc[v].std_dev, fmt); + tab_double (table, 4, 2 + v, TAT_NONE, desc[v].min, fmt); + tab_double (table, 5, 2 + v, TAT_NONE, desc[v].max, fmt); } diff --git a/src/language/stats/npar-summary.h b/src/language/stats/npar-summary.h index 6cf6367c..0e52b802 100644 --- a/src/language/stats/npar-summary.h +++ b/src/language/stats/npar-summary.h @@ -37,11 +37,4 @@ void npar_summary_calc_descriptives (struct descriptives *desc, int n_vars, enum mv_class filter); - -void do_summary_box (const struct descriptives *desc, - const struct variable *const *vv, - int n_vars); - - - #endif diff --git a/src/language/stats/oneway.q b/src/language/stats/oneway.q index 7da99227..34f2a216 100644 --- a/src/language/stats/oneway.q +++ b/src/language/stats/oneway.q @@ -43,6 +43,7 @@ #include #include #include "sort-criteria.h" +#include #include "xalloc.h" @@ -89,7 +90,7 @@ static void run_oneway (struct cmd_oneway *, struct casereader *, /* Routines to show the output tables */ static void show_anova_table(void); -static void show_descriptives(void); +static void show_descriptives (const struct dictionary *dict); static void show_homogeneity(void); static void show_contrast_coeffs(short *); @@ -100,7 +101,7 @@ enum stat_table_t {STAT_DESC = 1, STAT_HOMO = 2}; static enum stat_table_t stat_tables ; -void output_oneway(void); +static void output_oneway (const struct dictionary *dict); int @@ -147,8 +148,8 @@ cmd_oneway (struct lexer *lexer, struct dataset *ds) } -void -output_oneway(void) +static void +output_oneway (const struct dictionary *dict) { size_t i; short *bad_contrast ; @@ -179,7 +180,7 @@ output_oneway(void) } if ( stat_tables & STAT_DESC ) - show_descriptives(); + show_descriptives (dict); if ( stat_tables & STAT_HOMO ) show_homogeneity(); @@ -319,29 +320,29 @@ show_anova_table(void) /* Sums of Squares */ - tab_float (t, 2, i * 3 + 1, 0, ssa, 10, 2); - tab_float (t, 2, i * 3 + 3, 0, sst, 10, 2); - tab_float (t, 2, i * 3 + 2, 0, sst - ssa, 10, 2); + tab_double (t, 2, i * 3 + 1, 0, ssa, NULL); + tab_double (t, 2, i * 3 + 3, 0, sst, NULL); + tab_double (t, 2, i * 3 + 2, 0, sst - ssa, NULL); /* Degrees of freedom */ - tab_float (t, 3, i * 3 + 1, 0, df1, 4, 0); - tab_float (t, 3, i * 3 + 2, 0, df2, 4, 0); - tab_float (t, 3, i * 3 + 3, 0, totals->n - 1, 4, 0); + tab_fixed (t, 3, i * 3 + 1, 0, df1, 4, 0); + tab_fixed (t, 3, i * 3 + 2, 0, df2, 4, 0); + tab_fixed (t, 3, i * 3 + 3, 0, totals->n - 1, 4, 0); /* Mean Squares */ - tab_float (t, 4, i * 3 + 1, TAB_RIGHT, msa, 8, 3); - tab_float (t, 4, i * 3 + 2, TAB_RIGHT, gp->mse, 8, 3); + tab_double (t, 4, i * 3 + 1, TAB_RIGHT, msa, NULL); + tab_double (t, 4, i * 3 + 2, TAB_RIGHT, gp->mse, NULL); { - const double F = msa/gp->mse ; + const double F = msa / gp->mse ; /* The F value */ - tab_float (t, 5, i * 3 + 1, 0, F, 8, 3); + tab_double (t, 5, i * 3 + 1, 0, F, NULL); /* The significance */ - tab_float (t, 6, i * 3 + 1, 0, gsl_cdf_fdist_Q(F,df1,df2), 8, 3); + tab_double (t, 6, i * 3 + 1, 0, gsl_cdf_fdist_Q (F, df1,df2), NULL); } } @@ -356,16 +357,18 @@ show_anova_table(void) /* Show the descriptives table */ static void -show_descriptives(void) +show_descriptives (const struct dictionary *dict) { size_t v; - int n_cols =10; + int n_cols = 10; struct tab_table *t; int row; - const double confidence=0.95; + const double confidence = 0.95; const double q = (1.0 - confidence) / 2.0; + const struct variable *wv = dict_get_weight (dict); + const struct fmt_spec *wfmt = wv ? var_get_print_format (wv) : & F_8_0; int n_rows = 2 ; @@ -419,7 +422,8 @@ show_descriptives(void) struct group_statistics *gs; struct group_statistics *totals = &gp->ugs; - const char *s = var_to_string(vars[v]); + const char *s = var_to_string (vars[v]); + const struct fmt_spec *fmt = var_get_print_format (vars[v]); struct group_statistics *const *gs_array = (struct group_statistics *const *) hsh_sort(gp->group_hash); @@ -429,7 +433,7 @@ show_descriptives(void) if ( v > 0) tab_hline(t, TAL_1, 0, n_cols - 1 , row); - for (count = 0 ; count < hsh_count(gp->group_hash) ; ++count) + for (count = 0; count < hsh_count (gp->group_hash); ++count) { struct string vstr; ds_init_empty (&vstr); @@ -445,68 +449,65 @@ show_descriptives(void) /* Now fill in the numbers ... */ - tab_float (t, 2, row + count, 0, gs->n, 8,0); + tab_fixed (t, 2, row + count, 0, gs->n, 8, 0); - tab_float (t, 3, row + count, 0, gs->mean,8,2); + tab_double (t, 3, row + count, 0, gs->mean, NULL); - tab_float (t, 4, row + count, 0, gs->std_dev,8,2); + tab_double (t, 4, row + count, 0, gs->std_dev, NULL); - std_error = gs->std_dev/sqrt(gs->n) ; - tab_float (t, 5, row + count, 0, - std_error, 8,2); + std_error = gs->std_dev / sqrt (gs->n) ; + tab_double (t, 5, row + count, 0, + std_error, NULL); /* Now the confidence interval */ - T = gsl_cdf_tdist_Qinv(q,gs->n - 1); + T = gsl_cdf_tdist_Qinv (q, gs->n - 1); - tab_float(t, 6, row + count, 0, - gs->mean - T * std_error, 8, 2); + tab_double (t, 6, row + count, 0, + gs->mean - T * std_error, NULL); - tab_float(t, 7, row + count, 0, - gs->mean + T * std_error, 8, 2); + tab_double (t, 7, row + count, 0, + gs->mean + T * std_error, NULL); /* Min and Max */ - tab_float(t, 8, row + count, 0, gs->minimum, 8, 2); - tab_float(t, 9, row + count, 0, gs->maximum, 8, 2); - + tab_double (t, 8, row + count, 0, gs->minimum, fmt); + tab_double (t, 9, row + count, 0, gs->maximum, fmt); } tab_text (t, 1, row + count, TAB_LEFT | TAT_TITLE ,_("Total")); - tab_float (t, 2, row + count, 0, totals->n, 8,0); + tab_double (t, 2, row + count, 0, totals->n, wfmt); - tab_float (t, 3, row + count, 0, totals->mean, 8,2); + tab_double (t, 3, row + count, 0, totals->mean, NULL); - tab_float (t, 4, row + count, 0, totals->std_dev,8,2); + tab_double (t, 4, row + count, 0, totals->std_dev, NULL); - std_error = totals->std_dev/sqrt(totals->n) ; + std_error = totals->std_dev / sqrt (totals->n) ; - tab_float (t, 5, row + count, 0, std_error, 8,2); + tab_double (t, 5, row + count, 0, std_error, NULL); /* Now the confidence interval */ - T = gsl_cdf_tdist_Qinv(q,totals->n - 1); + T = gsl_cdf_tdist_Qinv (q, totals->n - 1); - tab_float(t, 6, row + count, 0, - totals->mean - T * std_error, 8, 2); + tab_double (t, 6, row + count, 0, + totals->mean - T * std_error, NULL); - tab_float(t, 7, row + count, 0, - totals->mean + T * std_error, 8, 2); + tab_double (t, 7, row + count, 0, + totals->mean + T * std_error, NULL); /* Min and Max */ - tab_float(t, 8, row + count, 0, totals->minimum, 8, 2); - tab_float(t, 9, row + count, 0, totals->maximum, 8, 2); + tab_double (t, 8, row + count, 0, totals->minimum, fmt); + tab_double (t, 9, row + count, 0, totals->maximum, fmt); row += gp->n_groups + 1; } tab_submit (t); - - } /* Show the homogeneity table */ @@ -558,12 +559,12 @@ show_homogeneity(void) tab_text (t, 0, v + 1, TAB_LEFT | TAT_TITLE, s); F = gp->levene; - tab_float (t, 1, v + 1, TAB_RIGHT, F, 8,3); - tab_float (t, 2, v + 1, TAB_RIGHT, df1 ,8,0); - tab_float (t, 3, v + 1, TAB_RIGHT, df2 ,8,0); + tab_double (t, 1, v + 1, TAB_RIGHT, F, NULL); + tab_fixed (t, 2, v + 1, TAB_RIGHT, df1, 8, 0); + tab_fixed (t, 3, v + 1, TAB_RIGHT, df2, 8, 0); /* Now the significance */ - tab_float (t, 4, v + 1, TAB_RIGHT,gsl_cdf_fdist_Q(F,df1,df2), 8, 3); + tab_double (t, 4, v + 1, TAB_RIGHT,gsl_cdf_fdist_Q (F, df1, df2), NULL); } tab_submit (t); @@ -774,72 +775,72 @@ show_contrast_tests(short *bad_contrast) } sec_vneq = sqrt(sec_vneq); - df_numerator = pow2(df_numerator); + df_numerator = pow2 (df_numerator); - tab_float (t, 3, (v * lines_per_variable) + i + 1, - TAB_RIGHT, contrast_value, 8,2); + tab_double (t, 3, (v * lines_per_variable) + i + 1, + TAB_RIGHT, contrast_value, NULL); - tab_float (t, 3, (v * lines_per_variable) + i + 1 + + tab_double (t, 3, (v * lines_per_variable) + i + 1 + cmd.sbc_contrast, - TAB_RIGHT, contrast_value, 8,2); + TAB_RIGHT, contrast_value, NULL); - std_error_contrast = sqrt(grp_data->mse * coef_msq); + std_error_contrast = sqrt (grp_data->mse * coef_msq); /* Std. Error */ - tab_float (t, 4, (v * lines_per_variable) + i + 1, + tab_double (t, 4, (v * lines_per_variable) + i + 1, TAB_RIGHT, std_error_contrast, - 8,3); + NULL); T = fabs(contrast_value / std_error_contrast) ; /* T Statistic */ - tab_float (t, 5, (v * lines_per_variable) + i + 1, + tab_double (t, 5, (v * lines_per_variable) + i + 1, TAB_RIGHT, T, - 8,3); + NULL); df = grp_data->ugs.n - grp_data->n_groups; /* Degrees of Freedom */ - tab_float (t, 6, (v * lines_per_variable) + i + 1, + tab_fixed (t, 6, (v * lines_per_variable) + i + 1, TAB_RIGHT, df, - 8,0); + 8, 0); /* Significance TWO TAILED !!*/ - tab_float (t, 7, (v * lines_per_variable) + i + 1, - TAB_RIGHT, 2 * gsl_cdf_tdist_Q(T,df), - 8,3); + tab_double (t, 7, (v * lines_per_variable) + i + 1, + TAB_RIGHT, 2 * gsl_cdf_tdist_Q (T, df), + NULL); /* Now for the Variances NOT Equal case */ /* Std. Error */ - tab_float (t, 4, + tab_double (t, 4, (v * lines_per_variable) + i + 1 + cmd.sbc_contrast, TAB_RIGHT, sec_vneq, - 8,3); + NULL); T = contrast_value / sec_vneq; - tab_float (t, 5, + tab_double (t, 5, (v * lines_per_variable) + i + 1 + cmd.sbc_contrast, TAB_RIGHT, T, - 8,3); + NULL); df = df_numerator / df_denominator; - tab_float (t, 6, + tab_double (t, 6, (v * lines_per_variable) + i + 1 + cmd.sbc_contrast, TAB_RIGHT, df, - 8,3); + NULL); /* The Significance */ - tab_float (t, 7, (v * lines_per_variable) + i + 1 + cmd.sbc_contrast, - TAB_RIGHT, 2 * gsl_cdf_tdist_Q(T,df), - 8,3); + tab_double (t, 7, (v * lines_per_variable) + i + 1 + cmd.sbc_contrast, + TAB_RIGHT, 2 * gsl_cdf_tdist_Q (T,df), + NULL); } @@ -849,7 +850,6 @@ show_contrast_tests(short *bad_contrast) } tab_submit (t); - } @@ -1018,7 +1018,8 @@ run_oneway (struct cmd_oneway *cmd, ostensible_number_of_groups = hsh_count (global_group_hash); if (!taint_has_tainted_successor (taint)) - output_oneway(); + output_oneway (dict); + taint_destroy (taint); } diff --git a/src/language/stats/regression.q b/src/language/stats/regression.q index 19aa0ee3..a067b3af 100644 --- a/src/language/stats/regression.q +++ b/src/language/stats/regression.q @@ -160,10 +160,10 @@ reg_stats_r (pspp_linreg_cache * c) tab_text (t, 2, 0, TAB_CENTER | TAT_TITLE, _("R Square")); tab_text (t, 3, 0, TAB_CENTER | TAT_TITLE, _("Adjusted R Square")); tab_text (t, 4, 0, TAB_CENTER | TAT_TITLE, _("Std. Error of the Estimate")); - tab_float (t, 1, 1, TAB_RIGHT, sqrt (rsq), 10, 2); - tab_float (t, 2, 1, TAB_RIGHT, rsq, 10, 2); - tab_float (t, 3, 1, TAB_RIGHT, adjrsq, 10, 2); - tab_float (t, 4, 1, TAB_RIGHT, std_error, 10, 2); + tab_double (t, 1, 1, TAB_RIGHT, sqrt (rsq), NULL); + tab_double (t, 2, 1, TAB_RIGHT, rsq, NULL); + tab_double (t, 3, 1, TAB_RIGHT, adjrsq, NULL); + tab_double (t, 4, 1, TAB_RIGHT, std_error, NULL); tab_title (t, _("Model Summary")); tab_submit (t); } @@ -205,14 +205,14 @@ reg_stats_coeff (pspp_linreg_cache * c) tab_text (t, 5, 0, TAB_CENTER | TAT_TITLE, _("t")); tab_text (t, 6, 0, TAB_CENTER | TAT_TITLE, _("Significance")); tab_text (t, 1, 1, TAB_LEFT | TAT_TITLE, _("(Constant)")); - tab_float (t, 2, 1, 0, c->intercept, 10, 2); + tab_double (t, 2, 1, 0, c->intercept, NULL); std_err = sqrt (gsl_matrix_get (c->cov, 0, 0)); - tab_float (t, 3, 1, 0, std_err, 10, 2); - tab_float (t, 4, 1, 0, 0.0, 10, 2); + tab_double (t, 3, 1, 0, std_err, NULL); + tab_double (t, 4, 1, 0, 0.0, NULL); t_stat = c->intercept / std_err; - tab_float (t, 5, 1, 0, t_stat, 10, 2); + tab_double (t, 5, 1, 0, t_stat, NULL); pval = 2 * gsl_cdf_tdist_Q (fabs (t_stat), 1.0); - tab_float (t, 6, 1, 0, pval, 10, 2); + tab_double (t, 6, 1, 0, pval, NULL); for (j = 0; j < c->n_coeffs; j++) { struct string tstr; @@ -240,32 +240,32 @@ reg_stats_coeff (pspp_linreg_cache * c) /* Regression coefficients. */ - tab_float (t, 2, this_row, 0, c->coeff[j]->estimate, 10, 2); + tab_double (t, 2, this_row, 0, c->coeff[j]->estimate, NULL); /* Standard error of the coefficients. */ std_err = sqrt (gsl_matrix_get (c->cov, j + 1, j + 1)); - tab_float (t, 3, this_row, 0, std_err, 10, 2); + tab_double (t, 3, this_row, 0, std_err, NULL); /* Standardized coefficient, i.e., regression coefficient if all variables had unit variance. */ beta = pspp_coeff_get_sd (c->coeff[j]); beta *= c->coeff[j]->estimate / c->depvar_std; - tab_float (t, 4, this_row, 0, beta, 10, 2); + tab_double (t, 4, this_row, 0, beta, NULL); /* Test statistic for H0: coefficient is 0. */ t_stat = c->coeff[j]->estimate / std_err; - tab_float (t, 5, this_row, 0, t_stat, 10, 2); + tab_double (t, 5, this_row, 0, t_stat, NULL); /* P values for the test statistic above. */ pval = 2 * gsl_cdf_tdist_Q (fabs (t_stat), (double) (c->n_obs - c->n_coeffs)); - tab_float (t, 6, this_row, 0, pval, 10, 2); + tab_double (t, 6, this_row, 0, pval, NULL); ds_destroy (&tstr); } tab_title (t, _("Coefficients")); @@ -309,9 +309,9 @@ reg_stats_anova (pspp_linreg_cache * c) tab_text (t, 1, 3, TAB_LEFT | TAT_TITLE, _("Total")); /* Sums of Squares */ - tab_float (t, 2, 1, 0, c->ssm, 10, 2); - tab_float (t, 2, 3, 0, c->sst, 10, 2); - tab_float (t, 2, 2, 0, c->sse, 10, 2); + tab_double (t, 2, 1, 0, c->ssm, NULL); + tab_double (t, 2, 3, 0, c->sst, NULL); + tab_double (t, 2, 2, 0, c->sse, NULL); /* Degrees of freedom */ @@ -320,12 +320,12 @@ reg_stats_anova (pspp_linreg_cache * c) tab_text (t, 3, 3, TAB_RIGHT | TAT_PRINTF, "%g", c->dft); /* Mean Squares */ - tab_float (t, 4, 1, TAB_RIGHT, msm, 8, 3); - tab_float (t, 4, 2, TAB_RIGHT, mse, 8, 3); + tab_double (t, 4, 1, TAB_RIGHT, msm, NULL); + tab_double (t, 4, 2, TAB_RIGHT, mse, NULL); - tab_float (t, 5, 1, 0, F, 8, 3); + tab_double (t, 5, 1, 0, F, NULL); - tab_float (t, 6, 1, 0, pval, 8, 3); + tab_double (t, 6, 1, 0, pval, NULL); tab_title (t, _("ANOVA")); tab_submit (t); @@ -398,8 +398,8 @@ reg_stats_bcov (pspp_linreg_cache * c) { col = (i <= k) ? k : i; row = (i <= k) ? i : k; - tab_float (t, k + 2, i, TAB_CENTER, - gsl_matrix_get (c->cov, row, col), 8, 3); + tab_double (t, k + 2, i, TAB_CENTER, + gsl_matrix_get (c->cov, row, col), NULL); } } tab_title (t, _("Coefficient Correlations")); diff --git a/src/language/stats/t-test.q b/src/language/stats/t-test.q index 5bb02e17..40bf9778 100644 --- a/src/language/stats/t-test.q +++ b/src/language/stats/t-test.q @@ -43,6 +43,7 @@ #include #include #include +#include #include "xalloc.h" @@ -152,7 +153,8 @@ static int parse_value (struct lexer *lexer, union value * v, enum val_type); /* Structures and Functions for the Statistics Summary Box */ struct ssbox; typedef void populate_ssbox_func (struct ssbox *ssb, - struct cmd_t_test *cmd); + const struct dictionary *, + struct cmd_t_test *cmd); typedef void finalize_ssbox_func (struct ssbox *ssb); struct ssbox @@ -168,21 +170,23 @@ struct ssbox void ssbox_create (struct ssbox *ssb, struct cmd_t_test *cmd, int mode); /* Populate a ssbox according to cmd */ -void ssbox_populate (struct ssbox *ssb, struct cmd_t_test *cmd); +void ssbox_populate (struct ssbox *ssb, const struct dictionary *dict, + struct cmd_t_test *cmd); /* Submit and destroy a ssbox */ void ssbox_finalize (struct ssbox *ssb); /* A function to create, populate and submit the Paired Samples Correlation box */ -void pscbox (void); +static void pscbox (const struct dictionary *); /* Structures and Functions for the Test Results Box */ struct trbox; typedef void populate_trbox_func (struct trbox *trb, - struct cmd_t_test *cmd); + const struct dictionary *dict, + struct cmd_t_test *cmd); typedef void finalize_trbox_func (struct trbox *trb); struct trbox { @@ -195,7 +199,8 @@ struct trbox { void trbox_create (struct trbox *trb, struct cmd_t_test *cmd, int mode); /* Populate a ssbox according to cmd */ -void trbox_populate (struct trbox *trb, struct cmd_t_test *cmd); +static void trbox_populate (struct trbox *trb, const struct dictionary *dict, + struct cmd_t_test *cmd); /* Submit and destroy a ssbox */ void trbox_finalize (struct trbox *trb); @@ -637,9 +642,10 @@ ssbox_create (struct ssbox *ssb, struct cmd_t_test *cmd, int mode) /* Despatcher for the populate method */ void -ssbox_populate (struct ssbox *ssb,struct cmd_t_test *cmd) +ssbox_populate (struct ssbox *ssb, const struct dictionary *dict, + struct cmd_t_test *cmd) { - ssb->populate (ssb,cmd); + ssb->populate (ssb, dict, cmd); } @@ -675,7 +681,8 @@ ssbox_base_init (struct ssbox *this, int cols,int rows) } void ssbox_one_sample_populate (struct ssbox *ssb, - struct cmd_t_test *cmd); + const struct dictionary *, + struct cmd_t_test *cmd); /* Initialize the one_sample ssbox */ void @@ -696,8 +703,9 @@ ssbox_one_sample_init (struct ssbox *this, tab_text (this->t, 4, 0, TAB_CENTER | TAT_TITLE, _ ("SE. Mean")); } -void ssbox_independent_samples_populate (struct ssbox *ssb, - struct cmd_t_test *cmd); +static void ssbox_independent_samples_populate (struct ssbox *ssb, + const struct dictionary *, + struct cmd_t_test *cmd); /* Initialize the independent samples ssbox */ void @@ -721,12 +729,16 @@ ssbox_independent_samples_init (struct ssbox *this, /* Populate the ssbox for independent samples */ -void +static void ssbox_independent_samples_populate (struct ssbox *ssb, - struct cmd_t_test *cmd) + const struct dictionary *dict, + struct cmd_t_test *cmd) { int i; + const struct variable *wv = dict_get_weight (dict); + const struct fmt_spec *wfmt = wv ? var_get_print_format (wv) : &F_8_0; + char *val_lab[2] = {NULL, NULL}; double indep_value[2]; @@ -818,10 +830,10 @@ ssbox_independent_samples_populate (struct ssbox *ssb, gs = hsh_find (grp_hash, (void *) &search_val); assert (gs); - tab_float (ssb->t, 2 ,i*2+count+1, TAB_RIGHT, gs->n, 10, 0); - tab_float (ssb->t, 3 ,i*2+count+1, TAB_RIGHT, gs->mean, 8, 2); - tab_float (ssb->t, 4 ,i*2+count+1, TAB_RIGHT, gs->std_dev, 8, 3); - tab_float (ssb->t, 5 ,i*2+count+1, TAB_RIGHT, gs->se_mean, 8, 3); + tab_double (ssb->t, 2, i*2+count+1, TAB_RIGHT, gs->n, wfmt); + tab_double (ssb->t, 3, i*2+count+1, TAB_RIGHT, gs->mean, NULL); + tab_double (ssb->t, 4, i*2+count+1, TAB_RIGHT, gs->std_dev, NULL); + tab_double (ssb->t, 5, i*2+count+1, TAB_RIGHT, gs->se_mean, NULL); } } free (val_lab[0]); @@ -829,8 +841,9 @@ ssbox_independent_samples_populate (struct ssbox *ssb, } -void ssbox_paired_populate (struct ssbox *ssb, - struct cmd_t_test *cmd); +static void ssbox_paired_populate (struct ssbox *ssb, + const struct dictionary *dict, + struct cmd_t_test *cmd); /* Initialize the paired values ssbox */ void @@ -855,10 +868,14 @@ ssbox_paired_init (struct ssbox *this, struct cmd_t_test *cmd UNUSED) /* Populate the ssbox for paired values */ void -ssbox_paired_populate (struct ssbox *ssb,struct cmd_t_test *cmd UNUSED) +ssbox_paired_populate (struct ssbox *ssb, const struct dictionary *dict, + struct cmd_t_test *cmd UNUSED) { int i; + const struct variable *wv = dict_get_weight (dict); + const struct fmt_spec *wfmt = wv ? var_get_print_format (wv) : &F_8_0; + assert (ssb->t); for (i=0; i < n_pairs; ++i) @@ -879,10 +896,11 @@ ssbox_paired_populate (struct ssbox *ssb,struct cmd_t_test *cmd UNUSED) var_get_name (pairs[i].v[j])); /* Values */ - tab_float (ssb->t,2, i*2+j+1, TAB_RIGHT, pairs[i].mean[j], 8, 2); - tab_float (ssb->t,3, i*2+j+1, TAB_RIGHT, pairs[i].n, 10, 0); - tab_float (ssb->t,4, i*2+j+1, TAB_RIGHT, pairs[i].std_dev[j], 8, 3); - tab_float (ssb->t,5, i*2+j+1, TAB_RIGHT, pairs[i].std_dev[j]/sqrt (pairs[i].n), 8, 3); + tab_double (ssb->t,2, i*2+j+1, TAB_RIGHT, pairs[i].mean[j], NULL); + tab_double (ssb->t,3, i*2+j+1, TAB_RIGHT, pairs[i].n, wfmt); + tab_double (ssb->t,4, i*2+j+1, TAB_RIGHT, pairs[i].std_dev[j], NULL); + tab_double (ssb->t,5, i*2+j+1, TAB_RIGHT, + pairs[i].std_dev[j]/sqrt (pairs[i].n), NULL); } } @@ -890,10 +908,14 @@ ssbox_paired_populate (struct ssbox *ssb,struct cmd_t_test *cmd UNUSED) /* Populate the one sample ssbox */ void -ssbox_one_sample_populate (struct ssbox *ssb, struct cmd_t_test *cmd) +ssbox_one_sample_populate (struct ssbox *ssb, const struct dictionary *dict, + struct cmd_t_test *cmd) { int i; + const struct variable *wv = dict_get_weight (dict); + const struct fmt_spec *wfmt = wv ? var_get_print_format (wv) : &F_8_0; + assert (ssb->t); for (i=0; i < cmd->n_variables; ++i) @@ -901,12 +923,11 @@ ssbox_one_sample_populate (struct ssbox *ssb, struct cmd_t_test *cmd) struct group_statistics *gs = &group_proc_get (cmd->v_variables[i])->ugs; tab_text (ssb->t, 0, i+1, TAB_LEFT, var_get_name (cmd->v_variables[i])); - tab_float (ssb->t,1, i+1, TAB_RIGHT, gs->n, 10, 0); - tab_float (ssb->t,2, i+1, TAB_RIGHT, gs->mean, 8, 2); - tab_float (ssb->t,3, i+1, TAB_RIGHT, gs->std_dev, 8, 2); - tab_float (ssb->t,4, i+1, TAB_RIGHT, gs->se_mean, 8, 3); + tab_double (ssb->t,1, i+1, TAB_RIGHT, gs->n, wfmt); + tab_double (ssb->t,2, i+1, TAB_RIGHT, gs->mean, NULL); + tab_double (ssb->t,3, i+1, TAB_RIGHT, gs->std_dev, NULL); + tab_double (ssb->t,4, i+1, TAB_RIGHT, gs->se_mean, NULL); } - } @@ -919,20 +940,23 @@ void trbox_base_finalize (struct trbox *trb); void trbox_independent_samples_init (struct trbox *trb, struct cmd_t_test *cmd ); -void trbox_independent_samples_populate (struct trbox *trb, - struct cmd_t_test *cmd); +static void trbox_independent_samples_populate (struct trbox *trb, + const struct dictionary *dict, + struct cmd_t_test *cmd); void trbox_one_sample_init (struct trbox *self, struct cmd_t_test *cmd ); -void trbox_one_sample_populate (struct trbox *trb, - struct cmd_t_test *cmd); +static void trbox_one_sample_populate (struct trbox *trb, + const struct dictionary *, + struct cmd_t_test *cmd); void trbox_paired_init (struct trbox *self, struct cmd_t_test *cmd ); -void trbox_paired_populate (struct trbox *trb, - struct cmd_t_test *cmd); +static void trbox_paired_populate (struct trbox *trb, + const struct dictionary *, + struct cmd_t_test *cmd); @@ -958,10 +982,11 @@ trbox_create (struct trbox *trb, } /* Populate a trbox according to cmd */ -void -trbox_populate (struct trbox *trb, struct cmd_t_test *cmd) +static void +trbox_populate (struct trbox *trb, const struct dictionary *dict, + struct cmd_t_test *cmd) { - trb->populate (trb,cmd); + trb->populate (trb, dict, cmd); } /* Submit and destroy a trbox */ @@ -1012,9 +1037,10 @@ trbox_independent_samples_init (struct trbox *self, } /* Populate the independent samples trbox */ -void +static void trbox_independent_samples_populate (struct trbox *self, - struct cmd_t_test *cmd ) + const struct dictionary *dict UNUSED, + struct cmd_t_test *cmd) { int i; @@ -1064,16 +1090,16 @@ trbox_independent_samples_populate (struct trbox *self, tab_text (self->t, 1, i*2+3, TAB_LEFT, _ ("Equal variances assumed")); - tab_float (self->t, 2, i*2+3, TAB_CENTER, grp_data->levene, 8,3); + tab_double (self->t, 2, i*2+3, TAB_CENTER, grp_data->levene, NULL); /* Now work out the significance of the Levene test */ df1 = 1; df2 = grp_data->ugs.n - 2; q = gsl_cdf_fdist_Q (grp_data->levene, df1, df2); - tab_float (self->t, 3, i*2+3, TAB_CENTER, q, 8,3 ); + tab_double (self->t, 3, i*2+3, TAB_CENTER, q, NULL); df = gs0->n + gs1->n - 2.0 ; - tab_float (self->t, 5, i*2+3, TAB_RIGHT, df, 10, 0); + tab_double (self->t, 5, i*2+3, TAB_RIGHT, df, NULL); pooled_variance = ( (gs0->n )*pow2 (gs0->s_std_dev) + @@ -1083,30 +1109,30 @@ trbox_independent_samples_populate (struct trbox *self, t = (gs0->mean - gs1->mean) / sqrt (pooled_variance) ; t /= sqrt ((gs0->n + gs1->n)/ (gs0->n*gs1->n)); - tab_float (self->t, 4, i*2+3, TAB_RIGHT, t, 8, 3); + tab_double (self->t, 4, i*2+3, TAB_RIGHT, t, NULL); p = gsl_cdf_tdist_P (t, df); q = gsl_cdf_tdist_Q (t, df); - tab_float (self->t, 6, i*2+3, TAB_RIGHT, 2.0* (t>0?q:p) , 8, 3); + tab_double (self->t, 6, i*2+3, TAB_RIGHT, 2.0* (t>0?q:p), NULL); mean_diff = gs0->mean - gs1->mean; - tab_float (self->t, 7, i*2+3, TAB_RIGHT, mean_diff, 8, 3); + tab_double (self->t, 7, i*2+3, TAB_RIGHT, mean_diff, NULL); std_err_diff = sqrt ( pow2 (gs0->se_mean) + pow2 (gs1->se_mean)); - tab_float (self->t, 8, i*2+3, TAB_RIGHT, std_err_diff, 8, 3); + tab_double (self->t, 8, i*2+3, TAB_RIGHT, std_err_diff, NULL); /* Now work out the confidence interval */ q = (1 - cmd->criteria)/2.0; /* 2-tailed test */ t = gsl_cdf_tdist_Qinv (q,df); - tab_float (self->t, 9, i*2+3, TAB_RIGHT, - mean_diff - t * std_err_diff, 8, 3); + tab_double (self->t, 9, i*2+3, TAB_RIGHT, + mean_diff - t * std_err_diff, NULL); - tab_float (self->t, 10, i*2+3, TAB_RIGHT, - mean_diff + t * std_err_diff, 8, 3); + tab_double (self->t, 10, i*2+3, TAB_RIGHT, + mean_diff + t * std_err_diff, NULL); { @@ -1120,7 +1146,7 @@ trbox_independent_samples_populate (struct trbox *self, (pow2 (gs1->s_std_dev)/ (gs1->n -1) ); t = mean_diff / sqrt (se2) ; - tab_float (self->t, 4, i*2+3+1, TAB_RIGHT, t, 8, 3); + tab_double (self->t, 4, i*2+3+1, TAB_RIGHT, t, NULL); df = pow2 (se2) / ( (pow2 (pow2 (gs0->s_std_dev)/ (gs0->n - 1 )) @@ -1131,30 +1157,30 @@ trbox_independent_samples_populate (struct trbox *self, / (gs1->n -1 ) ) ) ; - tab_float (self->t, 5, i*2+3+1, TAB_RIGHT, df, 8, 3); + + tab_double (self->t, 5, i*2+3+1, TAB_RIGHT, df, NULL); p = gsl_cdf_tdist_P (t, df); q = gsl_cdf_tdist_Q (t, df); - tab_float (self->t, 6, i*2+3+1, TAB_RIGHT, 2.0* (t>0?q:p) , 8, 3); + tab_double (self->t, 6, i*2+3+1, TAB_RIGHT, 2.0* (t>0?q:p), NULL); /* Now work out the confidence interval */ q = (1 - cmd->criteria)/2.0; /* 2-tailed test */ t = gsl_cdf_tdist_Qinv (q, df); - tab_float (self->t, 7, i*2+3+1, TAB_RIGHT, mean_diff, 8, 3); - + tab_double (self->t, 7, i*2+3+1, TAB_RIGHT, mean_diff, NULL); - tab_float (self->t, 8, i*2+3+1, TAB_RIGHT, std_err_diff, 8, 3); + tab_double (self->t, 8, i*2+3+1, TAB_RIGHT, std_err_diff, NULL); - tab_float (self->t, 9, i*2+3+1, TAB_RIGHT, - mean_diff - t * std_err_diff, 8, 3); - tab_float (self->t, 10, i*2+3+1, TAB_RIGHT, - mean_diff + t * std_err_diff, 8, 3); + tab_double (self->t, 9, i*2+3+1, TAB_RIGHT, + mean_diff - t * std_err_diff, NULL); + tab_double (self->t, 10, i*2+3+1, TAB_RIGHT, + mean_diff + t * std_err_diff, NULL); } } } @@ -1195,12 +1221,16 @@ trbox_paired_init (struct trbox *self, } /* Populate the paired samples trbox */ -void +static void trbox_paired_populate (struct trbox *trb, - struct cmd_t_test *cmd UNUSED) + const struct dictionary *dict, + struct cmd_t_test *cmd UNUSED) { int i; + const struct variable *wv = dict_get_weight (dict); + const struct fmt_spec *wfmt = wv ? var_get_print_format (wv) : &F_8_0; + for (i=0; i < n_pairs; ++i) { double p,q; @@ -1216,42 +1246,42 @@ trbox_paired_populate (struct trbox *trb, var_get_name (pairs[i].v[0]), var_get_name (pairs[i].v[1])); - tab_float (trb->t, 2, i+3, TAB_RIGHT, pairs[i].mean_diff, 8, 4); + tab_double (trb->t, 2, i+3, TAB_RIGHT, pairs[i].mean_diff, NULL); - tab_float (trb->t, 3, i+3, TAB_RIGHT, pairs[i].std_dev_diff, 8, 5); + tab_double (trb->t, 3, i+3, TAB_RIGHT, pairs[i].std_dev_diff, NULL); /* SE Mean */ se_mean = pairs[i].std_dev_diff / sqrt (n) ; - tab_float (trb->t, 4, i+3, TAB_RIGHT, se_mean, 8,5 ); + tab_double (trb->t, 4, i+3, TAB_RIGHT, se_mean, NULL); /* Now work out the confidence interval */ q = (1 - cmd->criteria)/2.0; /* 2-tailed test */ t = gsl_cdf_tdist_Qinv (q, df); - tab_float (trb->t, 5, i+3, TAB_RIGHT, - pairs[i].mean_diff - t * se_mean , 8, 4); + tab_double (trb->t, 5, i+3, TAB_RIGHT, + pairs[i].mean_diff - t * se_mean , NULL); - tab_float (trb->t, 6, i+3, TAB_RIGHT, - pairs[i].mean_diff + t * se_mean , 8, 4); + tab_double (trb->t, 6, i+3, TAB_RIGHT, + pairs[i].mean_diff + t * se_mean , NULL); t = (pairs[i].mean[0] - pairs[i].mean[1]) / sqrt ( - ( pow2 (pairs[i].s_std_dev[0]) + pow2 (pairs[i].s_std_dev[1]) - + ( pow2 (pairs[i].s_std_dev[0]) + pow2 (pairs[i].s_std_dev[1]) - 2 * pairs[i].correlation * pairs[i].s_std_dev[0] * pairs[i].s_std_dev[1] ) / (n - 1) ); - tab_float (trb->t, 7, i+3, TAB_RIGHT, t , 8,3 ); + tab_double (trb->t, 7, i+3, TAB_RIGHT, t, NULL); /* Degrees of freedom */ - tab_float (trb->t, 8, i+3, TAB_RIGHT, df , 10, 0 ); + tab_double (trb->t, 8, i+3, TAB_RIGHT, df, wfmt); p = gsl_cdf_tdist_P (t,df); q = gsl_cdf_tdist_P (t,df); - tab_float (trb->t, 9, i+3, TAB_RIGHT, 2.0* (t>0?q:p) , 8, 3); + tab_double (trb->t, 9, i+3, TAB_RIGHT, 2.0* (t>0?q:p), NULL); } } @@ -1293,11 +1323,16 @@ trbox_one_sample_init (struct trbox *self, struct cmd_t_test *cmd ) /* Populate the one sample trbox */ -void -trbox_one_sample_populate (struct trbox *trb, struct cmd_t_test *cmd) +static void +trbox_one_sample_populate (struct trbox *trb, + const struct dictionary *dict, + struct cmd_t_test *cmd) { int i; + const struct variable *wv = dict_get_weight (dict); + const struct fmt_spec *wfmt = wv ? var_get_print_format (wv) : &F_8_0; + assert (trb->t); for (i=0; i < cmd->n_variables; ++i) @@ -1312,31 +1347,31 @@ trbox_one_sample_populate (struct trbox *trb, struct cmd_t_test *cmd) t = (gs->mean - cmd->n_testval[0] ) * sqrt (gs->n) / gs->std_dev ; - tab_float (trb->t, 1, i+3, TAB_RIGHT, t, 8,3); + tab_double (trb->t, 1, i+3, TAB_RIGHT, t, NULL); /* degrees of freedom */ df = gs->n - 1; - tab_float (trb->t, 2, i+3, TAB_RIGHT, df, 8,0); + tab_double (trb->t, 2, i+3, TAB_RIGHT, df, wfmt); p = gsl_cdf_tdist_P (t, df); q = gsl_cdf_tdist_Q (t, df); /* Multiply by 2 to get 2-tailed significance, makeing sure we've got the correct tail*/ - tab_float (trb->t, 3, i+3, TAB_RIGHT, 2.0* (t>0?q:p), 8,3); + tab_double (trb->t, 3, i+3, TAB_RIGHT, 2.0* (t>0?q:p), NULL); - tab_float (trb->t, 4, i+3, TAB_RIGHT, gs->mean_diff, 8,3); + tab_double (trb->t, 4, i+3, TAB_RIGHT, gs->mean_diff, NULL); q = (1 - cmd->criteria)/2.0; /* 2-tailed test */ t = gsl_cdf_tdist_Qinv (q, df); - tab_float (trb->t, 5, i+3, TAB_RIGHT, - gs->mean_diff - t * gs->se_mean, 8,4); + tab_double (trb->t, 5, i+3, TAB_RIGHT, + gs->mean_diff - t * gs->se_mean, NULL); - tab_float (trb->t, 6, i+3, TAB_RIGHT, - gs->mean_diff + t * gs->se_mean, 8,4); + tab_double (trb->t, 6, i+3, TAB_RIGHT, + gs->mean_diff + t * gs->se_mean, NULL); } } @@ -1364,11 +1399,14 @@ trbox_base_finalize (struct trbox *trb) /* Create , populate and submit the Paired Samples Correlation box */ -void -pscbox (void) +static void +pscbox (const struct dictionary *dict) { - const int rows=1+n_pairs; - const int cols=5; + const struct variable *wv = dict_get_weight (dict); + const struct fmt_spec *wfmt = wv ? var_get_print_format (wv) : &F_8_0; + + const int rows = 1 + n_pairs; + const int cols = 5; int i; struct tab_table *table; @@ -1410,13 +1448,13 @@ pscbox (void) /* row data */ - tab_float (table, 2, i+1, TAB_RIGHT, pairs[i].n, 4, 0); - tab_float (table, 3, i+1, TAB_RIGHT, pairs[i].correlation, 8, 3); + tab_double (table, 2, i+1, TAB_RIGHT, pairs[i].n, wfmt); + tab_double (table, 3, i+1, TAB_RIGHT, pairs[i].correlation, NULL); p = gsl_cdf_tdist_P (correlation_t, df); q = gsl_cdf_tdist_Q (correlation_t, df); - tab_float (table, 4, i+1, TAB_RIGHT, 2.0* (correlation_t>0?q:p), 8, 3); + tab_double (table, 4, i+1, TAB_RIGHT, 2.0* (correlation_t>0?q:p), NULL); } tab_submit (table); @@ -1859,14 +1897,14 @@ calculate (struct cmd_t_test *cmd, if (!taint_has_tainted_successor (taint)) { ssbox_create (&stat_summary_box,cmd,mode); - ssbox_populate (&stat_summary_box,cmd); + ssbox_populate (&stat_summary_box, dict, cmd); ssbox_finalize (&stat_summary_box); if ( mode == T_PAIRED ) - pscbox (); + pscbox (dict); - trbox_create (&test_results_box,cmd,mode); - trbox_populate (&test_results_box,cmd); + trbox_create (&test_results_box, cmd, mode); + trbox_populate (&test_results_box, dict, cmd); trbox_finalize (&test_results_box); } diff --git a/src/output/table.c b/src/output/table.c index 92f79541..5c8dc6f7 100644 --- a/src/output/table.c +++ b/src/output/table.c @@ -34,6 +34,8 @@ #include #include +#include + #include "minmax.h" #include "xalloc.h" @@ -543,7 +545,7 @@ tab_value (struct tab_table *table, int c, int r, unsigned char opt, /* Sets cell (C,R) in TABLE, with options OPT, to have value VAL with NDEC decimal places. */ void -tab_float (struct tab_table *table, int c, int r, unsigned char opt, +tab_fixed (struct tab_table *table, int c, int r, unsigned char opt, double val, int w, int d) { char *contents; @@ -566,7 +568,7 @@ tab_float (struct tab_table *table, int c, int r, unsigned char opt, || c + table->col_ofs >= table->nc || r + table->row_ofs >= table->nr) { - printf ("tab_float(): bad cell (%d+%d=%d,%d+%d=%d) in table size " + printf ("tab_fixed(): bad cell (%d+%d=%d,%d+%d=%d) in table size " "(%d,%d)\n", c, table->col_ofs, c + table->col_ofs, r, table->row_ofs, r + table->row_ofs, @@ -589,6 +591,61 @@ tab_float (struct tab_table *table, int c, int r, unsigned char opt, memcpy (contents, cp, f.w); } +/* Sets cell (C,R) in TABLE, with options OPT, to have value VAL as + formatted by FMT. + If FMT is null, then the default print format will be used. +*/ +void +tab_double (struct tab_table *table, int c, int r, unsigned char opt, + double val, const struct fmt_spec *fmt) +{ + int w; + char *contents; + char buf[40], *cp; + + union value double_value; + + assert (table != NULL); + + assert (c >= 0); + assert (c < table->nc); + assert (r >= 0); + assert (r < table->nr); + + if ( fmt == NULL) + fmt = settings_get_format (); + + fmt_check_output (fmt); + +#if DEBUGGING + if (c + table->col_ofs < 0 || r + table->row_ofs < 0 + || c + table->col_ofs >= table->nc + || r + table->row_ofs >= table->nr) + { + printf ("tab_double(): bad cell (%d+%d=%d,%d+%d=%d) in table size " + "(%d,%d)\n", + c, table->col_ofs, c + table->col_ofs, + r, table->row_ofs, r + table->row_ofs, + table->nc, table->nr); + return; + } +#endif + + double_value.f = val; + data_out (&double_value, fmt, buf); + + cp = buf; + while (isspace ((unsigned char) *cp) && cp < &buf[fmt->w]) + cp++; + w = fmt->w - (cp - buf); + + contents = pool_alloc (table->container, w); + table->cc[c + r * table->cf] = ss_buffer (contents, w); + table->ct[c + r * table->cf] = opt; + memcpy (contents, cp, w); +} + + /* Sets cell (C,R) in TABLE, with options OPT, to have text value TEXT. */ void @@ -712,7 +769,7 @@ tab_raw (struct tab_table *table, int c, int r, unsigned opt, || c + table->col_ofs >= table->nc || r + table->row_ofs >= table->nr) { - printf ("tab_float(): bad cell (%d+%d=%d,%d+%d=%d) in table size " + printf ("tab_raw(): bad cell (%d+%d=%d,%d+%d=%d) in table size " "(%d,%d)\n", c, table->col_ofs, c + table->col_ofs, r, table->row_ofs, r + table->row_ofs, diff --git a/src/output/table.h b/src/output/table.h index d0958cef..829410ed 100644 --- a/src/output/table.h +++ b/src/output/table.h @@ -155,8 +155,13 @@ struct fmt_spec; union value; void tab_value (struct tab_table *, int c, int r, unsigned char opt, const union value *, const struct fmt_spec *); -void tab_float (struct tab_table *, int c, int r, unsigned char opt, + +void tab_fixed (struct tab_table *, int c, int r, unsigned char opt, double v, int w, int d); + +void tab_double (struct tab_table *, int c, int r, unsigned char opt, + double v, const struct fmt_spec *); + void tab_text (struct tab_table *, int c, int r, unsigned opt, const char *, ...) PRINTF_FORMAT (5, 6); diff --git a/tests/bugs/multipass.sh b/tests/bugs/multipass.sh index 620d42f8..52720630 100755 --- a/tests/bugs/multipass.sh +++ b/tests/bugs/multipass.sh @@ -92,11 +92,11 @@ diff -b -w $TEMPDIR/pspp.list - << EOF |ABC |F8.0 | +--------+------+ 2.1 DESCRIPTIVES. Valid cases = 6; cases with missing value(s) = 0. -+--------#-+-----+-------+-------+-------+ -|Variable#N| Mean|Std Dev|Minimum|Maximum| -#========#=#=====#=======#=======#=======# -|ABC #6|3.000| .837| 2.000| 4.000| -+--------#-+-----+-------+-------+-------+ ++--------#-+----+-------+-------+-------+ +|Variable#N|Mean|Std Dev|Minimum|Maximum| +#========#=#====#=======#=======#=======# +|ABC #6|3.00| .84| 2.00| 4.00| ++--------#-+----+-------+-------+-------+ EOF if [ $? -ne 0 ] ; then fail ; fi diff --git a/tests/bugs/t-test-alpha.sh b/tests/bugs/t-test-alpha.sh index ae7ebf13..f4fc1026 100755 --- a/tests/bugs/t-test-alpha.sh +++ b/tests/bugs/t-test-alpha.sh @@ -101,24 +101,24 @@ diff -b $TEMPDIR/pspp.list - < 1' . NEW FILE. -DATA LIST LIST NOTABLE /x * w *. + + +DATA LIST LIST NOTABLE /x (F8.0) w (F8.0). BEGIN DATA. 1 7 2 6 @@ -101,7 +105,7 @@ ECHO 'P < 0.5; N1/N2 = 1' . NEW FILE. -DATA LIST LIST NOTABLE /x * w *. +DATA LIST LIST NOTABLE /x (F8.0) w (F8.0). BEGIN DATA. 1 8 2 8 @@ -117,7 +121,7 @@ ECHO 'P > 0.5; N1/N2 < 1' . NEW FILE. -DATA LIST LIST NOTABLE /x * w *. +DATA LIST LIST NOTABLE /x (F8.0) w (F8.0). BEGIN DATA. 1 11 2 12 @@ -134,7 +138,7 @@ ECHO 'P > 0.5; N1/N2 > 1' . NEW FILE. -DATA LIST LIST NOTABLE /x * w *. +DATA LIST LIST NOTABLE /x (F8.0) w (F8.0). BEGIN DATA. 1 11 2 9 @@ -149,7 +153,7 @@ ECHO 'P > 0.5; N1/N2 == 1' . NEW FILE. -DATA LIST LIST NOTABLE /x * w *. +DATA LIST LIST NOTABLE /x (F8.0) w (F8.0). BEGIN DATA. 1 11 2 11 @@ -165,7 +169,7 @@ ECHO 'P == 0.5; N1/N2 < 1' . NEW FILE. -DATA LIST LIST NOTABLE /x * w *. +DATA LIST LIST NOTABLE /x (F8.0) w (F8.0). BEGIN DATA. 1 8 2 15 @@ -182,7 +186,7 @@ ECHO 'P == 0.5; N1/N2 > 1' . NEW FILE. -DATA LIST LIST NOTABLE /x * w *. +DATA LIST LIST NOTABLE /x (F8.0) w (F8.0). BEGIN DATA. 1 12 2 6 @@ -197,7 +201,7 @@ ECHO 'P == 0.5; N1/N2 == 1' . NEW FILE. -DATA LIST LIST NOTABLE /x * w *. +DATA LIST LIST NOTABLE /x (F8.0) w (F8.0). BEGIN DATA. 1 10 2 10 @@ -221,84 +225,84 @@ perl -pi -e 's/^\s*$//g' $TEMPDIR/pspp.list diff -b $TEMPDIR/pspp.list - << EOF P < 0.5; N1/N2 < 1 1.1 NPAR TESTS. Binomial Test -+-+------#--------+--+--------------+----------+---------------------+ -| | #Category| N|Observed Prop.|Test Prop.|Exact Sig. (1-tailed)| -+-+------#--------+--+--------------+----------+---------------------+ -|x|Group1# 1.00| 6| .286| .300| .551| -| |Group2# 2.00|15| .714| | | -| |Total # |21| 1.00| | | -+-+------#--------+--+--------------+----------+---------------------+ ++-+------#--------+-----+--------------+----------+---------------------+ +| | #Category| N |Observed Prop.|Test Prop.|Exact Sig. (1-tailed)| ++-+------#--------+-----+--------------+----------+---------------------+ +|x|Group1# 1.00| 6.00| .286| .300| .551| +| |Group2# 2.00|15.00| .714| | | +| |Total # |21.00| 1.00| | | ++-+------#--------+-----+--------------+----------+---------------------+ P < 0.5; N1/N2 > 1 2.1 NPAR TESTS. Binomial Test +-+------#--------+--+--------------+----------+---------------------+ | | #Category| N|Observed Prop.|Test Prop.|Exact Sig. (1-tailed)| +-+------#--------+--+--------------+----------+---------------------+ -|x|Group1# 1.00| 7| .538| .400| .229| -| |Group2# 2.00| 6| .462| | | -| |Total # |13| 1.00| | | +|x|Group1# 1| 7| .538| .400| .229| +| |Group2# 2| 6| .462| | | +| |Total # |13| 1| | | +-+------#--------+--+--------------+----------+---------------------+ P < 0.5; N1/N2 = 1 3.1 NPAR TESTS. Binomial Test +-+------#--------+--+--------------+----------+---------------------+ | | #Category| N|Observed Prop.|Test Prop.|Exact Sig. (1-tailed)| +-+------#--------+--+--------------+----------+---------------------+ -|x|Group1# 1.00| 8| .500| .400| .284| -| |Group2# 2.00| 8| .500| | | -| |Total # |16| 1.00| | | +|x|Group1# 1| 8| .500| .400| .284| +| |Group2# 2| 8| .500| | | +| |Total # |16| 1| | | +-+------#--------+--+--------------+----------+---------------------+ P > 0.5; N1/N2 < 1 4.1 NPAR TESTS. Binomial Test +-+------#--------+--+--------------+----------+---------------------+ | | #Category| N|Observed Prop.|Test Prop.|Exact Sig. (1-tailed)| +-+------#--------+--+--------------+----------+---------------------+ -|x|Group1# 1.00|11| .478| .600| .164| -| |Group2# 2.00|12| .522| | | -| |Total # |23| 1.00| | | +|x|Group1# 1|11| .478| .600| .164| +| |Group2# 2|12| .522| | | +| |Total # |23| 1| | | +-+------#--------+--+--------------+----------+---------------------+ P > 0.5; N1/N2 > 1 5.1 NPAR TESTS. Binomial Test +-+------#--------+--+--------------+----------+---------------------+ | | #Category| N|Observed Prop.|Test Prop.|Exact Sig. (1-tailed)| +-+------#--------+--+--------------+----------+---------------------+ -|x|Group1# 1.00|11| .550| .600| .404| -| |Group2# 2.00| 9| .450| | | -| |Total # |20| 1.00| | | +|x|Group1# 1|11| .550| .600| .404| +| |Group2# 2| 9| .450| | | +| |Total # |20| 1| | | +-+------#--------+--+--------------+----------+---------------------+ P > 0.5; N1/N2 == 1 6.1 NPAR TESTS. Binomial Test +-+------#--------+--+--------------+----------+---------------------+ | | #Category| N|Observed Prop.|Test Prop.|Exact Sig. (1-tailed)| +-+------#--------+--+--------------+----------+---------------------+ -|x|Group1# 1.00|11| .500| .600| .228| -| |Group2# 2.00|11| .500| | | -| |Total # |22| 1.00| | | +|x|Group1# 1|11| .500| .600| .228| +| |Group2# 2|11| .500| | | +| |Total # |22| 1| | | +-+------#--------+--+--------------+----------+---------------------+ P == 0.5; N1/N2 < 1 7.1 NPAR TESTS. Binomial Test +-+------#--------+--+--------------+----------+---------------------+ | | #Category| N|Observed Prop.|Test Prop.|Exact Sig. (2-tailed)| +-+------#--------+--+--------------+----------+---------------------+ -|x|Group1# 1.00| 8| .348| .500| .210| -| |Group2# 2.00|15| .652| | | -| |Total # |23| 1.00| | | +|x|Group1# 1| 8| .348| .500| .210| +| |Group2# 2|15| .652| | | +| |Total # |23| 1| | | +-+------#--------+--+--------------+----------+---------------------+ P == 0.5; N1/N2 > 1 8.1 NPAR TESTS. Binomial Test +-+------#--------+--+--------------+----------+---------------------+ | | #Category| N|Observed Prop.|Test Prop.|Exact Sig. (2-tailed)| +-+------#--------+--+--------------+----------+---------------------+ -|x|Group1# 1.00|12| .667| .500| .238| -| |Group2# 2.00| 6| .333| | | -| |Total # |18| 1.00| | | +|x|Group1# 1|12| .667| .500| .238| +| |Group2# 2| 6| .333| | | +| |Total # |18| 1| | | +-+------#--------+--+--------------+----------+---------------------+ P == 0.5; N1/N2 == 1 9.1 NPAR TESTS. Binomial Test +-+------#--------+--+--------------+----------+---------------------+ | | #Category| N|Observed Prop.|Test Prop.|Exact Sig. (2-tailed)| +-+------#--------+--+--------------+----------+---------------------+ -|x|Group1# 1.00|10| .500| .500| 1.000| -| |Group2# 2.00|10| .500| | | -| |Total # |20| 1.00| | | +|x|Group1# 1|10| .500| .500| 1.000| +| |Group2# 2|10| .500| | | +| |Total # |20| 1| | | +-+------#--------+--+--------------+----------+---------------------+ EOF if [ $? -ne 0 ] ; then fail ; fi diff --git a/tests/command/npar-chisquare.sh b/tests/command/npar-chisquare.sh index 1df381b1..33e2311b 100755 --- a/tests/command/npar-chisquare.sh +++ b/tests/command/npar-chisquare.sh @@ -102,69 +102,69 @@ diff -b $TEMPDIR/pspp.list - << EOF +--------#----------+----------+--------+ | #Observed N|Expected N|Residual| +--------#----------+----------+--------+ -| 1.00# 3| 2.33| .67| -| 2.00# 3| 2.33| .67| -| 3.10# 4| 2.33| 1.67| -| 3.20# 1| 2.33| -1.33| -| 4.00# 2| 2.33| -.33| -| 5.00# 1| 2.33| -1.33| -|Total # 14| | | +| 1.00# 3.00| 2.33| .67| +| 2.00# 3.00| 2.33| .67| +| 3.10# 4.00| 2.33| 1.67| +| 3.20# 1.00| 2.33| -1.33| +| 4.00# 2.00| 2.33| -.33| +| 5.00# 1.00| 2.33| -1.33| +|Total # 14.00| | | +--------#----------+----------+--------+ 1.2 NPAR TESTS. y +--------#----------+----------+--------+ | #Observed N|Expected N|Residual| +--------#----------+----------+--------+ -| 1.00# 7| 3.50| 3.50| -| 2.00# 4| 3.50| .50| -| 3.00# 1| 3.50| -2.50| -| 4.00# 2| 3.50| -1.50| -|Total # 14| | | +| 1.00# 7.00| 3.50| 3.50| +| 2.00# 4.00| 3.50| .50| +| 3.00# 1.00| 3.50| -2.50| +| 4.00# 2.00| 3.50| -1.50| +|Total # 14.00| | | +--------#----------+----------+--------+ 1.3 NPAR TESTS. Test Statistics -+-----------#-----+-----+ -| # x | y | -+-----------#-----+-----+ -|Chi-Square #3.143|6.000| -|df # 5| 3| -|Asymp. Sig.# .678| .112| -+-----------#-----+-----+ ++-----------#----+----+ +| # x | y | ++-----------#----+----+ +|Chi-Square #3.14|6.00| +|df # 5| 3| +|Asymp. Sig.# .68| .11| ++-----------#----+----+ 2.1 NPAR TESTS. y +--------#----------+----------+--------+ | #Observed N|Expected N|Residual| +--------#----------+----------+--------+ -| 1.00# 7| 2.63| 4.38| -| 2.00# 4| 3.50| .50| -| 3.00# 1| 4.38| -3.38| -| 4.00# 2| 3.50| -1.50| -|Total # 14| | | +| 1.00# 7.00| 2.63| 4.38| +| 2.00# 4.00| 3.50| .50| +| 3.00# 1.00| 4.38| -3.38| +| 4.00# 2.00| 3.50| -1.50| +|Total # 14.00| | | +--------#----------+----------+--------+ 2.2 NPAR TESTS. Test Statistics -+-----------#------+ -| # y | -+-----------#------+ -|Chi-Square #10.610| -|df # 3| -|Asymp. Sig.# .014| -+-----------#------+ ++-----------#-----+ +| # y | ++-----------#-----+ +|Chi-Square #10.61| +|df # 3| +|Asymp. Sig.# .01| ++-----------#-----+ 3.1 NPAR TESTS. Frequencies +-----#---------------------------------------#---------------------------------------+ | # x # y | | #--------+----------+----------+--------#--------+----------+----------+--------+ | #Category|Observed N|Expected N|Residual#Category|Observed N|Expected N|Residual| +-----#--------+----------+----------+--------#--------+----------+----------+--------+ -|1 # 2.00| 3| 3.16| -.16# 2.00| 4| 2.21| 1.79| -|2 # 3.00| 5| 5.26| -.26# 3.00| 1| 3.68| -2.68| -|3 # 4.00| 2| 1.58| .42# 4.00| 2| 1.11| .89| -|Total# | 10| | # | 7| | | +|1 # 2.00| 3.00| 3.16| -.16# 2.00| 4.00| 2.21| 1.79| +|2 # 3.00| 5.00| 5.26| -.26# 3.00| 1.00| 3.68| -2.68| +|3 # 4.00| 2.00| 1.58| .42# 4.00| 2.00| 1.11| .89| +|Total# | 10.00| | # | 7.00| | | +-----#--------+----------+----------+--------#--------+----------+----------+--------+ 3.2 NPAR TESTS. Test Statistics -+-----------#----+-----+ -| # x | y | -+-----------#----+-----+ -|Chi-Square #.133|4.129| -|df # 2| 2| -|Asymp. Sig.#.936| .127| -+-----------#----+-----+ ++-----------#---+----+ +| # x | y | ++-----------#---+----+ +|Chi-Square #.13|4.13| +|df # 2| 2| +|Asymp. Sig.#.94| .13| ++-----------#---+----+ EOF if [ $? -ne 0 ] ; then fail ; fi @@ -245,32 +245,32 @@ diff -b $TEMPDIR/pspp.list - <=1.514|11|9.00| 3.821| 1.152# -# <1.514 |11|8.00| 2.864| .863# +#DEP >=1.514|11|9.00| 3.82| 1.15# +# <1.514 |11|8.00| 2.86| .86# #===========#==#====#==============#========# 2.2 T-TEST. Independent Samples Test -#==============================#=========#===============================================================================# -# # Levene's| t-test for Equality of Means # -# #----+----+-----+------+---------------+---------------+---------------------+------------# -# # | | | | | | | 95% # -# # | | | | | | +------+-----# -# # F |Sig.| t | df |Sig. (2-tailed)|Mean Difference|Std. Error Difference| Lower|Upper# -#==============================#====#====#=====#======#===============#===============#=====================#======#=====# -#DEPEqual variances assumed #.172|.683|-.695| 20| .495| -1.000| 1.440|-4.003|2.003# -# Equal variances not assumed# | |-.695|18.539| .496| -1.000| 1.440|-4.018|2.018# -#==============================#====#====#=====#======#===============#===============#=====================#======#=====# +#==============================#========#============================================================================# +# #Levene's| t-test for Equality of Means # +# #---+----+----+-----+---------------+---------------+---------------------+-----------# +# # | | | | | | | 95% # +# # | | | | | | +-----+-----# +# # F |Sig.| t | df |Sig. (2-tailed)|Mean Difference|Std. Error Difference|Lower|Upper# +#==============================#===#====#====#=====#===============#===============#=====================#=====#=====# +#DEPEqual variances assumed #.17| .68|-.69|20.00| .50| -1.00| 1.44|-4.00| 2.00# +# Equal variances not assumed# | |-.69|18.54| .50| -1.00| 1.44|-4.02| 2.02# +#==============================#===#====#====#=====#===============#===============#=====================#=====#=====# EOF if [ $? -ne 0 ] ; then fail ; fi diff --git a/tests/command/t-test-1s.sh b/tests/command/t-test-1s.sh index 4019865b..2b45701c 100755 --- a/tests/command/t-test-1s.sh +++ b/tests/command/t-test-1s.sh @@ -91,18 +91,18 @@ diff -b $TEMPDIR/pspp.list - < $TESTFILE << EOF +SET FORMAT F8.3. data list file='$top_srcdir/tests/weighting.data'/AVAR 1-5 BVAR 6-10. weight by BVAR. @@ -86,87 +87,87 @@ diff -b $TEMPDIR/pspp.list - < $TEMPDIR/descript.stat <