X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Fmann-whitney.c;h=cc82312ed3934a5ffb0924a69eb126d53b8b3b41;hb=c875597832d56353461bafd46e268f0ba5fbb5da;hp=81fe033af52ac9bb4cb8b995db7d6ddc03efae27;hpb=0df9cdd3df66caf4353128feff3008289cda8115;p=pspp diff --git a/src/language/stats/mann-whitney.c b/src/language/stats/mann-whitney.c index 81fe033af5..cc82312ed3 100644 --- a/src/language/stats/mann-whitney.c +++ b/src/language/stats/mann-whitney.c @@ -54,6 +54,26 @@ static void show_ranks_box (const struct n_sample_test *nst, const struct mw *mw static void show_statistics_box (const struct n_sample_test *nst, const struct mw *mw, bool exact); + +static bool +belongs_to_test (const struct ccase *c, void *aux) +{ + const struct n_sample_test *nst = aux; + + const union value *group = case_data (c, nst->indep_var); + const size_t group_var_width = var_get_width (nst->indep_var); + + if ( value_equal (group, &nst->val1, group_var_width)) + return true; + + if ( value_equal (group, &nst->val2, group_var_width)) + return true; + + return false; +} + + + void mann_whitney_execute (const struct dataset *ds, struct casereader *input, @@ -79,9 +99,19 @@ mann_whitney_execute (const struct dataset *ds, struct casereader *rr; struct ccase *c; const struct variable *var = nst->vars[i]; - - struct casereader *reader = - sort_execute_1var (casereader_clone (input), var); + + struct casereader *reader = + casereader_create_filter_func (casereader_clone (input), + belongs_to_test, + NULL, + CONST_CAST (struct n_sample_test *, nst), + NULL); + + reader = casereader_create_filter_missing (reader, &var, 1, + exclude, + NULL, NULL); + + reader = sort_execute_1var (reader, var); rr = casereader_create_append_rank (reader, var, dict_get_weight (dict), @@ -95,9 +125,6 @@ mann_whitney_execute (const struct dataset *ds, const size_t group_var_width = var_get_width (nst->indep_var); const double rank = case_data_idx (c, rank_idx)->f; - if ( var_is_value_missing (var, val, exclude)) - continue; - if ( value_equal (group, &nst->val1, group_var_width)) { mw[i].rank_sum[0] += rank;