Fixed a bug in the levene test, and added the levene test to the oneway cmd
authorJohn Darrington <john@darrington.wattle.id.au>
Sat, 30 Oct 2004 01:21:21 +0000 (01:21 +0000)
committerJohn Darrington <john@darrington.wattle.id.au>
Sat, 30 Oct 2004 01:21:21 +0000 (01:21 +0000)
src/ChangeLog
src/group.h
src/levene.c
src/oneway.q
src/t-test.q
tests/command/oneway.sh

index 9ae138ff6629a576e54a124d61199bd4310c9cd7..3c7527c7c967bd16b14b6ebe34dc757a7d02c19b 100644 (file)
@@ -1,3 +1,11 @@
+Sat Oct 30 09:16:29 WST 2004 John Darrington <john@darrington.wattle.id.au>
+
+       * levene.c oneway.q Fixed a buglet with the levene statistic and
+       incorporated the levene test into the oneway command.
+
+        * group.h  t-test.q  Moved the CMP_EQ and CMP_LE symbols out of 
+       global scope, since they're only relevant to T-TEST
+
 Fri Oct 29 17:39:03 WST 2004 John Darrington <john@darrington.wattle.id.au>
 
         * group.c group.h group_proc.h levene.c oneway.q t-test.q
index c9050604bcad11df61b6ed5a4760843f95d5cac4..984523574212b27976f1da54f3adc58b7a97047d 100644 (file)
@@ -18,7 +18,6 @@
    02111-1307, USA. */
 
 
-
 #ifndef GROUP_H
 #define GROUP_H
 
 #include "val.h"
 
 
-enum comparison
-  {
-    CMP_LE = -2,
-    CMP_EQ = 0,
-  };
-
-
 /* Statistics for grouped data */
 struct group_statistics
   {
index 4659f199ac018f98bd46886c2ad61d917ef24a88..e29e77629c110000b250a07667475e523522cda5 100644 (file)
@@ -232,8 +232,8 @@ levene_postcalc (void *_l)
 
   for (v = 0; v < l->n_dep; ++v) 
     {
+      /* This is Z_LL */
       lz[v].grand_mean = lz[v].grand_total / lz[v].total_n ;
-
     }
 
 }
@@ -344,17 +344,15 @@ levene2_postcalc (void *_l)
          g != 0 ;
          g = (struct group_statistics *) hsh_next(hash,&hi) )
        {
-
          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_denominator[v] /= (l->v_dep[v]->p.grp_data.n_groups - 1);
+      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 */
index 7477a3f065a70fc6b984ed8183efc67115ad6d7c..185a96303ab3f98c0973d188a95444d09e28f00c 100644 (file)
@@ -95,6 +95,10 @@ static void show_contrast_coeffs(void);
 static void show_contrast_tests(void);
 
 
+enum stat_table_t {STAT_DESC, STAT_HOMO};
+
+static enum stat_table_t stat_tables ;
+
 
 int
 cmd_oneway(void)
@@ -110,6 +114,25 @@ cmd_oneway(void)
   else
     value_is_missing = is_missing;
 
+  /* What statistics were requested */
+  if ( cmd.sbc_statistics ) 
+    {
+
+      for (i = 0 ; i < ONEWAY_ST_count ; ++i ) 
+       {
+         if  ( ! cmd.a_statistics[i]  ) continue;
+
+         switch (i) {
+         case ONEWAY_ST_DESCRIPTIVES:
+           stat_tables |= STAT_DESC;
+           break;
+         case ONEWAY_ST_HOMOGENEITY:
+           stat_tables |= STAT_HOMO;
+           break;
+         }
+       }
+    }
+
   multipass_procedure_with_splits (calculate, &cmd);
 
   /* Check the sanity of the given contrast values */
@@ -133,26 +156,11 @@ cmd_oneway(void)
        msg(SW,_("Coefficients for contrast %d do not total zero"),i + 1);
     }
 
+  if ( stat_tables & STAT_DESC ) 
+    show_descriptives();
 
-
-  /* Show the statistics tables */
-  if ( cmd.sbc_statistics ) 
-    {
-    for (i = 0 ; i < ONEWAY_ST_count ; ++i ) 
-      {
-       if  ( ! cmd.a_statistics[i]  ) continue;
-
-       switch (i) {
-       case ONEWAY_ST_DESCRIPTIVES:
-         show_descriptives();
-         break;
-       case ONEWAY_ST_HOMOGENEITY:
-         show_homogeneity();
-         break;
-       }
-      }
-  }
-
+  if ( stat_tables & STAT_HOMO )
+    show_homogeneity();
 
   show_anova_table();
      
@@ -526,19 +534,23 @@ show_homogeneity(void)
 
   for ( v=0 ; v < n_vars ; ++v ) 
     {
-      char *s = (vars[v]->label) ? vars[v]->label : vars[v]->name;
-      struct group_statistics *totals = &vars[v]->p.grp_data.ugs;
-
-      const double df1 = vars[v]->p.grp_data.n_groups - 1;
-      const double df2 = totals->n - vars[v]->p.grp_data.n_groups ;
+      double F;
+      const struct variable *var = vars[v];
+      const char *s = (var->label) ? var->label : var->name;
+      const struct group_statistics *totals = &var->p.grp_data.ugs;
 
+      const double df1 = var->p.grp_data.n_groups - 1;
+      const double df2 = totals->n - var->p.grp_data.n_groups ;
 
       tab_text (t, 0, v + 1, TAB_LEFT | TAT_TITLE, s);
 
-
-
+      F = var->p.grp_data.levene;
+      tab_float (t, 1, v + 1, TAB_RIGHT, F, 8,3);
       tab_float (t, 2, v + 1, TAB_RIGHT, df1 ,8,0);
       tab_float (t, 3, v + 1, TAB_RIGHT, df2 ,8,0);
+
+      /* Now the significance */
+      tab_float (t, 4, v + 1, TAB_RIGHT,gsl_cdf_fdist_Q(F,df1,df2), 8, 3);
     }
 
   tab_submit (t);
@@ -884,7 +896,6 @@ calculate(const struct casefile *cf, void *cmd_)
   struct casereader *r;
   struct ccase c;
 
-
   struct cmd_oneway *cmd = (struct cmd_oneway *) cmd_;
 
   global_group_hash = hsh_create(4, 
@@ -893,9 +904,10 @@ calculate(const struct casefile *cf, void *cmd_)
                                 0,
                                 (void *) indep_var->width );
 
-  precalc(cmd);
 
 
+  precalc(cmd);
+
 
   for(r = casefile_get_reader (cf);
       casereader_read (r, &c) ;
@@ -972,9 +984,9 @@ calculate(const struct casefile *cf, void *cmd_)
 
   postcalc(cmd);
 
-  /* 
-  levene(cf, indep_var, n_vars, vars, LEV_LISTWISE, value_is_missing);
-  */
+  
+  if ( stat_tables & STAT_HOMO ) 
+    levene(cf, indep_var, n_vars, vars, LEV_LISTWISE, value_is_missing);
 
   ostensible_number_of_groups = hsh_count (global_group_hash);
 
index a991f29ed6d09bb9bf4f2c0e99b8dc918a6ca619..44dd502ee7f90c929ff475f02d10a6ca72079979 100644 (file)
@@ -66,9 +66,11 @@ static is_missing_func value_is_missing;
 /* Variable for the GROUPS subcommand, if given. */
 static struct variable *indep_var;
 
-/* GROUPS: Number of values specified by the user; the values
-   specified if any. */
-
+enum comparison
+  {
+    CMP_LE = -2,
+    CMP_EQ = 0,
+  };
 
 struct group_properties
 {
index 193ab64774e9bbb4f61e6e55ced3574551fdfe07..f647e4e0bbbb8fd6b6269723ed99e91a2cc21a0c 100755 (executable)
@@ -47,19 +47,36 @@ cd $TEMPDIR
 
 activity="create program"
 cat > $TEMPDIR/out.stat <<EOF
-data list list /id * cables * price *.
-begin data.
-1 2.0 3.0
-2 1.0 2.0
-3 2.0 4.5
-4 2.0 4.5
-5 3.0 6.0
-end data.
-
-ONEWAY 
- id cables BY price
- /STATISTICS descriptives homogeneity
- /MISSING analysis .
+DATA LIST LIST /quality * brand * .
+BEGIN DATA
+3 1
+2 1
+1 1
+1 1
+4 1
+5 2
+2 2
+4 2
+2 2
+3 2
+7  3
+4  3
+5  3
+3  3
+6  3
+END DATA
+
+VARIABLE LABELS brand 'Manufacturer'.
+VARIABLE LABELS quality 'Breaking Strain'.
+
+VALUE LABELS /brand 1 'Aspeger' 2 'Bloggs' 3 'Charlies'.
+
+ONEWAY
+       quality BY brand
+       /STATISTICS descriptives homogeneity
+       /CONTRASTS =  -2 1 1 
+       /CONTRASTS = 0 -1 1
+       .
 EOF
 if [ $? -ne 0 ] ; then no_result ; fi
 
@@ -68,4 +85,52 @@ 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  |
++--------+------+
+
+2.1 ONEWAY.  Test of Homogeneity of Variances
+#===============#================#===#===#============#
+#               #Levene Statistic|df1|df2|Significance#
+#===============#================#===#===#============#
+#Breaking Strain#            .092|  2| 12|        .913#
+#===============#================#===#===#============#
+
+2.2 ONEWAY.  ANOVA
+#==============================#==============#==#===========#=====#============#
+#                              #Sum of Squares|df|Mean Square|  F  |Significance#
+#===============#==============#==============#==#===========#=====#============#
+#Breaking Strain|Between Groups#         20.13| 2|     10.067|5.119|        .025#
+#               |Within Groups #         23.60|12|      1.967|     |            #
+#               |Total         #         43.73|14|           |     |            #
+#===============#==============#==============#==#===========#=====#============#
+
+2.3 ONEWAY.  Contrast Coefficients
+#==========#=======================#
+#          #      Manufacturer     #
+#          #-------+------+--------#
+#          #Aspeger|Bloggs|Charlies#
+#========#=#=======#======#========#
+#Contrast|1#     -2|     1|       1#
+#        |2#      0|    -1|       1#
+#========#=#=======#======#========#
+
+2.4 ONEWAY.  Contrast Tests
+#===============================================#=================#==========#=====#=====#===============#
+#                                       Contrast#Value of Contrast|Std. Error|  t  |  df |Sig. (2-tailed)#
+#===============#======================#========#=================#==========#=====#=====#===============#
+#Breaking Strain|Assume equal variances|    1   #             3.80|     1.536|2.474|   12|           .029#
+#               |                      |    2   #             1.80|      .887|2.029|   12|           .065#
+#               |Does not assume equal |    1   #             3.80|     1.483|2.562|8.740|           .031#
+#               |                      |    2   #             1.80|      .917|1.964|7.720|           .086#
+#===============#======================#========#=================#==========#=====#=====#===============#
+
+EOF
+if [ $? -ne 0 ] ; then fail ; fi
+
 pass