X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Fwilcoxon.c;h=37d2b191ccfe323804733d69d0d7c7a98f9260af;hb=5c3291dc396b795696e94f47780308fd7ace6fc4;hp=1bdcc06dc252851f93c7172a13c35fdfaba62367;hpb=9a331fe64eb814ae5c1322e21717a04fb254bf65;p=pspp-builds.git diff --git a/src/language/stats/wilcoxon.c b/src/language/stats/wilcoxon.c index 1bdcc06d..37d2b191 100644 --- a/src/language/stats/wilcoxon.c +++ b/src/language/stats/wilcoxon.c @@ -17,22 +17,33 @@ #include + #include "wilcoxon.h" -#include + +#include +#include +#include +#include + #include #include +#include +#include +#include #include -#include +#include +#include +#include #include -#include -#include -#include -#include +#include +#include #include -#include -#include +#include #include -#include +#include + +#include "minmax.h" +#include "xalloc.h" static double append_difference (const struct ccase *c, casenumber n UNUSED, void *aux) @@ -43,7 +54,8 @@ append_difference (const struct ccase *c, casenumber n UNUSED, void *aux) } static void show_ranks_box (const struct wilcoxon_state *, - const struct two_sample_test *); + const struct two_sample_test *, + const struct dictionary *); static void show_tests_box (const struct wilcoxon_state *, const struct two_sample_test *, @@ -77,10 +89,17 @@ wilcoxon_execute (const struct dataset *ds, struct wilcoxon_state *ws = xcalloc (sizeof (*ws), t2s->n_pairs); const struct variable *weight = dict_get_weight (dict); struct variable *weightx = var_create_internal (WEIGHT_IDX); + struct caseproto *proto; input = casereader_create_filter_weight (input, dict, &warn, NULL); + proto = caseproto_create (); + proto = caseproto_add_width (proto, 0); + proto = caseproto_add_width (proto, 0); + if (weight != NULL) + proto = caseproto_add_width (proto, 0); + for (i = 0 ; i < t2s->n_pairs; ++i ) { struct casereader *r = casereader_clone (input); @@ -89,8 +108,6 @@ wilcoxon_execute (const struct dataset *ds, struct subcase ordering; variable_pair *vp = &t2s->pairs[i]; - const int reader_width = weight ? 3 : 2; - ws[i].sign = var_create_internal (0); ws[i].absdiff = var_create_internal (1); @@ -99,12 +116,12 @@ wilcoxon_execute (const struct dataset *ds, NULL, NULL); subcase_init_var (&ordering, ws[i].absdiff, SC_ASCEND); - writer = sort_create_writer (&ordering, reader_width); + writer = sort_create_writer (&ordering, proto); subcase_destroy (&ordering); for (; (c = casereader_read (r)) != NULL; case_unref (c)) { - struct ccase *output = case_create (reader_width); + struct ccase *output = case_create (proto); double d = append_difference (c, 0, vp); if (d > 0) @@ -138,6 +155,7 @@ wilcoxon_execute (const struct dataset *ds, casereader_destroy (r); ws[i].reader = casewriter_make_reader (writer); } + caseproto_unref (proto); for (i = 0 ; i < t2s->n_pairs; ++i ) { @@ -179,7 +197,7 @@ wilcoxon_execute (const struct dataset *ds, var_destroy (weightx); - show_ranks_box (ws, t2s); + show_ranks_box (ws, t2s, dict); show_tests_box (ws, t2s, exact, timer); for (i = 0 ; i < t2s->n_pairs; ++i ) @@ -198,12 +216,18 @@ wilcoxon_execute (const struct dataset *ds, #define _(msgid) gettext (msgid) static void -show_ranks_box (const struct wilcoxon_state *ws, const struct two_sample_test *t2s) +show_ranks_box (const struct wilcoxon_state *ws, + const struct two_sample_test *t2s, + const struct dictionary *dict) { size_t i; + + const struct variable *wv = dict_get_weight (dict); + const struct fmt_spec *wfmt = wv ? var_get_print_format (wv) : & F_8_0; + struct tab_table *table = tab_create (5, 1 + 4 * t2s->n_pairs, 0); - tab_dim (table, tab_natural_dimensions); + tab_dim (table, tab_natural_dimensions, NULL); tab_title (table, _("Ranks")); @@ -245,24 +269,24 @@ show_ranks_box (const struct wilcoxon_state *ws, const struct two_sample_test *t /* N */ - tab_float (table, 2, 1 + i * 4, TAB_RIGHT, ws[i].negatives.n, 8, 0); - tab_float (table, 2, 2 + i * 4, TAB_RIGHT, ws[i].positives.n, 8, 0); - tab_float (table, 2, 3 + i * 4, TAB_RIGHT, ws[i].n_zeros, 8, 0); + tab_double (table, 2, 1 + i * 4, TAB_RIGHT, ws[i].negatives.n, wfmt); + tab_double (table, 2, 2 + i * 4, TAB_RIGHT, ws[i].positives.n, wfmt); + tab_double (table, 2, 3 + i * 4, TAB_RIGHT, ws[i].n_zeros, wfmt); - tab_float (table, 2, 4 + i * 4, TAB_RIGHT, - ws[i].n_zeros + ws[i].positives.n + ws[i].negatives.n, 8, 0); + tab_double (table, 2, 4 + i * 4, TAB_RIGHT, + ws[i].n_zeros + ws[i].positives.n + ws[i].negatives.n, wfmt); /* Sums */ - tab_float (table, 4, 1 + i * 4, TAB_RIGHT, ws[i].negatives.sum, 8, 2); - tab_float (table, 4, 2 + i * 4, TAB_RIGHT, ws[i].positives.sum, 8, 2); + tab_double (table, 4, 1 + i * 4, TAB_RIGHT, ws[i].negatives.sum, NULL); + tab_double (table, 4, 2 + i * 4, TAB_RIGHT, ws[i].positives.sum, NULL); /* Means */ - tab_float (table, 3, 1 + i * 4, TAB_RIGHT, - ws[i].negatives.sum / (double) ws[i].negatives.n, 8, 2); + tab_double (table, 3, 1 + i * 4, TAB_RIGHT, + ws[i].negatives.sum / (double) ws[i].negatives.n, NULL); - tab_float (table, 3, 2 + i * 4, TAB_RIGHT, - ws[i].positives.sum / (double) ws[i].positives.n, 8, 2); + tab_double (table, 3, 2 + i * 4, TAB_RIGHT, + ws[i].positives.sum / (double) ws[i].positives.n, NULL); } @@ -284,7 +308,7 @@ show_tests_box (const struct wilcoxon_state *ws, size_t i; struct tab_table *table = tab_create (1 + t2s->n_pairs, exact ? 5 : 3, 0); - tab_dim (table, tab_natural_dimensions); + tab_dim (table, tab_natural_dimensions, NULL); tab_title (table, _("Test Statistics")); @@ -332,11 +356,11 @@ show_tests_box (const struct wilcoxon_state *ws, z /= sqrt (n * (n + 1) * (2*n + 1)/24.0 - ws[i].tiebreaker / 48.0); - tab_float (table, 1 + i, 1, TAB_RIGHT, z, 8, 3); + tab_double (table, 1 + i, 1, TAB_RIGHT, z, NULL); - tab_float (table, 1 + i, 2, TAB_RIGHT, + tab_double (table, 1 + i, 2, TAB_RIGHT, 2.0 * gsl_cdf_ugaussian_P (z), - 8, 3); + NULL); if (exact) { @@ -347,8 +371,8 @@ show_tests_box (const struct wilcoxon_state *ws, } else { - tab_float (table, 1 + i, 3, TAB_RIGHT, p, 8, 3); - tab_float (table, 1 + i, 4, TAB_RIGHT, p / 2.0, 8, 3); + tab_double (table, 1 + i, 3, TAB_RIGHT, p, NULL); + tab_double (table, 1 + i, 4, TAB_RIGHT, p / 2.0, NULL); } } }