X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Ft-test.q;h=3f80214494bde1013c85f05713accbe7fe6df559;hb=d4d9866bb2ec1797b8fb103e7144d0e9ffd1abff;hp=97b3db56f79bbad6143b5ca4d9fe008c1d6b712f;hpb=738a32191dd661793410957d9f2df8c46fdcb55c;p=pspp-builds.git diff --git a/src/t-test.q b/src/t-test.q index 97b3db56..3f802144 100644 --- a/src/t-test.q +++ b/src/t-test.q @@ -39,11 +39,13 @@ #include "pool.h" #include "hash.h" #include "stats.h" +#include "t-test.h" +#include "levene.h" /* (specification) "T-TEST" (tts_): - groups=custom; - testval=double; + +groups=custom; + +testval=double; variables=varlist("PV_NO_SCRATCH | PV_NUMERIC"); pairs=custom; +missing=miss:!analysis/listwise, @@ -57,7 +59,6 @@ static struct cmd_t_test cmd; - static struct pool *t_test_pool ; /* Variable for the GROUPS subcommand, if given. */ @@ -65,11 +66,13 @@ static struct variable *groups; /* GROUPS: Number of values specified by the user; the values specified if any. */ + static int n_groups_values; static union value groups_values[2]; + /* PAIRS: Number of pairs to be compared ; each pair. */ -static int n_pairs ; +static int n_pairs = 0 ; struct pair { /* The variables comprising the pair */ @@ -90,7 +93,7 @@ struct pair /* The std deviation of the differences */ double std_dev_diff; }; -static struct pair *pairs; +static struct pair *pairs=0; static int parse_value (union value * v, int type) ; @@ -122,7 +125,7 @@ void ssbox_finalize(struct ssbox *ssb); /* A function to create, populate and submit the Paired Samples Correlation box */ -void pscbox(struct cmd_t_test *cmd); +void pscbox(void); /* Structures and Functions for the Test Results Box */ @@ -155,20 +158,26 @@ enum { }; -static int common_calc (struct ccase *); -static void common_precalc (void); -static void common_postcalc (void); +static int common_calc (struct ccase *, void *); +static void common_precalc (void *); +static void common_postcalc (void *); + +static int one_sample_calc (struct ccase *, void *); +static void one_sample_precalc (void *); +static void one_sample_postcalc (void *); + +static int paired_calc (struct ccase *, void *); +static void paired_precalc (void *); +static void paired_postcalc (void *); + +static void group_precalc (void *); +static int group_calc (struct ccase *, void *); +static void group_postcalc (void *); -static int one_sample_calc (struct ccase *); -static void one_sample_precalc (void); -static void one_sample_postcalc (void); -static int paired_calc (struct ccase *); -static void paired_precalc (void); -static void paired_postcalc (void); +static int compare_var_name (const void *a_, const void *b_, void *v_ UNUSED); +static unsigned hash_var_name (const void *a_, void *v_ UNUSED); -static int compare_var_name (const void *a_, const void *b_, void *v_ unused); -static unsigned hash_var_name (const void *a_, void *v_ unused); int @@ -191,13 +200,20 @@ cmd_t_test(void) if (! cmd.sbc_criteria) cmd.criteria=0.95; - if ( cmd.sbc_testval + cmd.sbc_groups + cmd.sbc_pairs != 1 ) - { - msg(SE, - _("Exactly one of TESTVAL, GROUPS or PAIRS subcommands is required") - ); - return CMD_FAILURE; - } + { + int m=0; + if (cmd.sbc_testval) ++m; + if (cmd.sbc_groups) ++m; + if (cmd.sbc_pairs) ++m; + + if ( m != 1) + { + msg(SE, + _("TESTVAL, GROUPS and PAIRS subcommands are mutually exclusive.") + ); + return CMD_FAILURE; + } + } if (cmd.sbc_testval) mode=T_1_SAMPLE; @@ -247,18 +263,21 @@ cmd_t_test(void) } - procedure(common_precalc,common_calc,common_postcalc); + procedure(common_precalc,common_calc,common_postcalc, NULL); switch(mode) { case T_1_SAMPLE: - procedure(one_sample_precalc,one_sample_calc,one_sample_postcalc); + procedure(one_sample_precalc,one_sample_calc,one_sample_postcalc, NULL); break; case T_PAIRED: - procedure(paired_precalc,paired_calc,paired_postcalc); + procedure(paired_precalc,paired_calc,paired_postcalc, NULL); + break; + case T_IND_SAMPLES: + procedure(group_precalc,group_calc,group_postcalc, NULL); + levene(groups, cmd.n_variables, cmd.v_variables); break; } - t_test_pool = pool_create (); @@ -267,9 +286,7 @@ cmd_t_test(void) ssbox_finalize(&stat_summary_box); if ( mode == T_PAIRED) - { - pscbox(&cmd); - } + pscbox(); trbox_create(&test_results_box,&cmd,mode); trbox_populate(&test_results_box,&cmd); @@ -278,12 +295,28 @@ cmd_t_test(void) pool_destroy (t_test_pool); t_test_pool=0; + + + n_pairs=0; + free(pairs); + pairs=0; + + + if ( mode == T_IND_SAMPLES) + { + int i; + /* Destroy any group statistics we created */ + for (i= 0 ; i < cmd.n_variables ; ++i ) + { + free(cmd.v_variables[i]->p.t_t.gs); + } + } return CMD_SUCCESS; } static int -tts_custom_groups (struct cmd_t_test *cmd unused) +tts_custom_groups (struct cmd_t_test *cmd UNUSED) { lex_match('='); @@ -348,10 +381,11 @@ tts_custom_groups (struct cmd_t_test *cmd unused) static int -tts_custom_pairs (struct cmd_t_test *cmd unused) +tts_custom_pairs (struct cmd_t_test *cmd UNUSED) { struct variable **vars; int n_vars; + int n_pairs_local; int n_before_WITH ; int n_after_WITH = -1; @@ -403,11 +437,11 @@ tts_custom_pairs (struct cmd_t_test *cmd unused) n_before_WITH, n_after_WITH ); return 0; } - n_pairs=n_before_WITH; + n_pairs_local=n_before_WITH; } else if (n_before_WITH > 0) /* WITH keyword given, but not PAIRED keyword */ { - n_pairs=n_before_WITH * n_after_WITH ; + n_pairs_local=n_before_WITH * n_after_WITH ; } else /* Neither WITH nor PAIRED keyword given */ { @@ -420,28 +454,29 @@ tts_custom_pairs (struct cmd_t_test *cmd unused) } /* how many ways can you pick 2 from n_vars ? */ - n_pairs = n_vars * (n_vars -1 ) /2 ; + n_pairs_local = n_vars * (n_vars -1 ) /2 ; } + /* Allocate storage for the pairs */ - pairs = xrealloc(pairs,sizeof(struct pair) *n_pairs); + pairs = xrealloc(pairs, sizeof(struct pair) * (n_pairs + n_pairs_local) ); /* Populate the pairs with the appropriate variables */ if ( paired ) { int i; - assert(n_pairs == n_vars/2); - for (i = 0; i < n_pairs ; ++i) + assert(n_pairs_local == n_vars/2); + for (i = 0; i < n_pairs_local ; ++i) { - pairs[i].v[0] = vars[i]; - pairs[i].v[1] = vars[i+n_pairs]; + pairs[i].v[n_pairs+0] = vars[i]; + pairs[i].v[n_pairs+1] = vars[i+n_pairs_local]; } } else if (n_before_WITH > 0) /* WITH keyword given, but not PAIRED keyword */ { int i,j; - int p=0; + int p=n_pairs; for(i=0 ; i < n_before_WITH ; ++i ) { @@ -456,7 +491,7 @@ tts_custom_pairs (struct cmd_t_test *cmd unused) else /* Neither WITH nor PAIRED given */ { int i,j; - int p=0; + int p=n_pairs; for(i=0 ; i < n_vars ; ++i ) { @@ -469,6 +504,8 @@ tts_custom_pairs (struct cmd_t_test *cmd unused) } } + n_pairs+=n_pairs_local; + return 1; } @@ -640,6 +677,8 @@ ssbox_independent_samples_populate(struct ssbox *ssb, for (i=0; i < cmd->n_variables; ++i) { + int g; + tab_text (ssb->t, 0, i*2+1, TAB_LEFT, cmd->v_variables[i]->name); if (val_lab1) @@ -647,10 +686,22 @@ ssbox_independent_samples_populate(struct ssbox *ssb, else tab_float(ssb->t, 1 ,i*2+1, TAB_LEFT, groups_values[0].f, 2,0); + if (val_lab2) tab_text (ssb->t, 1, i*2+1+1, TAB_LEFT, val_lab2); else tab_float(ssb->t, 1 ,i*2+1+1, TAB_LEFT, groups_values[1].f,2,0); + + /* Fill in the group statistics */ + for ( g=0; g < 2 ; ++g ) + { + struct group_statistics *gs = &cmd->v_variables[i]->p.t_t.gs[g]; + + tab_float(ssb->t, 2 ,i*2+g+1, TAB_RIGHT, gs->n, 2, 0); + tab_float(ssb->t, 3 ,i*2+g+1, TAB_RIGHT, gs->mean, 8, 2); + tab_float(ssb->t, 4 ,i*2+g+1, TAB_RIGHT, gs->std_dev, 8, 3); + tab_float(ssb->t, 5 ,i*2+g+1, TAB_RIGHT, gs->se_mean, 8, 3); + } } } @@ -660,7 +711,7 @@ void ssbox_paired_populate(struct ssbox *ssb, /* Initialize the paired values ssbox */ void -ssbox_paired_init(struct ssbox *this, struct cmd_t_test *cmd unused) +ssbox_paired_init(struct ssbox *this, struct cmd_t_test *cmd UNUSED) { int hsize=6; @@ -681,7 +732,7 @@ ssbox_paired_init(struct ssbox *this, struct cmd_t_test *cmd unused) /* Populate the ssbox for paired values */ void -ssbox_paired_populate(struct ssbox *ssb,struct cmd_t_test *cmd unused) +ssbox_paired_populate(struct ssbox *ssb,struct cmd_t_test *cmd UNUSED) { int i; @@ -695,19 +746,19 @@ ssbox_paired_populate(struct ssbox *ssb,struct cmd_t_test *cmd unused) for (j=0 ; j < 2 ; ++j) { - struct t_test_proc *ttp; + struct group_statistics *gs; - ttp=&pairs[i].v[j]->p.t_t; + gs=&pairs[i].v[j]->p.t_t.ugs; /* Titles */ tab_text (ssb->t, 1, i*2+j+1, TAB_LEFT, pairs[i].v[j]->name); /* Values */ - tab_float (ssb->t,2, i*2+j+1, TAB_RIGHT, ttp->mean, 8, 2); - tab_float (ssb->t,3, i*2+j+1, TAB_RIGHT, ttp->n, 2, 0); - tab_float (ssb->t,4, i*2+j+1, TAB_RIGHT, ttp->std_dev, 8, 3); - tab_float (ssb->t,5, i*2+j+1, TAB_RIGHT, ttp->se_mean, 8, 3); + tab_float (ssb->t,2, i*2+j+1, TAB_RIGHT, gs->mean, 8, 2); + tab_float (ssb->t,3, i*2+j+1, TAB_RIGHT, gs->n, 2, 0); + tab_float (ssb->t,4, i*2+j+1, TAB_RIGHT, gs->std_dev, 8, 3); + tab_float (ssb->t,5, i*2+j+1, TAB_RIGHT, gs->se_mean, 8, 3); } @@ -725,14 +776,14 @@ ssbox_one_sample_populate(struct ssbox *ssb, struct cmd_t_test *cmd) for (i=0; i < cmd->n_variables; ++i) { - struct t_test_proc *ttp; - ttp= &cmd->v_variables[i]->p.t_t; + struct group_statistics *gs; + gs= &cmd->v_variables[i]->p.t_t.ugs; tab_text (ssb->t, 0, i+1, TAB_LEFT, cmd->v_variables[i]->name); - tab_float (ssb->t,1, i+1, TAB_RIGHT, ttp->n, 2, 0); - tab_float (ssb->t,2, i+1, TAB_RIGHT, ttp->mean, 8, 2); - tab_float (ssb->t,3, i+1, TAB_RIGHT, ttp->std_dev, 8, 2); - tab_float (ssb->t,4, i+1, TAB_RIGHT, ttp->se_mean, 8, 3); + tab_float (ssb->t,1, i+1, TAB_RIGHT, gs->n, 2, 0); + tab_float (ssb->t,2, i+1, TAB_RIGHT, gs->mean, 8, 2); + tab_float (ssb->t,3, i+1, TAB_RIGHT, gs->std_dev, 8, 2); + tab_float (ssb->t,4, i+1, TAB_RIGHT, gs->se_mean, 8, 3); } } @@ -802,7 +853,7 @@ trbox_finalize(struct trbox *trb) /* Initialize the independent samples trbox */ void trbox_independent_samples_init(struct trbox *self, - struct cmd_t_test *cmd unused) + struct cmd_t_test *cmd UNUSED) { const int hsize=11; const int vsize=cmd->n_variables*2+3; @@ -819,7 +870,7 @@ trbox_independent_samples_init(struct trbox *self, tab_hline(self->t,TAL_1, hsize-2,hsize-1,2); tab_box(self->t,-1,-1,-1,TAL_1, hsize-2,2,hsize-1,vsize-1); tab_joint_text(self->t, 2, 0, 3, 0, - TAB_CENTER,_("Levine's Test for Equality of Variances")); + TAB_CENTER,_("Levene's Test for Equality of Variances")); tab_joint_text(self->t, 4,0,hsize-1,0, TAB_CENTER,_("t-test for Equality of Means")); @@ -849,19 +900,157 @@ trbox_independent_samples_populate(struct trbox *self, assert(self); for (i=0; i < cmd->n_variables; ++i) { + int which =1; + double p,q; + int status; + double bound; + + double t; + double df; + + double df1, df2; + + double pooled_variance; + double std_err_diff; + double mean_diff; + + struct group_statistics *gs0 = &cmd->v_variables[i]->p.t_t.gs[0]; + struct group_statistics *gs1 = &cmd->v_variables[i]->p.t_t.gs[1]; + tab_text (self->t, 0, i*2+3, TAB_LEFT, cmd->v_variables[i]->name); tab_text (self->t, 1, i*2+3, TAB_LEFT, _("Equal variances assumed")); + + tab_float(self->t, 2, i*2+3, TAB_CENTER, + cmd->v_variables[i]->p.t_t.levene, 8,3); + + + /* Now work out the significance of the Levene test */ + + which=1; df1 = 1; df2 = cmd->v_variables[i]->p.t_t.ugs.n - 2; + cdff(&which,&p,&q,&cmd->v_variables[i]->p.t_t.levene, + &df1,&df2,&status,&bound); + + if ( 0 != status ) + { + msg( SE, _("Error calculating F statistic (cdff returned %d)."),status); + } + + tab_float(self->t, 3, i*2+3, TAB_CENTER, q, 8,3 ); + + df = gs0->n + gs1->n - 2.0 ; + tab_float (self->t, 5, i*2+3, TAB_RIGHT, df, 2, 0); + + pooled_variance = ( (gs0->n )*sqr(gs0->s_std_dev) + + + (gs1->n )*sqr(gs1->s_std_dev) + ) / df ; + + t = (gs0->mean - gs1->mean) / sqrt(pooled_variance) ; + t /= sqrt((gs0->n + gs1->n)/(gs0->n*gs1->n)); + + tab_float (self->t, 4, i*2+3, TAB_RIGHT, t, 8, 3); + + + which=1; /* get p & q from t & df */ + cdft(&which, &p, &q, &t, &df, &status, &bound); + if ( 0 != status ) + { + msg( SE, _("Error calculating T statistic (cdft returned %d)."),status); + } + + tab_float(self->t, 6, i*2+3, TAB_RIGHT, 2.0*(t>0?q:p) , 8, 3); + + mean_diff = gs0->mean - gs1->mean; + tab_float(self->t, 7, i*2+3, TAB_RIGHT, mean_diff, 8, 3); + + + std_err_diff = sqrt( sqr(gs0->se_mean) + sqr(gs1->se_mean)); + tab_float(self->t, 8, i*2+3, TAB_RIGHT, std_err_diff, 8, 3); + + + /* Now work out the confidence interval */ + q = (1 - cmd->criteria)/2.0; /* 2-tailed test */ + p = 1 - q ; + which=2; /* Calc T from p,q and df */ + cdft(&which, &p, &q, &t, &df, &status, &bound); + if ( 0 != status ) + { + msg( SE, _("Error calculating T statistic (cdft returned %d)."),status); + } + + tab_float(self->t, 9, i*2+3, TAB_RIGHT, + mean_diff - t * std_err_diff, 8, 3); + + tab_float(self->t, 10, i*2+3, TAB_RIGHT, + mean_diff + t * std_err_diff, 8, 3); + + + { + double se2; + /* Now for the \sigma_1 != \sigma_2 case */ tab_text (self->t, 1, i*2+3+1, TAB_LEFT, _("Equal variances not assumed")); + + + se2 = (sqr(gs0->s_std_dev)/(gs0->n -1) ) + + (sqr(gs1->s_std_dev)/(gs1->n -1) ); + + t = mean_diff / sqrt(se2) ; + tab_float (self->t, 4, i*2+3+1, TAB_RIGHT, t, 8, 3); + + df = sqr(se2) / ( + (sqr(sqr(gs0->s_std_dev)/(gs0->n - 1 )) + /(gs0->n -1 ) + ) + + + (sqr(sqr(gs1->s_std_dev)/(gs1->n - 1 )) + /(gs1->n -1 ) + ) + ) ; + tab_float (self->t, 5, i*2+3+1, TAB_RIGHT, df, 8, 3); + + which=1; /* get p & q from t & df */ + cdft(&which, &p, &q, &t, &df, &status, &bound); + if ( 0 != status ) + { + msg( SE, _("Error calculating T statistic (cdft returned %d)."),status); + } + + tab_float(self->t, 6, i*2+3+1, TAB_RIGHT, 2.0*(t>0?q:p) , 8, 3); + + /* Now work out the confidence interval */ + q = (1 - cmd->criteria)/2.0; /* 2-tailed test */ + p = 1 - q ; + which=2; /* Calc T from p,q and df */ + cdft(&which, &p, &q, &t, &df, &status, &bound); + if ( 0 != status ) + { + msg( SE, _("Error calculating T statistic (cdft returned %d)."),status); + } + + + tab_float(self->t, 7, i*2+3+1, TAB_RIGHT, mean_diff, 8, 3); + + + tab_float(self->t, 8, i*2+3+1, TAB_RIGHT, std_err_diff, 8, 3); + + + tab_float(self->t, 9, i*2+3+1, TAB_RIGHT, + mean_diff - t * std_err_diff, 8, 3); + + tab_float(self->t, 10, i*2+3+1, TAB_RIGHT, + mean_diff + t * std_err_diff, 8, 3); + + } } } /* Initialize the paired samples trbox */ void trbox_paired_init(struct trbox *self, - struct cmd_t_test *cmd unused) + struct cmd_t_test *cmd UNUSED) { const int hsize=10; @@ -896,7 +1085,7 @@ trbox_paired_init(struct trbox *self, /* Populate the paired samples trbox */ void trbox_paired_populate(struct trbox *trb, - struct cmd_t_test *cmd unused) + struct cmd_t_test *cmd UNUSED) { int i; @@ -911,10 +1100,10 @@ trbox_paired_populate(struct trbox *trb, struct variable *v0 = pairs[i].v[0]; struct variable *v1 = pairs[i].v[1]; - struct t_test_proc *ttp0 = &v0->p.t_t; - struct t_test_proc *ttp1 = &v1->p.t_t; + struct group_statistics *gs0 = &v0->p.t_t.ugs; + struct group_statistics *gs1 = &v1->p.t_t.ugs; - double n = ttp0->n; + double n = gs0->n; double t; double df = n - 1; @@ -948,10 +1137,10 @@ trbox_paired_populate(struct trbox *trb, tab_float(trb->t, 6, i+3, TAB_RIGHT, pairs[i].mean_diff + t * se_mean , 8, 4); - t = ( ttp0->mean - ttp1->mean) + t = ( gs0->mean - gs1->mean) / sqrt ( - ( sqr(ttp0->s_std_dev) + sqr(ttp1->s_std_dev) - - 2 * pairs[i].correlation * ttp0->s_std_dev * ttp1->s_std_dev ) + ( sqr(gs0->s_std_dev) + sqr(gs1->s_std_dev) - + 2 * pairs[i].correlation * gs0->s_std_dev * gs1->s_std_dev ) / (n-1) ) ; @@ -969,11 +1158,9 @@ trbox_paired_populate(struct trbox *trb, } - tab_float(trb->t, 9, i+3, TAB_RIGHT, p*2.0 , 8, 3); - + tab_float(trb->t, 9, i+3, TAB_RIGHT, 2.0*(t>0?q:p) , 8, 3); } - } /* Initialize the one sample trbox */ @@ -1028,18 +1215,18 @@ trbox_one_sample_populate(struct trbox *trb, struct cmd_t_test *cmd) double df; int status; double bound; - struct t_test_proc *ttp; - ttp= &cmd->v_variables[i]->p.t_t; + struct group_statistics *gs; + gs= &cmd->v_variables[i]->p.t_t.ugs; tab_text (trb->t, 0, i+3, TAB_LEFT, cmd->v_variables[i]->name); - t = (ttp->mean - cmd->n_testval ) * sqrt(ttp->n) / ttp->std_dev ; + t = (gs->mean - cmd->n_testval ) * sqrt(gs->n) / gs->std_dev ; tab_float (trb->t, 1, i+3, TAB_RIGHT, t, 8,3); /* degrees of freedom */ - df = ttp->n - 1; + df = gs->n - 1; tab_float (trb->t, 2, i+3, TAB_RIGHT, df, 8,0); @@ -1051,10 +1238,11 @@ trbox_one_sample_populate(struct trbox *trb, struct cmd_t_test *cmd) } - /* Multiply by 2 to get 2-tailed significance */ - tab_float (trb->t, 3, i+3, TAB_RIGHT, q*2.0, 8,3); + /* Multiply by 2 to get 2-tailed significance, makeing sure we've got + the correct tail*/ + tab_float (trb->t, 3, i+3, TAB_RIGHT, 2.0*(t>0?q:p), 8,3); - tab_float (trb->t, 4, i+3, TAB_RIGHT, ttp->mean_diff, 8,3); + tab_float (trb->t, 4, i+3, TAB_RIGHT, gs->mean_diff, 8,3); q = (1 - cmd->criteria)/2.0; /* 2-tailed test */ @@ -1067,10 +1255,10 @@ trbox_one_sample_populate(struct trbox *trb, struct cmd_t_test *cmd) } tab_float (trb->t, 5, i+3, TAB_RIGHT, - ttp->mean_diff - t * ttp->se_mean, 8,4); + gs->mean_diff - t * gs->se_mean, 8,4); tab_float (trb->t, 6, i+3, TAB_RIGHT, - ttp->mean_diff + t * ttp->se_mean, 8,4); + gs->mean_diff + t * gs->se_mean, 8,4); } } @@ -1099,7 +1287,7 @@ trbox_base_finalize(struct trbox *trb) /* Create , populate and submit the Paired Samples Correlation box */ void -pscbox(struct cmd_t_test *cmd) +pscbox(void) { const int rows=1+n_pairs; const int cols=5; @@ -1122,7 +1310,6 @@ pscbox(struct cmd_t_test *cmd) tab_text(table, 3,0, TAB_CENTER | TAT_TITLE, _("Correlation")); tab_text(table, 4,0, TAB_CENTER | TAT_TITLE, _("Sig.")); - for (i=0; i < n_pairs; ++i) { int which =1; @@ -1131,7 +1318,7 @@ pscbox(struct cmd_t_test *cmd) int status; double bound; - double df = pairs[i].v[0]->p.t_t.n -2; + double df = pairs[i].v[0]->p.t_t.ugs.n -2; double correlation_t = pairs[i].correlation * sqrt(df) / @@ -1148,7 +1335,7 @@ pscbox(struct cmd_t_test *cmd) /* row data */ tab_float(table, 3, i+1, TAB_RIGHT, pairs[i].correlation, 8, 3); - tab_float(table, 2, i+1, TAB_RIGHT, pairs[i].v[0]->p.t_t.n , 4, 0); + tab_float(table, 2, i+1, TAB_RIGHT, pairs[i].v[0]->p.t_t.ugs.n , 4, 0); cdft(&which, &p, &q, &correlation_t, &df, &status, &bound); @@ -1159,10 +1346,7 @@ pscbox(struct cmd_t_test *cmd) } - tab_float(table, 4, i+1, TAB_RIGHT, q*2.0, 8, 3); - - - + tab_float(table, 4, i+1, TAB_RIGHT, 2.0*(correlation_t>0?q:p), 8, 3); } @@ -1175,7 +1359,7 @@ pscbox(struct cmd_t_test *cmd) /* Per case calculations common to all variants of the T test */ static int -common_calc (struct ccase *c) +common_calc (struct ccase *c, void *aux UNUSED) { int i; @@ -1183,17 +1367,17 @@ common_calc (struct ccase *c) for(i=0; i< cmd.n_variables ; ++i) { - struct t_test_proc *ttp; + struct group_statistics *gs; struct variable *v = cmd.v_variables[i]; union value *val = &c->data[v->fv]; - ttp= &cmd.v_variables[i]->p.t_t; + gs= &cmd.v_variables[i]->p.t_t.ugs; if (val->f != SYSMIS) { - ttp->n+=weight; - ttp->sum+=weight * val->f; - ttp->ssq+=weight * val->f * val->f; + gs->n+=weight; + gs->sum+=weight * val->f; + gs->ssq+=weight * val->f * val->f; } } return 0; @@ -1201,51 +1385,51 @@ common_calc (struct ccase *c) /* Pre calculations common to all variants of the T test */ static void -common_precalc (void) +common_precalc (void *aux UNUSED) { int i=0; for(i=0; i< cmd.n_variables ; ++i) { - struct t_test_proc *ttp; - ttp= &cmd.v_variables[i]->p.t_t; + struct group_statistics *gs; + gs= &cmd.v_variables[i]->p.t_t.ugs; - ttp->sum=0; - ttp->n=0; - ttp->ssq=0; - ttp->sum_diff=0; + gs->sum=0; + gs->n=0; + gs->ssq=0; + gs->sum_diff=0; } } /* Post calculations common to all variants of the T test */ void -common_postcalc (void) +common_postcalc (void *aux UNUSED) { int i=0; for(i=0; i< cmd.n_variables ; ++i) { - struct t_test_proc *ttp; - ttp= &cmd.v_variables[i]->p.t_t; + struct group_statistics *gs; + gs= &cmd.v_variables[i]->p.t_t.ugs; - ttp->mean=ttp->sum / ttp->n; - ttp->s_std_dev= sqrt( - ( (ttp->ssq / ttp->n ) - ttp->mean * ttp->mean ) + gs->mean=gs->sum / gs->n; + gs->s_std_dev= sqrt( + ( (gs->ssq / gs->n ) - gs->mean * gs->mean ) ) ; - ttp->std_dev= sqrt( - ttp->n/(ttp->n-1) * - ( (ttp->ssq / ttp->n ) - ttp->mean * ttp->mean ) + gs->std_dev= sqrt( + gs->n/(gs->n-1) * + ( (gs->ssq / gs->n ) - gs->mean * gs->mean ) ) ; - ttp->se_mean = ttp->std_dev / sqrt(ttp->n); - ttp->mean_diff= ttp->sum_diff / ttp->n; + gs->se_mean = gs->std_dev / sqrt(gs->n); + gs->mean_diff= gs->sum_diff / gs->n; } } /* Per case calculations for one sample t test */ static int -one_sample_calc (struct ccase *c) +one_sample_calc (struct ccase *c, void *aux UNUSED) { int i; @@ -1253,14 +1437,14 @@ one_sample_calc (struct ccase *c) for(i=0; i< cmd.n_variables ; ++i) { - struct t_test_proc *ttp; + struct group_statistics *gs; struct variable *v = cmd.v_variables[i]; union value *val = &c->data[v->fv]; - ttp= &cmd.v_variables[i]->p.t_t; + gs= &cmd.v_variables[i]->p.t_t.ugs; if (val->f != SYSMIS) - ttp->sum_diff += weight * (val->f - cmd.n_testval); + gs->sum_diff += weight * (val->f - cmd.n_testval); } return 0; @@ -1268,39 +1452,39 @@ one_sample_calc (struct ccase *c) /* Pre calculations for one sample t test */ static void -one_sample_precalc (void) +one_sample_precalc (void *aux UNUSED) { int i=0; for(i=0; i< cmd.n_variables ; ++i) { - struct t_test_proc *ttp; - ttp= &cmd.v_variables[i]->p.t_t; + struct group_statistics *gs; + gs= &cmd.v_variables[i]->p.t_t.ugs; - ttp->sum_diff=0; + gs->sum_diff=0; } } /* Post calculations for one sample t test */ static void -one_sample_postcalc (void) +one_sample_postcalc (void *aux UNUSED) { int i=0; for(i=0; i< cmd.n_variables ; ++i) { - struct t_test_proc *ttp; - ttp= &cmd.v_variables[i]->p.t_t; + struct group_statistics *gs; + gs= &cmd.v_variables[i]->p.t_t.ugs; - ttp->mean_diff = ttp->sum_diff / ttp->n ; + gs->mean_diff = gs->sum_diff / gs->n ; } } static int -compare_var_name (const void *a_, const void *b_, void *v_ unused) +compare_var_name (const void *a_, const void *b_, void *v_ UNUSED) { const struct variable *a = a_; const struct variable *b = b_; @@ -1309,7 +1493,7 @@ compare_var_name (const void *a_, const void *b_, void *v_ unused) } static unsigned -hash_var_name (const void *a_, void *v_ unused) +hash_var_name (const void *a_, void *v_ UNUSED) { const struct variable *a = a_; @@ -1317,8 +1501,9 @@ hash_var_name (const void *a_, void *v_ unused) } + static void -paired_precalc (void) +paired_precalc (void *aux UNUSED) { int i; @@ -1331,8 +1516,9 @@ paired_precalc (void) } + static int -paired_calc (struct ccase *c) +paired_calc (struct ccase *c, void *aux UNUSED) { int i; @@ -1344,31 +1530,30 @@ paired_calc (struct ccase *c) union value *val0 = &c->data[v0->fv]; union value *val1 = &c->data[v1->fv]; - pairs[i].correlation += ( val0->f - pairs[i].v[0]->p.t_t.mean ) + pairs[i].correlation += ( val0->f - pairs[i].v[0]->p.t_t.ugs.mean ) * - ( val1->f - pairs[i].v[1]->p.t_t.mean ); + ( val1->f - pairs[i].v[1]->p.t_t.ugs.mean ); pairs[i].sum_of_diffs += val0->f - val1->f ; pairs[i].ssq_diffs += sqr(val0->f - val1->f); } - return 0; } static void -paired_postcalc (void) +paired_postcalc (void *aux UNUSED) { int i; for(i=0; i < n_pairs ; ++i ) { - const double n = pairs[i].v[0]->p.t_t.n ; + const double n = pairs[i].v[0]->p.t_t.ugs.n ; - pairs[i].correlation /= pairs[i].v[0]->p.t_t.std_dev * - pairs[i].v[1]->p.t_t.std_dev ; - pairs[i].correlation /= pairs[i].v[0]->p.t_t.n -1; + pairs[i].correlation /= pairs[i].v[0]->p.t_t.ugs.std_dev * + pairs[i].v[1]->p.t_t.ugs.std_dev ; + pairs[i].correlation /= pairs[i].v[0]->p.t_t.ugs.n -1; pairs[i].mean_diff = pairs[i].sum_of_diffs / n ; @@ -1379,6 +1564,101 @@ paired_postcalc (void) - sqr(pairs[i].mean_diff ) ) ); + } +} + +static int +get_group(const union value *val, struct variable *var) +{ + if ( 0 == compare_values(val,&groups_values[0],var->width) ) + return 0; + else if (0 == compare_values(val,&groups_values[1],var->width) ) + return 1; + /* Never reached */ + assert(0); + return -1; +} + + +static void +group_precalc (void *aux UNUSED) +{ + int i; + int j; + + for(i=0; i< cmd.n_variables ; ++i) + { + struct t_test_proc *ttpr = &cmd.v_variables[i]->p.t_t; + + /* There's always 2 groups for a T - TEST */ + ttpr->n_groups = 2; + ttpr->gs = xmalloc(sizeof(struct group_statistics) * 2) ; + + for (j=0 ; j < 2 ; ++j) + { + ttpr->gs[j].sum=0; + ttpr->gs[j].n=0; + ttpr->gs[j].ssq=0; + ttpr->gs[j].id = groups_values[j]; + } } + } + +static int +group_calc (struct ccase *c, void *aux UNUSED) +{ + int i; + union value *gv = &c->data[groups->fv]; + + double weight = dict_get_case_weight(default_dict,c); + + gv = &c->data[groups->fv]; + + for(i=0; i< cmd.n_variables ; ++i) + { + int g = get_group(gv,groups); + + struct group_statistics *gs = &cmd.v_variables[i]->p.t_t.gs[g]; + + union value *val=&c->data[cmd.v_variables[i]->fv]; + + gs->n+=weight; + gs->sum+=weight * val->f; + gs->ssq+=weight * sqr(val->f); + } + + return 0; +} + + +static void +group_postcalc (void *aux UNUSED) +{ + int i; + int j; + + for(i=0; i< cmd.n_variables ; ++i) + { + for (j=0 ; j < 2 ; ++j) + { + struct group_statistics *gs; + gs=&cmd.v_variables[i]->p.t_t.gs[j]; + + gs->mean = gs->sum / gs->n; + + gs->s_std_dev= sqrt( + ( (gs->ssq / gs->n ) - gs->mean * gs->mean ) + ) ; + + gs->std_dev= sqrt( + gs->n/(gs->n-1) * + ( (gs->ssq / gs->n ) - gs->mean * gs->mean ) + ) ; + + gs->se_mean = gs->std_dev / sqrt(gs->n); + } + } +} +