X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Fwilcoxon.c;h=c0329f6c01e5277e33304377d7ed07c56f99dca5;hb=7fbfc32fc3c636959b0a25b3e76609f86519e84a;hp=2a05f5d995edd99517db13c8c832918e40d3b430;hpb=a992bf1121d3e1eef76fd6184b95fe079bb91558;p=pspp-builds.git diff --git a/src/language/stats/wilcoxon.c b/src/language/stats/wilcoxon.c index 2a05f5d9..c0329f6c 100644 --- a/src/language/stats/wilcoxon.c +++ b/src/language/stats/wilcoxon.c @@ -28,14 +28,12 @@ #include #include #include -#include +#include #include #include #include #include - -static double timed_wilcoxon_significance (double w, long int n, double timer); - +#include static double append_difference (const struct ccase *c, casenumber n UNUSED, void *aux) @@ -46,7 +44,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 *, @@ -127,6 +126,7 @@ wilcoxon_execute (const struct dataset *ds, /* Central point values should be dropped */ ws[i].n_zeros += w; + case_unref (output); continue; } @@ -181,7 +181,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 ) @@ -200,9 +200,15 @@ 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); @@ -247,24 +253,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); } @@ -280,7 +286,7 @@ static void show_tests_box (const struct wilcoxon_state *ws, const struct two_sample_test *t2s, bool exact, - double timer + double timer UNUSED ) { size_t i; @@ -334,27 +340,23 @@ 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) { - double p = - timed_wilcoxon_significance (ws[i].positives.sum, - n, - timer ); - - if ( p == SYSMIS) + double p = LevelOfSignificanceWXMPSR (ws[i].positives.sum, n); + if (p < 0) { - msg (MW, _("Exact significance was not calculated after %.2f minutes. Skipping test."), timer); + msg (MW, ("Too many pairs to calculate exact significance.")); } 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); } } } @@ -365,48 +367,3 @@ show_tests_box (const struct wilcoxon_state *ws, tab_submit (table); } - - - -#include - -static sigjmp_buf env; - -static void -give_up_callback (int signal UNUSED) -{ - siglongjmp (env, 1); -} - -static double -timed_wilcoxon_significance (double w, long int n, double timer) -{ - double p = SYSMIS; - - sigset_t set; - - struct sigaction timeout_action; - struct sigaction old_action; - - if (timer <= 0 ) - return LevelOfSignificanceWXMPSR (w, n); - - sigemptyset (&set); - - timeout_action.sa_mask = set; - timeout_action.sa_flags = 0; - - timeout_action.sa_handler = give_up_callback; - - if ( 0 == sigsetjmp (env, 1)) - { - sigaction (SIGALRM, &timeout_action, &old_action); - alarm (timer * 60.0); - - p = LevelOfSignificanceWXMPSR (w, n); - } - - sigaction (SIGALRM, &old_action, NULL); - - return p; -}