Rewrote the EXAMINE command.
authorJohn Darrington <john@marilyn.intra>
Sat, 23 Aug 2008 06:08:28 +0000 (14:08 +0800)
committerJohn Darrington <john@marilyn.intra>
Sat, 6 Sep 2008 01:17:51 +0000 (09:17 +0800)
Made use of the new casegrouper construct instead of relying on hashes.
Rewrote the percentiles calculations so as not to require dynamically
allocating memory for all the data. Encapsulated many of the other statistics'
calculations, so as to have similar interfaces.

src/language/stats/examine.q
src/math/automake.mk
src/math/order-stats.c
src/math/order-stats.h
src/math/percentiles.c
src/math/percentiles.h
src/math/trimmed-mean.c

index 7f197ec37b57818767188fce9c1b2ab9a57e956c..94f3640503e3688bec11fd1605dc4ca960aeab3a 100644 (file)
@@ -110,16 +110,16 @@ struct factor_metrics
   struct statistic *histogram;
   struct order_stats *np;
 
-  /* Three quartiles indexing into PTL */
+  /* Tukey_Hingesree quartiles indexing into PTL */
   struct percentile **quartiles;
 
   /* A reader sorted in ASCENDING order */
   struct casereader *up_reader;
 
-  /* The minimum value of all the weights */
+  /* Tukey_Hingese minimum value of all tukey_hingese weights */
   double cmin;
 
-  /* Sum of all weights, including those for missing values */
+  /* Sum of all weights, including tukey_hingesose for missing values */
   double n;
 
   double mean;
@@ -148,13 +148,13 @@ struct factor_result
 
 struct xfactor
 {
-  /* We need to make a list of this structure */
+  /* We need to make a list of tukey_hingesis structure */
   struct ll ll;
 
-  /* The independent variable */
+  /* Tukey_Hingese independent variable */
   const struct variable const* indep_var[2];
 
-  /* A list of results for this factor */
+  /* A list of results for tukey_hingesis factor */
   struct ll_list result_list ;
 };
 
@@ -197,7 +197,7 @@ factor_destroy (struct xfactor *fctr)
 static struct xfactor level0_factor;
 static struct ll_list factor_list = LL_INITIALIZER (factor_list);
 
-/* Parse the clause specifying the factors */
+/* Parse tukey_hingese clause specifying tukey_hingese factors */
 static int examine_parse_independent_vars (struct lexer *lexer,
                                           const struct dictionary *dict,
                                           struct cmd_examine *cmd);
@@ -243,7 +243,7 @@ static void factor_to_string (const struct xfactor *fctr,
 
 /* Represent a factor as a string, so it can be
    printed in a human readable fashion,
-   but sacrificing some readablility for the sake of brevity */
+   but sacrificing some readablility for tukey_hingese sake of brevity */
 static void
 factor_to_string_concise (const struct xfactor *fctr,
                          const struct factor_result *result,
@@ -271,7 +271,7 @@ cmd_examine (struct lexer *lexer, struct dataset *ds)
       return CMD_FAILURE;
     }
 
-  /* If /MISSING=INCLUDE is set, then user missing values are ignored */
+  /* If /MISSING=INCLUDE is set, tukey_hingesen user missing values are ignored */
   exclude_values = cmd.incl == XMN_INCLUDE ? MV_SYSTEM : MV_ANY;
 
   if ( cmd.st_n == SYSMIS )
@@ -280,7 +280,7 @@ cmd_examine (struct lexer *lexer, struct dataset *ds)
   if ( ! cmd.sbc_cinterval)
     cmd.n_cinterval[0] = 95.0;
 
-  /* If descriptives have been requested, make sure the
+  /* If descriptives have been requested, make sure tukey_hingese
      quartiles are calculated */
   if ( cmd.a_statistics[XMN_ST_DESCRIPTIVES] )
     {
@@ -1020,7 +1020,7 @@ examine_group (struct cmd_examine *cmd, struct casereader *reader, int level,
 
          order_stats_accumulate (os, n_os,
                                  casereader_clone (metric->up_reader),
-                                 wv, dependent_vars[v], MV_ANY);
+                                 wv, dependent_vars[v]);
          free (os);
        }
     }
@@ -1091,7 +1091,7 @@ examine_group (struct cmd_examine *cmd, struct casereader *reader, int level,
          order_stats_accumulate ((struct order_stats **) &metric->box_whisker,
                                  1,
                                  casereader_clone (metric->up_reader),
-                                 wv, dependent_vars[v], MV_ANY);
+                                 wv, dependent_vars[v]);
        }
     }
 
index 94a3a0a8c901387fb4c5eb40e421bcc2c7beeccb..c9e1cddd1e73a74a26d5b30102ac4b36bc63338a 100644 (file)
@@ -5,10 +5,14 @@ include $(top_srcdir)/src/math/ts/automake.mk
 noinst_LIBRARIES += src/math/libpspp_math.a
 
 src_math_libpspp_math_a_SOURCES = \
-       src/math/box-whisker.c src/math/box-whiske.h \
-       src/math/chart-geometry.c src/math/chart-geometry.h \
-       src/math/coefficient.c src/math/coefficient.h \
-       src/math/covariance-matrix.c src/math/covariance-matrix.h \
+       src/math/chart-geometry.c \
+       src/math/chart-geometry.h \
+       src/math/box-whisker.c src/math/box-whisker.h \
+       src/math/coefficient.c \
+       src/math/coefficient.h \
+       src/math/covariance-matrix.c \
+       src/math/covariance-matrix.h \
+       src/math/design-matrix.c src/math/design-matrix.h \
        src/math/extrema.c src/math/extrema.h \
        src/math/group.c  src/math/group.h \
        src/math/group-proc.h \
@@ -16,15 +20,12 @@ src_math_libpspp_math_a_SOURCES = \
        src/math/interaction.c src/math/interaction.h \
        src/math/levene.c src/math/levene.h \
        src/math/linreg.c src/math/linreg.h \
-       src/math/merge.c src/math/merge.h \
+       src/math/merge.c  src/math/merge.h \
        src/math/moments.c  src/math/moments.h \
        src/math/np.c src/math/np.h \
        src/math/order-stats.c src/math/order-stats.h \
        src/math/percentiles.c src/math/percentiles.h \
-       src/math/design-matrix.c src/math/design-matrix.h \
        src/math/random.c src/math/random.h \
        src/math/sort.c src/math/sort.h \
        src/math/trimmed-mean.c src/math/trimmed-mean.h \
-       src/math/tukey-hinges.c src/math/tukey-hinges.h
-
-EXTRA_DIST += src/math/OChangeLog
+       src/math/tukey-hinges.c src/math/tukey-hinges.h 
index ca4160f4fdf6f52b09d82972edf10f6d8f4f6703..f5b6851ac1e06822363a178a17004850c94520ba 100644 (file)
 #include <data/casereader.h>
 #include <string.h>
 
-#if 0
-
-#include <stdio.h>
-
-static void
-order_stats_dump_k1 (const struct order_stats *os)
-{
-  struct k *k = &os->k[0];
-  printf ("K1: tc %g; c %g cc %g ccp %g\n",
-         k->tc, k->c, k->cc, k->cc_p1);
-
-}
-
-static void
-order_stats_dump_k2 (const struct order_stats *os)
-{
-  struct k *k = &os->k[1];
-  printf ("K2: tc %g; c %g cc %g ccp %g\n",
-         k->tc, k->c, k->cc, k->cc_p1);
-}
-
-
-void
-order_stats_dump (const struct order_stats *os)
-{
-  order_stats_dump_k1 (os);
-  order_stats_dump_k2 (os);
-}
-
-#endif
 
 static void
 update_k_lower (struct k *kk,
@@ -85,7 +55,6 @@ update_k_values (const struct ccase *cx, double y_i, double c_i, double cc_i,
                 struct order_stats **os, size_t n_os)
 {
   int j;
-
   for (j = 0 ; j < n_os ; ++j)
     {
       int k;
@@ -100,18 +69,15 @@ update_k_values (const struct ccase *cx, double y_i, double c_i, double cc_i,
 
       if ( stat->accumulate )
        stat->accumulate (stat, cx, c_i, cc_i, y_i);
-
-      tos->cc = cc_i;
     }
 }
 
 
 void
 order_stats_accumulate (struct order_stats **os, size_t nos,
-                       struct casereader *reader,
-                       const struct variable *wv,
-                       const struct variable *var,
-                       enum mv_class exclude)
+                   struct casereader *reader,
+                   const struct variable *wv,
+                   const struct variable *var)
 {
   struct ccase cx;
   struct ccase prev_cx;
@@ -130,9 +96,6 @@ order_stats_accumulate (struct order_stats **os, size_t nos,
       /* The casereader MUST be sorted */
       assert (this_value >= prev_value);
 
-      if ( var_is_value_missing (var, case_data (&cx, var), exclude))
-       continue;
-
       case_destroy (&prev_cx);
 
       if ( prev_value == -DBL_MAX || prev_value == this_value)
@@ -154,6 +117,3 @@ order_stats_accumulate (struct order_stats **os, size_t nos,
 
   casereader_destroy (reader);
 }
-
-
-
index cea50ed80d14b34976beccc3055d656fdb8ce2f8..fc5889504a6c1360d1026047e68760fefa2f70d5 100644 (file)
@@ -29,11 +29,17 @@ struct variable;
 struct k
 {
   double tc;
+
   double cc;
+
   double cc_p1;
+
   double c;
+
   double c_p1;
+
   double y;
+
   double y_p1;
 };
 
@@ -43,18 +49,18 @@ struct order_stats
   struct statistic parent;
   int n_k;
   struct k *k;
-
-  double cc;
 };
 
-enum mv_class;
 
-void order_stats_dump (const struct order_stats *os);
+
+void dump_ptile_k1 (const struct order_stats *ptl);
+
+void dump_ptile_k2 (const struct order_stats *ptl);
+
 
 void order_stats_accumulate (struct order_stats **ptl, size_t nos,
-                            struct casereader *reader,
-                            const struct variable *wv,
-                            const struct variable *var,
-                            enum mv_class exclude);
+                        struct casereader *reader,
+                        const struct variable *wv,
+                        const struct variable *var);
 
 #endif
index bf99de163ffbaafe2af8711685e9a640a0256784..53d704d623036981d99ae49d49677498542e010a 100644 (file)
@@ -47,8 +47,6 @@ percentile_calculate (const struct percentile *ptl, enum pc_alg alg)
   struct percentile *mutable = (struct percentile *) ptl;
   const struct order_stats *os = &ptl->parent;
 
-  assert (os->cc == ptl->w);
-
   if ( ptl->g1 == SYSMIS)
     mutable->g1 = (os->k[0].tc - os->k[0].cc) / os->k[0].c_p1;
 
@@ -171,7 +169,6 @@ percentile_create (double p, double W)
   assert (p <= 1.0);
 
   ptl->ptile = p;
-  ptl->w = W;
 
   os->n_k = 2;
   os->k = xcalloc (sizeof (*os->k), 2);
@@ -189,3 +186,15 @@ percentile_create (double p, double W)
   return os;
 }
 
+#if 0
+void
+percentile_dump (const struct percentile *ptl)
+{
+  printf ("Percentile %g:\n\tk1: ", ptl->ptile);
+
+  dump_os_k1 ((const struct os *)ptl);
+  printf ("\tk2: ");
+  dump_os_k2 ((const struct os *)ptl);
+  printf ("\n");
+}
+#endif
index 0dd09820945e1bafaee5a017ba3756cb4197783b..935584636918c6ae727ba58fdd4e843b56805130 100644 (file)
@@ -39,7 +39,6 @@ struct percentile
   struct order_stats parent;
 
   double ptile;
-  double w;
 
   /* Mutable */
   double g1;
index da3d4240e5b232533de6c5c31073b53adda49f48..fa205017bca35a046f01c2156a0e7fe9b3dabc89 100644 (file)
@@ -77,8 +77,6 @@ trimmed_mean_calculate (const struct trimmed_mean *tm)
 {
   const struct order_stats *os = (const struct order_stats *) tm;
 
-  assert (os->cc == tm->w);
-
   return
     (
      (os->k[0].cc_p1 - os->k[0].tc) * os->k[0].y_p1