From f52b6f9c47aef9ff3f5a0f77c4e0a35478b286b7 Mon Sep 17 00:00:00 2001 From: John Darrington Date: Sat, 6 Nov 2004 06:57:35 +0000 Subject: [PATCH] Fixed problem where oneway didn't deal properly with splits. --- src/ChangeLog | 5 + src/oneway.q | 73 +++++++--- tests/ChangeLog | 4 + tests/Makefile.am | 1 + tests/command/oneway-with-splits.sh | 204 ++++++++++++++++++++++++++++ 5 files changed, 266 insertions(+), 21 deletions(-) create mode 100755 tests/command/oneway-with-splits.sh diff --git a/src/ChangeLog b/src/ChangeLog index ec56b315..3b6dc154 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +Sat Nov 6 14:49:47 WST 2004 John Darrington + + * oneway.q Fixed problem where oneway wasn't dealing properly with + splits + Thu Nov 4 11:09:01 WST 2004 John Darrington * q2c.c examine.q Fixed a bug (feature?) whereby arrays in the diff --git a/src/oneway.q b/src/oneway.q index 075ce0a1..ff6b79b6 100644 --- a/src/oneway.q +++ b/src/oneway.q @@ -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(); + + } diff --git a/tests/ChangeLog b/tests/ChangeLog index c702df87..ded692b8 100644 --- a/tests/ChangeLog +++ b/tests/ChangeLog @@ -1,3 +1,7 @@ +Sat Nov 6 14:49:27 WST 2004 John Darrington + + * command/oneway-with-splits.sh Added. + Sun Oct 31 16:08:47 WST 2004 John Darrington * bugs/recode-copy-bug.sh bugs/computebug.sh Fixed problem which diff --git a/tests/Makefile.am b/tests/Makefile.am index ed566ef4..a4aa0706 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -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 index 00000000..93acda68 --- /dev/null +++ b/tests/command/oneway-with-splits.sh @@ -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 <