projects
/
pspp
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Made BSD diff compatible
[pspp]
/
src
/
levene.c
diff --git
a/src/levene.c
b/src/levene.c
index 4659f199ac018f98bd46886c2ad61d917ef24a88..7877c7ec6aa5fc039efb7fbedff900096977c8a8 100644
(file)
--- a/
src/levene.c
+++ b/
src/levene.c
@@
-16,14
+16,16
@@
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
- Foundation, Inc., 5
9 Temple Place - Suite 330
, Boston, MA
- 0211
1-1307
, USA. */
+ Foundation, Inc., 5
1 Franklin Street, Fifth Floor
, Boston, MA
+ 0211
0-1301
, USA. */
#include <config.h>
#include "levene.h"
#include "error.h"
#include "case.h"
#include "casefile.h"
#include <config.h>
#include "levene.h"
#include "error.h"
#include "case.h"
#include "casefile.h"
+#include "dictionary.h"
+#include "group_proc.h"
#include "hash.h"
#include "str.h"
#include "var.h"
#include "hash.h"
#include "str.h"
#include "var.h"
@@
-75,8
+77,7
@@
struct levene_info
enum lev_missing missing;
/* Function to test for missing values */
enum lev_missing missing;
/* Function to test for missing values */
- is_missing_func is_missing;
-
+ is_missing_func *is_missing;
};
/* First pass */
};
/* First pass */
@@
-159,13
+160,25
@@
levene_precalc (const struct levene_info *l)
lz = xmalloc (sizeof (struct lz_stats ) * l->n_dep ) ;
lz = xmalloc (sizeof (struct lz_stats ) * l->n_dep ) ;
- for(i
=
0; i < l->n_dep ; ++i )
+ for(i
=
0; i < l->n_dep ; ++i )
{
{
- struct variable *v = l->v_dep[i];
+ struct variable *var = l->v_dep[i];
+ struct group_proc *gp = group_proc_get (var);
+ struct group_statistics *gs;
+ struct hsh_iterator hi;
lz[i].grand_total = 0;
lz[i].total_n = 0;
lz[i].grand_total = 0;
lz[i].total_n = 0;
- lz[i].n_groups = v->p.grp_data.n_groups ;
+ lz[i].n_groups = gp->n_groups ;
+
+
+ for ( gs = hsh_first(gp->group_hash, &hi);
+ gs != 0;
+ gs = hsh_next(gp->group_hash, &hi))
+ {
+ gs->lz_total = 0;
+ }
+
}
}
}
}
@@
-188,7
+201,7
@@
levene_calc (const struct ccase *c, void *_l)
struct variable *v = l->v_dep[i];
const union value *val = case_data (c, v->fv);
struct variable *v = l->v_dep[i];
const union value *val = case_data (c, v->fv);
- if (l->is_missing
(val,v
) )
+ if (l->is_missing
(&v->miss, val
) )
{
return 0;
}
{
return 0;
}
@@
-201,16
+214,17
@@
levene_calc (const struct ccase *c, void *_l)
for (i = 0; i < l->n_dep; ++i)
{
struct variable *var = l->v_dep[i];
for (i = 0; i < l->n_dep; ++i)
{
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);
struct group_statistics *gs;
double levene_z;
const union value *v = case_data (c, var->fv);
struct group_statistics *gs;
- gs = hsh_find(
var->p.grp_data.
group_hash,(void *) &key );
+ gs = hsh_find(
gp->
group_hash,(void *) &key );
if ( 0 == gs )
continue ;
if ( 0 == gs )
continue ;
- if ( ! l->is_missing(
v,var
))
+ if ( ! l->is_missing(
&var->miss, v
))
{
levene_z= fabs(v->f - gs->mean);
lz[i].grand_total += levene_z * weight;
{
levene_z= fabs(v->f - gs->mean);
lz[i].grand_total += levene_z * weight;
@@
-218,6
+232,7
@@
levene_calc (const struct ccase *c, void *_l)
gs->lz_total += levene_z * weight;
}
gs->lz_total += levene_z * weight;
}
+
}
return 0;
}
}
return 0;
}
@@
-232,10
+247,11
@@
levene_postcalc (void *_l)
for (v = 0; v < l->n_dep; ++v)
{
for (v = 0; v < l->n_dep; ++v)
{
+ /* This is Z_LL */
lz[v].grand_mean = lz[v].grand_total / lz[v].total_n ;
lz[v].grand_mean = lz[v].grand_total / lz[v].total_n ;
-
}
}
+
}
}
@@
-258,14
+274,14
@@
levene2_precalc (void *_l)
struct group_statistics *g;
struct variable *var = l->v_dep[v] ;
struct group_statistics *g;
struct variable *var = l->v_dep[v] ;
- struct hsh_table *hash =
var->p.grp_data.
group_hash;
+ struct hsh_table *hash =
group_proc_get (var)->
group_hash;
for(g = (struct group_statistics *) hsh_first(hash,&hi);
g != 0 ;
g = (struct group_statistics *) hsh_next(hash,&hi) )
{
for(g = (struct group_statistics *) hsh_first(hash,&hi);
g != 0 ;
g = (struct group_statistics *) hsh_next(hash,&hi) )
{
- g->lz_mean = g->lz_total
/
g->n ;
+ g->lz_mean = g->lz_total
/
g->n ;
}
lz_denominator[v] = 0;
}
}
lz_denominator[v] = 0;
}
@@
-292,7
+308,7
@@
levene2_calc (const struct ccase *c, void *_l)
struct variable *v = l->v_dep[i];
const union value *val = case_data (c, v->fv);
struct variable *v = l->v_dep[i];
const union value *val = case_data (c, v->fv);
- if (l->is_missing(
val,v
) )
+ if (l->is_missing(
&v->miss, val
) )
{
return 0;
}
{
return 0;
}
@@
-308,12
+324,12
@@
levene2_calc (const struct ccase *c, void *_l)
const union value *v = case_data (c, var->fv);
struct group_statistics *gs;
const union value *v = case_data (c, var->fv);
struct group_statistics *gs;
- gs = hsh_find(
var->p.grp_data.
group_hash,(void *) &key );
+ gs = hsh_find(
group_proc_get (var)->
group_hash,(void *) &key );
if ( 0 == gs )
continue;
if ( 0 == gs )
continue;
- if ( ! l->is_missing
(v,var
) )
+ if ( ! l->is_missing
(&var->miss, v
) )
{
levene_z = fabs(v->f - gs->mean);
lz_denominator[i] += weight * pow2(levene_z - gs->lz_mean);
{
levene_z = fabs(v->f - gs->mean);
lz_denominator[i] += weight * pow2(levene_z - gs->lz_mean);
@@
-338,23
+354,21
@@
levene2_postcalc (void *_l)
struct group_statistics *g;
struct variable *var = l->v_dep[v] ;
struct group_statistics *g;
struct variable *var = l->v_dep[v] ;
- struct hsh_table *hash = var->p.grp_data.group_hash;
+ struct group_proc *gp = group_proc_get (var);
+ struct hsh_table *hash = gp->group_hash;
for(g = (struct group_statistics *) hsh_first(hash,&hi);
g != 0 ;
g = (struct group_statistics *) hsh_next(hash,&hi) )
{
for(g = (struct group_statistics *) hsh_first(hash,&hi);
g != 0 ;
g = (struct group_statistics *) hsh_next(hash,&hi) )
{
-
lz_numerator += g->n * pow2(g->lz_mean - lz[v].grand_mean );
lz_numerator += g->n * pow2(g->lz_mean - lz[v].grand_mean );
-
-
}
}
- lz_numerator *= ( l->v_dep[v]->p.grp_data.ugs.n -
- l->v_dep[v]->p.grp_data.n_groups );
+ lz_numerator *= ( gp->ugs.n - gp->n_groups );
+
+ lz_denominator[v] *= (gp->n_groups - 1);
+
+ gp->levene = lz_numerator / lz_denominator[v] ;
- lz_denominator[v] /= (l->v_dep[v]->p.grp_data.n_groups - 1);
-
- l->v_dep[v]->p.grp_data.levene = lz_numerator/lz_denominator[v] ;
}
/* Now clear up after ourselves */
}
/* Now clear up after ourselves */