Fixed problem where oneway didn't deal properly with splits.
authorJohn Darrington <john@darrington.wattle.id.au>
Sat, 6 Nov 2004 06:57:35 +0000 (06:57 +0000)
committerJohn Darrington <john@darrington.wattle.id.au>
Sat, 6 Nov 2004 06:57:35 +0000 (06:57 +0000)
src/ChangeLog
src/oneway.q
tests/ChangeLog
tests/Makefile.am
tests/command/oneway-with-splits.sh [new file with mode: 0755]

index ec56b3156a893062c5e060f07bb1f23ad86c35f6..3b6dc154b23fdd33cd3f6a7ec1a24e1448bd1c3d 100644 (file)
@@ -1,3 +1,8 @@
+Sat Nov  6 14:49:47 WST 2004 John Darrington <john@darrington.wattle.id.au>
+
+       * oneway.q Fixed problem where oneway wasn't dealing properly with 
+       splits
+
 Thu Nov  4 11:09:01 WST 2004 John Darrington <john@darrington.wattle.id.au>
 
        * q2c.c examine.q  Fixed a bug (feature?) whereby arrays in the
index 075ce0a1f00b04513481e84530ff22c71ae73244..ff6b79b66e9d322eac109ce062ac5806cf8bfef5 100644 (file)
@@ -84,21 +84,24 @@ static int ostensible_number_of_groups=-1;
 static is_missing_func value_is_missing;
 
 
-static void calculate(const struct casefile *cf, void *_mode);
+static void run_oneway(const struct casefile *cf, void *_mode);
 
 
 /* Routines to show the output tables */
 static void show_anova_table(void);
 static void show_descriptives(void);
 static void show_homogeneity(void);
-static void show_contrast_coeffs(void);
-static void show_contrast_tests(void);
+
+static void show_contrast_coeffs(short *);
+static void show_contrast_tests(short *);
 
 
 enum stat_table_t {STAT_DESC = 1, STAT_HOMO = 2};
 
 static enum stat_table_t stat_tables ;
 
+void output_oneway(void);
+
 
 int
 cmd_oneway(void)
@@ -133,7 +136,21 @@ cmd_oneway(void)
        }
     }
 
-  multipass_procedure_with_splits (calculate, &cmd);
+  multipass_procedure_with_splits (run_oneway, &cmd);
+
+
+  return CMD_SUCCESS;
+}
+
+
+void
+output_oneway(void)
+{
+
+  int i;
+  short *bad_contrast ; 
+
+  bad_contrast = xmalloc ( sizeof (short) * cmd.sbc_contrast );
 
   /* Check the sanity of the given contrast values */
   for (i = 0 ; i < cmd.sbc_contrast ; ++i ) 
@@ -141,12 +158,14 @@ cmd_oneway(void)
       int j;
       double sum = 0;
 
+      bad_contrast[i] = 0;
       if ( subc_list_double_count(&cmd.dl_contrast[i]) != 
           ostensible_number_of_groups )
        {
-         msg(SE
+         msg(SW
              _("Number of contrast coefficients must equal the number of groups"));
-         return CMD_FAILURE;
+         bad_contrast[i] = 1;
+         continue;
        }
 
       for (j=0; j < ostensible_number_of_groups ; ++j )
@@ -164,13 +183,15 @@ cmd_oneway(void)
 
   show_anova_table();
      
-  if (cmd.sbc_contrast)
+  if (cmd.sbc_contrast )
     {
-      show_contrast_coeffs();
-      show_contrast_tests();
+      show_contrast_coeffs(bad_contrast);
+      show_contrast_tests(bad_contrast);
     }
 
 
+  free(bad_contrast);
+
   /* Clean up */
   for (i = 0 ; i < n_vars ; ++i ) 
     {
@@ -181,13 +202,11 @@ cmd_oneway(void)
 
   hsh_destroy(global_group_hash);
 
-  return CMD_SUCCESS;
 }
 
 
 
 
-
 /* Parser for the variables sub command */
 static int
 oneway_custom_variables(struct cmd_oneway *cmd UNUSED)
@@ -561,7 +580,7 @@ show_homogeneity(void)
 
 /* Show the contrast coefficients table */
 static void 
-show_contrast_coeffs(void)
+show_contrast_coeffs(short *bad_contrast)
 {
   char *s;
   int n_cols = 2 + ostensible_number_of_groups;
@@ -621,6 +640,7 @@ show_contrast_coeffs(void)
       int i;
       char *lab;
 
+
       lab = val_labs_find(indep_var->val_labs,*group_value);
   
       if ( lab ) 
@@ -632,10 +652,15 @@ show_contrast_coeffs(void)
 
       for (i = 0 ; i < cmd.sbc_contrast ; ++i ) 
        {
+
          tab_text(t, 1, i + 2, TAB_CENTER | TAT_PRINTF, "%d", i + 1);
-         tab_text(t, count + 2, i + 2, TAB_RIGHT | TAT_PRINTF, "%g", 
-                  subc_list_double_at(&cmd.dl_contrast[i],count)
-                  );
+
+         if ( bad_contrast[i] ) 
+           tab_text(t, count + 2, i + 2, TAB_RIGHT, "?" );
+         else
+           tab_text(t, count + 2, i + 2, TAB_RIGHT | TAT_PRINTF, "%g", 
+                    subc_list_double_at(&cmd.dl_contrast[i],count)
+                    );
        }
          
       count++ ; 
@@ -648,7 +673,7 @@ show_contrast_coeffs(void)
 
 /* Show the results of the contrast tests */
 static void 
-show_contrast_tests(void)
+show_contrast_tests(short *bad_contrast)
 {
   int v;
   int n_cols = 8;
@@ -746,6 +771,10 @@ show_contrast_tests(void)
          tab_text (t,  2, (v * lines_per_variable) + i + 1 + cmd.sbc_contrast,
                    TAB_CENTER | TAT_TITLE | TAT_PRINTF, "%d",i+1);
 
+
+         if ( bad_contrast[i]) 
+           continue;
+
          /* FIXME: Potential danger here.
             We're ASSUMING THE array is in the order corresponding to the 
             hash order. */
@@ -769,17 +798,15 @@ show_contrast_tests(void)
            }
          sec_vneq = sqrt(sec_vneq);
 
-
          df_numerator = pow2(df_numerator);
-         
 
          tab_float (t,  3, (v * lines_per_variable) + i + 1, 
                     TAB_RIGHT, contrast_value, 8,2);
 
-         tab_float (t,  3, (v * lines_per_variable) + i + 1 + cmd.sbc_contrast,
+         tab_float (t,  3, (v * lines_per_variable) + i + 1 + 
+                    cmd.sbc_contrast,
                     TAB_RIGHT, contrast_value, 8,2);
 
-
          std_error_contrast = sqrt(vars[v]->p.grp_data.mse * coef_msq);
 
          /* Std. Error */
@@ -891,7 +918,7 @@ precalc ( struct cmd_oneway *cmd UNUSED )
 
 
 static void 
-calculate(const struct casefile *cf, void *cmd_)
+run_oneway(const struct casefile *cf, void *cmd_)
 {
   struct casereader *r;
   struct ccase c;
@@ -1008,6 +1035,10 @@ calculate(const struct casefile *cf, void *cmd_)
 
   ostensible_number_of_groups = hsh_count (global_group_hash);
 
+
+  output_oneway();
+
+
 }
 
 
index c702df87ab869f88f8677567dee23581ac664ed2..ded692b871548b5ea4f1c236f009ab7c073d3657 100644 (file)
@@ -1,3 +1,7 @@
+Sat Nov  6 14:49:27 WST 2004 John Darrington <john@darrington.wattle.id.au>
+
+       * command/oneway-with-splits.sh  Added.
+
 Sun Oct 31 16:08:47 WST 2004 John Darrington <john@darrington.wattle.id.au>
 
        * bugs/recode-copy-bug.sh bugs/computebug.sh  Fixed problem which 
index ed566ef47e9184ac5fcb99fc79ddf1b20044b545..a4aa0706eed185d14e9592d981028fca890349d2 100644 (file)
@@ -17,6 +17,7 @@ TESTS = \
        command/loop.sh \
        command/oneway.sh \
        command/oneway-missing.sh \
+       command/oneway-with-splits.sh \
        command/print.sh \
        command/sample.sh \
        command/sort.sh \
diff --git a/tests/command/oneway-with-splits.sh b/tests/command/oneway-with-splits.sh
new file mode 100755 (executable)
index 0000000..93acda6
--- /dev/null
@@ -0,0 +1,204 @@
+#!/bin/sh
+
+# This program tests that the ONEWAY anova command works OK
+# when SPLIT FILE is active
+
+TEMPDIR=/tmp/pspp-tst-$$
+
+here=`pwd`;
+
+# ensure that top_srcdir is absolute
+cd $top_srcdir; top_srcdir=`pwd`
+
+export STAT_CONFIG_PATH=$top_srcdir/config
+
+
+cleanup()
+{
+     rm -rf $TEMPDIR
+}
+
+
+fail()
+{
+    echo $activity
+    echo FAILED
+    cleanup;
+    exit 1;
+}
+
+
+no_result()
+{
+    echo $activity
+    echo NO RESULT;
+    cleanup;
+    exit 2;
+}
+
+pass()
+{
+    cleanup;
+    exit 0;
+}
+
+mkdir -p $TEMPDIR
+
+cd $TEMPDIR
+
+activity="create program"
+cat > $TEMPDIR/out.stat <<EOF
+DATA LIST LIST /quality * brand * s *.
+BEGIN DATA
+3 1 1
+2 1 1
+1 1 1
+1 1 1
+4 1 1
+5 2 1
+2 2 1
+4 2 2
+2 2 2
+3 2 2
+7  3 2
+4  3 2
+5  3 2
+3  3 2
+6  3 2
+END DATA
+
+VARIABLE LABELS brand 'Manufacturer'.
+VARIABLE LABELS quality 'Breaking Strain'.
+
+VALUE LABELS /brand 1 'Aspeger' 2 'Bloggs' 3 'Charlies'.
+
+SPLIT FILE by s.
+
+ONEWAY
+       quality BY brand
+       /STATISTICS descriptives homogeneity
+       /CONTRASTS =  -2 2
+       /CONTRASTS = -1 1
+       .
+EOF
+if [ $? -ne 0 ] ; then no_result ; fi
+
+
+activity="run program"
+$SUPERVISOR $here/../src/pspp -o raw-ascii $TEMPDIR/out.stat
+if [ $? -ne 0 ] ; then no_result ; fi
+
+diff $TEMPDIR/pspp.list - << EOF
+1.1 DATA LIST.  Reading free-form data from the command file.
++--------+------+
+|Variable|Format|
+#========#======#
+|QUALITY |F8.0  |
+|BRAND   |F8.0  |
+|S       |F8.0  |
++--------+------+
+
+Variable Value    Label
+S            1.00
+
+2.1 ONEWAY.  Descriptives
+#===============#=======#=#====#==============#==========#=======================#=======#=======#
+#               |       # |    |              |          |    95% Confidence     |       |       #
+#               |       # |    |              |          +-----------+-----------+       |       #
+#               |       #N|Mean|Std. Deviation|Std. Error|Lower Bound|Upper Bound|Minimum|Maximum#
+#===============#=======#=#====#==============#==========#===========#===========#=======#=======#
+#Breaking Strain|Aspeger#5|2.20|          1.30|       .58|        .58|       3.82|   1.00|   4.00#
+#               |Bloggs #2|3.50|          2.12|      1.50|     -15.56|      22.56|   2.00|   5.00#
+#               |Total  #7|2.57|          1.51|       .57|       1.17|       3.97|   1.00|   5.00#
+#===============#=======#=#====#==============#==========#===========#===========#=======#=======#
+
+2.2 ONEWAY.  Test of Homogeneity of Variances
+#===============#================#===#===#============#
+#               #Levene Statistic|df1|df2|Significance#
+#===============#================#===#===#============#
+#Breaking Strain#           1.086|  1|  5|        .345#
+#===============#================#===#===#============#
+
+2.3 ONEWAY.  ANOVA
+#==============================#==============#==#===========#=====#============#
+#                              #Sum of Squares|df|Mean Square|  F  |Significance#
+#===============#==============#==============#==#===========#=====#============#
+#Breaking Strain|Between Groups#          2.41| 1|      2.414|1.068|        .349#
+#               |Within Groups #         11.30| 5|      2.260|     |            #
+#               |Total         #         13.71| 6|           |     |            #
+#===============#==============#==============#==#===========#=====#============#
+
+2.4 ONEWAY.  Contrast Coefficients
+#==========#==============#
+#          # Manufacturer #
+#          #-------+------#
+#          #Aspeger|Bloggs#
+#========#=#=======#======#
+#Contrast|1#     -2|     2#
+#        |2#     -1|     1#
+#========#=#=======#======#
+
+2.5 ONEWAY.  Contrast Tests
+#===============================================#=================#==========#=====#=====#===============#
+#                                       Contrast#Value of Contrast|Std. Error|  t  |  df |Sig. (2-tailed)#
+#===============#======================#========#=================#==========#=====#=====#===============#
+#Breaking Strain|Assume equal variances|    1   #             2.60|     2.516|1.034|    5|           .349#
+#               |                      |    2   #             1.30|     1.258|1.034|    5|           .349#
+#               |Does not assume equal |    1   #             2.60|     3.219| .808|1.318|           .539#
+#               |                      |    2   #             1.30|     1.609| .808|1.318|           .539#
+#===============#======================#========#=================#==========#=====#=====#===============#
+
+Variable Value    Label
+S            2.00
+
+2.6 ONEWAY.  Descriptives
+#===============#========#=#====#==============#==========#=======================#=======#=======#
+#               |        # |    |              |          |    95% Confidence     |       |       #
+#               |        # |    |              |          +-----------+-----------+       |       #
+#               |        #N|Mean|Std. Deviation|Std. Error|Lower Bound|Upper Bound|Minimum|Maximum#
+#===============#========#=#====#==============#==========#===========#===========#=======#=======#
+#Breaking Strain|Bloggs  #3|3.00|          1.00|       .58|        .52|       5.48|   2.00|   4.00#
+#               |Charlies#5|5.00|          1.58|       .71|       3.04|       6.96|   3.00|   7.00#
+#               |Total   #8|4.25|          1.67|       .59|       2.85|       5.65|   2.00|   7.00#
+#===============#========#=#====#==============#==========#===========#===========#=======#=======#
+
+2.7 ONEWAY.  Test of Homogeneity of Variances
+#===============#================#===#===#============#
+#               #Levene Statistic|df1|df2|Significance#
+#===============#================#===#===#============#
+#Breaking Strain#           2.199|  1|  6|        .189#
+#===============#================#===#===#============#
+
+2.8 ONEWAY.  ANOVA
+#==============================#==============#==#===========#=====#============#
+#                              #Sum of Squares|df|Mean Square|  F  |Significance#
+#===============#==============#==============#==#===========#=====#============#
+#Breaking Strain|Between Groups#          7.50| 1|      7.500|3.750|        .101#
+#               |Within Groups #         12.00| 6|      2.000|     |            #
+#               |Total         #         19.50| 7|           |     |            #
+#===============#==============#==============#==#===========#=====#============#
+
+2.9 ONEWAY.  Contrast Coefficients
+#==========#===============#
+#          #  Manufacturer #
+#          #------+--------#
+#          #Bloggs|Charlies#
+#========#=#======#========#
+#Contrast|1#    -2|       2#
+#        |2#    -1|       1#
+#========#=#======#========#
+
+2.10 ONEWAY.  Contrast Tests
+#===============================================#=================#==========#=====#=====#===============#
+#                                       Contrast#Value of Contrast|Std. Error|  t  |  df |Sig. (2-tailed)#
+#===============#======================#========#=================#==========#=====#=====#===============#
+#Breaking Strain|Assume equal variances|    1   #             4.00|     2.066|1.936|    6|           .101#
+#               |                      |    2   #             2.00|     1.033|1.936|    6|           .101#
+#               |Does not assume equal |    1   #             4.00|     1.826|2.191|5.882|           .072#
+#               |                      |    2   #             2.00|      .913|2.191|5.882|           .072#
+#===============#======================#========#=================#==========#=====#=====#===============#
+
+EOF
+if [ $? -ne 0 ] ; then fail ; fi
+
+pass