From: John Darrington Date: Sat, 31 Oct 2009 07:42:25 +0000 (+0100) Subject: Drop first category of each variable from covariance matrix. X-Git-Tag: lenny-x64-build51~1 X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?p=pspp-builds.git;a=commitdiff_plain;h=a741cf4e8348e478ec5e8658cebeb80dc0376b1a Drop first category of each variable from covariance matrix. Apparently it's not appropriate for the covariance matrix to have a row/column for every categorical value. One value per categorical variable should be excluded. This change drops the first category encountered. --- diff --git a/src/math/categoricals.c b/src/math/categoricals.c index b7e51751..5c96c40c 100644 --- a/src/math/categoricals.c +++ b/src/math/categoricals.c @@ -145,6 +145,12 @@ categoricals_dump (const struct categoricals *cat) printf ("Number of categorical variables: %d\n", cat->n_vp); printf ("Number of non-empty categorical variables: %d\n", cat->n_vars); printf ("Total number of categories: %d\n", cat->n_cats_total); + + printf ("\nReverse variable map:\n"); + + for (v = 0 ; v < cat->n_cats_total - cat->n_vars; ++v) + printf ("%d ", cat->reverse_variable_map[v]); + printf ("\n"); } @@ -271,7 +277,9 @@ categoricals_done (struct categoricals *cat) */ int v; int idx = 0; - cat->reverse_variable_map = pool_calloc (cat->pool, cat->n_cats_total, sizeof *cat->reverse_variable_map); + cat->reverse_variable_map = pool_calloc (cat->pool, + cat->n_cats_total - cat->n_vars, + sizeof *cat->reverse_variable_map); for (v = 0 ; v < cat->n_vp; ++v) { @@ -290,7 +298,10 @@ categoricals_done (struct categoricals *cat) vp->reverse_value_map[vn->subscript] = vn; } - for (i = 0; i < vp->n_cats; ++i) + /* Populate the reverse variable map. + This implementation considers the first value of each categorical variable + as the basis. Therefore, this loop starts from 1 instead of 0 */ + for (i = 1; i < vp->n_cats; ++i) cat->reverse_variable_map[idx++] = v; } diff --git a/src/math/covariance.c b/src/math/covariance.c index c247148e..d60d609e 100644 --- a/src/math/covariance.c +++ b/src/math/covariance.c @@ -338,7 +338,9 @@ covariance_accumulate_pass2 (struct covariance *cov, const struct ccase *c) assert (cov->state == 1); cov->state = 2; - cov->dim = cov->n_vars + categoricals_total (cov->categoricals); + cov->dim = cov->n_vars + + categoricals_total (cov->categoricals) - categoricals_get_n_variables (cov->categoricals); + cov->n_cm = (cov->dim * (cov->dim - 1) ) / 2; cov->cm = xcalloc (sizeof *cov->cm, cov->n_cm);