Drop first category of each variable from covariance matrix.
authorJohn Darrington <john@darrington.wattle.id.au>
Sat, 31 Oct 2009 07:42:25 +0000 (08:42 +0100)
committerJohn Darrington <john@darrington.wattle.id.au>
Sat, 31 Oct 2009 07:42:25 +0000 (08:42 +0100)
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.

src/math/categoricals.c
src/math/covariance.c

index b7e51751a5b8492fe1a5057d5b5c254577ecb879..5c96c40cc359a1ec87f00594890eb00cfe75c577 100644 (file)
@@ -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;
     }
 
index c247148ee9f88d64a29edf36e087d79ab21e95cd..d60d609e45681ffc7858abb83490b0b07b09fb46 100644 (file)
@@ -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);