X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fmath%2Flevene.c;h=a325138b14517198eeb71e8204c60472a8ba26c3;hb=a8915a78655ea9ff6242ba6ba4ed4d83253a323d;hp=f30d51dfee8d307a38992b7ade14217deb0da0de;hpb=42489b63e0b4bec2e20c2f55c9791234f7b41764;p=pspp diff --git a/src/math/levene.c b/src/math/levene.c index f30d51dfee..a325138b14 100644 --- a/src/math/levene.c +++ b/src/math/levene.c @@ -2,7 +2,6 @@ Computes Levene test statistic. Copyright (C) 2004 Free Software Foundation, Inc. - Written by John Darrington This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as @@ -30,6 +29,7 @@ #include #include #include +#include #include #include #include "group.h" @@ -65,37 +65,38 @@ struct levene_info struct t_test_proc **group_stats; /* The independent variable */ - struct variable *v_indep; + const struct variable *v_indep; /* Number of dependent variables */ size_t n_dep; /* The dependent variables */ - struct variable **v_dep; + const struct variable **v_dep; - /* How to treat missing values */ - enum lev_missing missing; - - /* Function to test for missing values */ - is_missing_func *is_missing; + /* Filter for missing values */ + struct casefilter *filter; }; /* First pass */ static void levene_precalc (const struct levene_info *l); -static int levene_calc (const struct ccase *, void *); +static int levene_calc (const struct dictionary *dict, const struct ccase *, + const struct levene_info *l); static void levene_postcalc (void *); /* Second pass */ -static void levene2_precalc (void *); -static int levene2_calc (const struct ccase *, void *); +static void levene2_precalc (struct levene_info *l); +static int levene2_calc (const struct dictionary *, const struct ccase *, + struct levene_info *l); static void levene2_postcalc (void *); void -levene(const struct casefile *cf, - struct variable *v_indep, size_t n_dep, struct variable **v_dep, - enum lev_missing missing, is_missing_func value_is_missing) +levene(const struct dictionary *dict, + const struct casefile *cf, + const struct variable *v_indep, size_t n_dep, + const struct variable **v_dep, + struct casefilter *filter) { struct casereader *r; struct ccase c; @@ -104,31 +105,28 @@ levene(const struct casefile *cf, l.n_dep = n_dep; l.v_indep = v_indep; l.v_dep = v_dep; - l.missing = missing; - l.is_missing = value_is_missing; - + l.filter = filter; - levene_precalc(&l); - for(r = casefile_get_reader (cf); + levene_precalc (&l); + for(r = casefile_get_reader (cf, filter); casereader_read (r, &c) ; case_destroy (&c)) { - levene_calc(&c,&l); + levene_calc (dict, &c, &l); } casereader_destroy (r); - levene_postcalc(&l); + levene_postcalc (&l); levene2_precalc(&l); - for(r = casefile_get_reader (cf); + for(r = casefile_get_reader (cf, filter); casereader_read (r, &c) ; case_destroy (&c)) { - levene2_calc(&c,&l); + levene2_calc (dict, &c,&l); } casereader_destroy (r); - levene2_postcalc(&l); - + levene2_postcalc (&l); } /* Internal variables used in calculating the Levene statistic */ @@ -162,7 +160,7 @@ levene_precalc (const struct levene_info *l) for(i = 0; i < l->n_dep ; ++i ) { - struct variable *var = l->v_dep[i]; + const struct variable *var = l->v_dep[i]; struct group_proc *gp = group_proc_get (var); struct group_statistics *gs; struct hsh_iterator hi; @@ -184,39 +182,23 @@ levene_precalc (const struct levene_info *l) } static int -levene_calc (const struct ccase *c, void *_l) +levene_calc (const struct dictionary *dict, const struct ccase *c, + const struct levene_info *l) { size_t i; bool warn = false; - struct levene_info *l = (struct levene_info *) _l; - const union value *gv = case_data (c, l->v_indep->fv); + const union value *gv = case_data (c, l->v_indep); struct group_statistics key; - double weight = dict_get_case_weight (dataset_dict (current_dataset), c, &warn); - - /* Skip the entire case if /MISSING=LISTWISE is set */ - if ( l->missing == LEV_LISTWISE ) - { - for (i = 0; i < l->n_dep; ++i) - { - struct variable *v = l->v_dep[i]; - const union value *val = case_data (c, v->fv); + double weight = dict_get_case_weight (dict, c, &warn); - if (l->is_missing (&v->miss, val) ) - { - return 0; - } - } - } - - key.id = *gv; for (i = 0; i < l->n_dep; ++i) { - struct variable *var = l->v_dep[i]; + const struct variable *var = l->v_dep[i]; struct group_proc *gp = group_proc_get (var); double levene_z; - const union value *v = case_data (c, var->fv); + const union value *v = case_data (c, var); struct group_statistics *gs; gs = hsh_find(gp->group_hash,(void *) &key ); @@ -224,7 +206,7 @@ levene_calc (const struct ccase *c, void *_l) if ( 0 == gs ) continue ; - if ( ! l->is_missing(&var->miss, v)) + if ( ! casefilter_variable_missing (l->filter, c, var)) { levene_z= fabs(v->f - gs->mean); lz[i].grand_total += levene_z * weight; @@ -232,7 +214,6 @@ levene_calc (const struct ccase *c, void *_l) gs->lz_total += levene_z * weight; } - } return 0; } @@ -255,25 +236,26 @@ levene_postcalc (void *_l) } + /* The denominator for the expression for the Levene */ -static double *lz_denominator; +static double *lz_denominator = 0; static void -levene2_precalc (void *_l) +levene2_precalc (struct levene_info *l) { size_t v; - struct levene_info *l = (struct levene_info *) _l; - lz_denominator = xnmalloc (l->n_dep, sizeof *lz_denominator); /* This stuff could go in the first post calc . . . */ - for (v = 0; v < l->n_dep; ++v) + for (v = 0; + v < l->n_dep; + ++v) { struct hsh_iterator hi; struct group_statistics *g; - struct variable *var = l->v_dep[v] ; + const struct variable *var = l->v_dep[v] ; struct hsh_table *hash = group_proc_get (var)->group_hash; @@ -288,40 +270,24 @@ levene2_precalc (void *_l) } static int -levene2_calc (const struct ccase *c, void *_l) +levene2_calc (const struct dictionary *dict, const struct ccase *c, + struct levene_info *l) { size_t i; bool warn = false; - struct levene_info *l = (struct levene_info *) _l; - - double weight = dict_get_case_weight (dataset_dict (current_dataset), c, &warn); + double weight = dict_get_case_weight (dict, c, &warn); - const union value *gv = case_data (c, l->v_indep->fv); + const union value *gv = case_data (c, l->v_indep); struct group_statistics key; - /* Skip the entire case if /MISSING=LISTWISE is set */ - if ( l->missing == LEV_LISTWISE ) - { - for (i = 0; i < l->n_dep; ++i) - { - struct variable *v = l->v_dep[i]; - const union value *val = case_data (c, v->fv); - - if (l->is_missing(&v->miss, val) ) - { - return 0; - } - } - } - key.id = *gv; for (i = 0; i < l->n_dep; ++i) { double levene_z; - struct variable *var = l->v_dep[i] ; - const union value *v = case_data (c, var->fv); + const struct variable *var = l->v_dep[i] ; + const union value *v = case_data (c, var); struct group_statistics *gs; gs = hsh_find(group_proc_get (var)->group_hash,(void *) &key ); @@ -329,10 +295,11 @@ levene2_calc (const struct ccase *c, void *_l) if ( 0 == gs ) continue; - if ( ! l->is_missing (&var->miss, v) ) + if ( ! casefilter_variable_missing (l->filter, c, var)) + { levene_z = fabs(v->f - gs->mean); - lz_denominator[i] += weight * pow2(levene_z - gs->lz_mean); + lz_denominator[i] += weight * pow2 (levene_z - gs->lz_mean); } } @@ -353,7 +320,7 @@ levene2_postcalc (void *_l) struct hsh_iterator hi; struct group_statistics *g; - struct variable *var = l->v_dep[v] ; + const struct variable *var = l->v_dep[v] ; struct group_proc *gp = group_proc_get (var); struct hsh_table *hash = gp->group_hash;