X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Ft-test.q;h=4c4135ba732d97f4f5f75c095bd03c7a3bf8da54;hb=fa33e52b61bc3cb1018ad2759880f5ecaf65653e;hp=c76bd2d66937bc2801b74b5c5cc525fb240e40a8;hpb=14e7292894533c5491a774a2d749386362660812;p=pspp-builds.git diff --git a/src/t-test.q b/src/t-test.q index c76bd2d6..4c4135ba 100644 --- a/src/t-test.q +++ b/src/t-test.q @@ -20,25 +20,26 @@ 02111-1307, USA. */ #include -#include +#include +#include "error.h" #include #include #include #include "alloc.h" #include "str.h" -#include "dcdflib/cdflib.h" #include "command.h" #include "lexer.h" #include "error.h" #include "magic.h" +#include "misc.h" #include "tab.h" #include "som.h" #include "value-labels.h" #include "var.h" #include "vfm.h" #include "hash.h" -#include "stats.h" #include "t-test.h" +#include "casefile.h" #include "levene.h" /* (specification) @@ -56,7 +57,7 @@ /* (functions) */ -static struct cmd_t_test cmd; + /* Function to use for testing for missing values */ static is_missing_func value_is_missing; @@ -77,10 +78,8 @@ static enum comparison criteria[2]; static int n_pairs = 0 ; struct pair { -#if 1 /* The variables comprising the pair */ struct variable *v[2]; -#endif /* The number of valid variable pairs */ double n; @@ -183,41 +182,39 @@ enum { }; -static int common_calc (struct ccase *, void *); -static void common_precalc (void *); -static void common_postcalc (void *); +static int common_calc (const struct ccase *, void *); +static void common_precalc (struct cmd_t_test *); +static void common_postcalc (struct cmd_t_test *); -static int one_sample_calc (struct ccase *, void *); -static void one_sample_precalc (void *); -static void one_sample_postcalc (void *); +static int one_sample_calc (const struct ccase *, void *); +static void one_sample_precalc (struct cmd_t_test *); +static void one_sample_postcalc (struct cmd_t_test *); -static int paired_calc (struct ccase *, void *); -static void paired_precalc (void *); -static void paired_postcalc (void *); +static int paired_calc (const struct ccase *, void *); +static void paired_precalc (struct cmd_t_test *); +static void paired_postcalc (struct cmd_t_test *); -static void group_precalc (void *); -static int group_calc (struct ccase *, void *); -static void group_postcalc (void *); +static void group_precalc (struct cmd_t_test *); +static int group_calc (const struct ccase *, struct cmd_t_test *); +static void group_postcalc (struct cmd_t_test *); 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 void calculate(const struct casefile *cf, void *_mode); + +static int mode; +static struct cmd_t_test cmd; + +static int bad_weight_warn; int cmd_t_test(void) { - int mode; - struct ssbox stat_summary_box; - struct trbox test_results_box; - if (!lex_force_match_id ("T")) - return CMD_FAILURE; - - lex_match ('-'); - lex_match_id ("TEST"); if ( !parse_t_test(&cmd) ) return CMD_FAILURE; @@ -286,6 +283,12 @@ cmd_t_test(void) hsh_destroy(hash); } } + else if ( !cmd.sbc_variables) + { + msg(SE, _("One or more VARIABLES must be specified.")); + return CMD_FAILURE; + } + /* If /MISSING=INCLUDE is set, then user missing values are ignored */ if (cmd.incl == TTS_INCLUDE ) @@ -293,36 +296,9 @@ cmd_t_test(void) else value_is_missing = is_missing; - procedure_with_splits (common_precalc, common_calc, common_postcalc, NULL); - - switch(mode) - { - case T_1_SAMPLE: - procedure_with_splits (one_sample_precalc, one_sample_calc, - one_sample_postcalc, NULL); - break; - case T_PAIRED: - procedure_with_splits (paired_precalc, paired_calc, paired_postcalc, - NULL); - break; - case T_IND_SAMPLES: - procedure_with_splits(group_precalc,group_calc,group_postcalc, NULL); - levene(indep_var, cmd.n_variables, cmd.v_variables, - (cmd.miss == TTS_LISTWISE)?LEV_LISTWISE:LEV_ANALYSIS , - value_is_missing); - break; - } - - ssbox_create(&stat_summary_box,&cmd,mode); - ssbox_populate(&stat_summary_box,&cmd); - ssbox_finalize(&stat_summary_box); + bad_weight_warn = 1; - if ( mode == T_PAIRED) - pscbox(); - - trbox_create(&test_results_box,&cmd,mode); - trbox_populate(&test_results_box,&cmd); - trbox_finalize(&test_results_box); + multipass_procedure_with_splits (calculate, &cmd); n_pairs=0; free(pairs); @@ -927,8 +903,8 @@ trbox_independent_samples_init(struct trbox *self, tab_text(self->t,10,2, TAB_CENTER | TAT_TITLE,_("Upper")); tab_joint_text(self->t, 9, 1, 10, 1, TAB_CENTER | TAT_PRINTF, - _("%d%% Confidence Interval of the Difference"), - (int)round(cmd->criteria*100.0)); + _("%g%% Confidence Interval of the Difference"), + cmd->criteria*100.0); } @@ -942,10 +918,7 @@ 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; @@ -967,26 +940,18 @@ trbox_independent_samples_populate(struct trbox *self, 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); - } + df1 = 1; df2 = cmd->v_variables[i]->p.t_t.ugs.n - 2; + q = gsl_cdf_fdist_Q(cmd->v_variables[i]->p.t_t.levene, df1, df2); 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) + pooled_variance = ( (gs0->n )*pow2(gs0->s_std_dev) + - (gs1->n )*sqr(gs1->s_std_dev) + (gs1->n )*pow2(gs1->s_std_dev) ) / df ; t = (gs0->mean - gs1->mean) / sqrt(pooled_variance) ; @@ -994,13 +959,8 @@ trbox_independent_samples_populate(struct trbox *self, 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); - } + p = gsl_cdf_tdist_P(t, df); + q = gsl_cdf_tdist_Q(t, df); tab_float(self->t, 6, i*2+3, TAB_RIGHT, 2.0*(t>0?q:p) , 8, 3); @@ -1008,20 +968,14 @@ trbox_independent_samples_populate(struct trbox *self, 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)); + std_err_diff = sqrt( pow2(gs0->se_mean) + pow2(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); - } + t = gsl_cdf_tdist_Qinv(q,df); tab_float(self->t, 9, i*2+3, TAB_RIGHT, mean_diff - t * std_err_diff, 8, 3); @@ -1036,42 +990,32 @@ trbox_independent_samples_populate(struct trbox *self, TAB_LEFT, _("Equal variances not assumed")); - se2 = (sqr(gs0->s_std_dev)/(gs0->n -1) ) + - (sqr(gs1->s_std_dev)/(gs1->n -1) ); + se2 = (pow2(gs0->s_std_dev)/(gs0->n -1) ) + + (pow2(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 )) + df = pow2(se2) / ( + (pow2(pow2(gs0->s_std_dev)/(gs0->n - 1 )) /(gs0->n -1 ) ) + - (sqr(sqr(gs1->s_std_dev)/(gs1->n - 1 )) + (pow2(pow2(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); - } + p = gsl_cdf_tdist_P(t, df); + q = gsl_cdf_tdist_Q(t, df); 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); - } + t = gsl_cdf_tdist_Qinv(q, df); tab_float(self->t, 7, i*2+3+1, TAB_RIGHT, mean_diff, 8, 3); @@ -1111,8 +1055,8 @@ trbox_paired_init(struct trbox *self, tab_vline(self->t,TAL_0,6,0,1); tab_joint_text(self->t, 5, 1, 6, 1, TAB_CENTER | TAT_PRINTF, - _("%d%% Confidence Interval of the Difference"), - (int)round(cmd->criteria*100.0)); + _("%g%% Confidence Interval of the Difference"), + cmd->criteria*100.0); tab_text (self->t, 2, 2, TAB_CENTER | TAT_TITLE, _("Mean")); tab_text (self->t, 3, 2, TAB_CENTER | TAT_TITLE, _("Std. Deviation")); @@ -1133,10 +1077,7 @@ trbox_paired_populate(struct trbox *trb, for (i=0; i < n_pairs; ++i) { - int which =1; double p,q; - int status; - double bound; double se_mean; double n = pairs[i].n; @@ -1158,14 +1099,8 @@ trbox_paired_populate(struct trbox *trb, /* 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); - } + t = gsl_cdf_tdist_Qinv(q, df); tab_float(trb->t, 5, i+3, TAB_RIGHT, pairs[i].mean_diff - t * se_mean , 8, 4); @@ -1175,7 +1110,7 @@ trbox_paired_populate(struct trbox *trb, t = (pairs[i].mean[0] - pairs[i].mean[1]) / sqrt ( - ( sqr (pairs[i].s_std_dev[0]) + sqr (pairs[i].s_std_dev[1]) - + ( pow2 (pairs[i].s_std_dev[0]) + pow2 (pairs[i].s_std_dev[1]) - 2 * pairs[i].correlation * pairs[i].s_std_dev[0] * pairs[i].s_std_dev[1] ) / (n - 1) @@ -1186,13 +1121,8 @@ trbox_paired_populate(struct trbox *trb, /* Degrees of freedom */ tab_float(trb->t, 8, i+3, TAB_RIGHT, df , 2, 0 ); - which=1; - cdft(&which, &p, &q, &t, &df, &status, &bound); - if ( 0 != status ) - { - msg( SE, _("Error calculating T statistic (cdft returned %d)."),status); - } - + p = gsl_cdf_tdist_P(t,df); + q = gsl_cdf_tdist_P(t,df); tab_float(trb->t, 9, i+3, TAB_RIGHT, 2.0*(t>0?q:p) , 8, 3); @@ -1220,8 +1150,8 @@ trbox_one_sample_init(struct trbox *self, struct cmd_t_test *cmd ) tab_joint_text(self->t,5,1,6,1,TAB_CENTER | TAT_PRINTF, - _("%d%% Confidence Interval of the Difference"), - (int)round(cmd->criteria*100.0)); + _("%g%% Confidence Interval of the Difference"), + cmd->criteria*100.0); tab_vline(self->t,TAL_0,6,1,1); tab_hline(self->t,TAL_1,5,6,2); @@ -1245,12 +1175,9 @@ trbox_one_sample_populate(struct trbox *trb, struct cmd_t_test *cmd) for (i=0; i < cmd->n_variables; ++i) { - int which =1; double t; double p,q; double df; - int status; - double bound; struct group_statistics *gs; gs= &cmd->v_variables[i]->p.t_t.ugs; @@ -1266,13 +1193,8 @@ trbox_one_sample_populate(struct trbox *trb, struct cmd_t_test *cmd) tab_float (trb->t, 2, i+3, TAB_RIGHT, df, 8,0); - cdft(&which, &p, &q, &t, &df, &status, &bound); - - if ( 0 != status ) - { - msg( SE, _("Error calculating T statistic (cdft returned %d)."),status); - } - + p = gsl_cdf_tdist_P(t, df); + q = gsl_cdf_tdist_Q(t, df); /* Multiply by 2 to get 2-tailed significance, makeing sure we've got the correct tail*/ @@ -1282,13 +1204,7 @@ trbox_one_sample_populate(struct trbox *trb, struct cmd_t_test *cmd) 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); - } + t = gsl_cdf_tdist_Qinv(q, df); tab_float (trb->t, 5, i+3, TAB_RIGHT, gs->mean_diff - t * gs->se_mean, 8,4); @@ -1348,17 +1264,13 @@ pscbox(void) for (i=0; i < n_pairs; ++i) { - int which =1; double p,q; - int status; - double bound; - double df = pairs[i].n -2; double correlation_t = pairs[i].correlation * sqrt(df) / - sqrt(1 - sqr(pairs[i].correlation)); + sqrt(1 - pow2(pairs[i].correlation)); /* row headings */ @@ -1373,11 +1285,8 @@ pscbox(void) tab_float(table, 2, i+1, TAB_RIGHT, pairs[i].n, 4, 0); tab_float(table, 3, i+1, TAB_RIGHT, pairs[i].correlation, 8, 3); - cdft(&which, &p, &q, &correlation_t, &df, &status, &bound); - if ( 0 != status ) - { - msg( SE, _("Error calculating T statistic (cdft returned %d)."),status); - } + p = gsl_cdf_tdist_P(correlation_t, df); + q = gsl_cdf_tdist_Q(correlation_t, df); tab_float(table, 4, i+1, TAB_RIGHT, 2.0*(correlation_t>0?q:p), 8, 3); } @@ -1391,20 +1300,21 @@ pscbox(void) /* Per case calculations common to all variants of the T test */ static int -common_calc (struct ccase *c, void *aux UNUSED) +common_calc (const struct ccase *c, void *_cmd) { int i; + struct cmd_t_test *cmd = (struct cmd_t_test *)_cmd; - double weight = dict_get_case_weight(default_dict,c); + double weight = dict_get_case_weight(default_dict,c,&bad_weight_warn); /* Skip the entire case if /MISSING=LISTWISE is set */ - if ( cmd.miss == TTS_LISTWISE ) + if ( cmd->miss == TTS_LISTWISE ) { - for(i=0; i< cmd.n_variables ; ++i) + for(i=0; i< cmd->n_variables ; ++i) { - struct variable *v = cmd.v_variables[i]; - union value *val = &c->data[v->fv]; + struct variable *v = cmd->v_variables[i]; + const union value *val = &c->data[v->fv]; if (value_is_missing(val,v) ) { @@ -1414,9 +1324,9 @@ common_calc (struct ccase *c, void *aux UNUSED) } /* Listwise has to be implicit if the independent variable is missing ?? */ - if ( cmd.sbc_groups ) + if ( cmd->sbc_groups ) { - union value *gv = &c->data[indep_var->fv]; + const union value *gv = &c->data[indep_var->fv]; if ( value_is_missing(gv,indep_var) ) { return 0; @@ -1424,13 +1334,13 @@ common_calc (struct ccase *c, void *aux UNUSED) } - for(i=0; i< cmd.n_variables ; ++i) + for(i=0; i< cmd->n_variables ; ++i) { struct group_statistics *gs; - struct variable *v = cmd.v_variables[i]; - union value *val = &c->data[v->fv]; + struct variable *v = cmd->v_variables[i]; + const union value *val = &c->data[v->fv]; - gs= &cmd.v_variables[i]->p.t_t.ugs; + gs= &cmd->v_variables[i]->p.t_t.ugs; if (! value_is_missing(val,v) ) { @@ -1444,14 +1354,14 @@ common_calc (struct ccase *c, void *aux UNUSED) /* Pre calculations common to all variants of the T test */ static void -common_precalc (void *aux UNUSED) +common_precalc ( struct cmd_t_test *cmd ) { int i=0; - for(i=0; i< cmd.n_variables ; ++i) + for(i=0; i< cmd->n_variables ; ++i) { struct group_statistics *gs; - gs= &cmd.v_variables[i]->p.t_t.ugs; + gs= &cmd->v_variables[i]->p.t_t.ugs; gs->sum=0; gs->n=0; @@ -1462,14 +1372,15 @@ common_precalc (void *aux UNUSED) /* Post calculations common to all variants of the T test */ void -common_postcalc (void *aux UNUSED) +common_postcalc ( struct cmd_t_test *cmd ) { int i=0; - for(i=0; i< cmd.n_variables ; ++i) + + for(i=0; i< cmd->n_variables ; ++i) { struct group_statistics *gs; - gs= &cmd.v_variables[i]->p.t_t.ugs; + gs= &cmd->v_variables[i]->p.t_t.ugs; gs->mean=gs->sum / gs->n; gs->s_std_dev= sqrt( @@ -1488,19 +1399,21 @@ common_postcalc (void *aux UNUSED) /* Per case calculations for one sample t test */ static int -one_sample_calc (struct ccase *c, void *aux UNUSED) +one_sample_calc (const struct ccase *c, void *cmd_) { int i; + struct cmd_t_test *cmd = (struct cmd_t_test *)cmd_; - double weight = dict_get_case_weight(default_dict,c); + + double weight = dict_get_case_weight(default_dict,c,&bad_weight_warn); /* Skip the entire case if /MISSING=LISTWISE is set */ - if ( cmd.miss == TTS_LISTWISE ) + if ( cmd->miss == TTS_LISTWISE ) { - for(i=0; i< cmd.n_variables ; ++i) + for(i=0; i< cmd->n_variables ; ++i) { - struct variable *v = cmd.v_variables[i]; - union value *val = &c->data[v->fv]; + struct variable *v = cmd->v_variables[i]; + const union value *val = &c->data[v->fv]; if (value_is_missing(val,v) ) { @@ -1509,16 +1422,16 @@ one_sample_calc (struct ccase *c, void *aux UNUSED) } } - for(i=0; i< cmd.n_variables ; ++i) + for(i=0; i< cmd->n_variables ; ++i) { struct group_statistics *gs; - struct variable *v = cmd.v_variables[i]; - union value *val = &c->data[v->fv]; + struct variable *v = cmd->v_variables[i]; + const union value *val = &c->data[v->fv]; - gs= &cmd.v_variables[i]->p.t_t.ugs; + gs= &cmd->v_variables[i]->p.t_t.ugs; if ( ! value_is_missing(val,v)) - gs->sum_diff += weight * (val->f - cmd.n_testval); + gs->sum_diff += weight * (val->f - cmd->n_testval); } return 0; @@ -1526,14 +1439,14 @@ one_sample_calc (struct ccase *c, void *aux UNUSED) /* Pre calculations for one sample t test */ static void -one_sample_precalc (void *aux UNUSED) +one_sample_precalc ( struct cmd_t_test *cmd ) { - int i=0; - - for(i=0; i< cmd.n_variables ; ++i) + int i=0; + + for(i=0; i< cmd->n_variables ; ++i) { struct group_statistics *gs; - gs= &cmd.v_variables[i]->p.t_t.ugs; + gs= &cmd->v_variables[i]->p.t_t.ugs; gs->sum_diff=0; } @@ -1541,16 +1454,15 @@ one_sample_precalc (void *aux UNUSED) /* Post calculations for one sample t test */ static void -one_sample_postcalc (void *aux UNUSED) +one_sample_postcalc (struct cmd_t_test *cmd) { int i=0; - for(i=0; i< cmd.n_variables ; ++i) + for(i=0; i< cmd->n_variables ; ++i) { struct group_statistics *gs; - gs= &cmd.v_variables[i]->p.t_t.ugs; + gs= &cmd->v_variables[i]->p.t_t.ugs; - gs->mean_diff = gs->sum_diff / gs->n ; } } @@ -1577,7 +1489,7 @@ hash_var_name (const void *a_, void *v_ UNUSED) static void -paired_precalc (void *aux UNUSED) +paired_precalc (struct cmd_t_test *cmd UNUSED) { int i; @@ -1596,23 +1508,25 @@ paired_precalc (void *aux UNUSED) static int -paired_calc (struct ccase *c, void *aux UNUSED) +paired_calc (const struct ccase *c, void *cmd_) { int i; - double weight = dict_get_case_weight(default_dict,c); + struct cmd_t_test *cmd = (struct cmd_t_test *) cmd_; + + double weight = dict_get_case_weight(default_dict,c,&bad_weight_warn); /* Skip the entire case if /MISSING=LISTWISE is set , AND one member of a pair is missing */ - if ( cmd.miss == TTS_LISTWISE ) + if ( cmd->miss == TTS_LISTWISE ) { for(i=0; i < n_pairs ; ++i ) { struct variable *v0 = pairs[i].v[0]; struct variable *v1 = pairs[i].v[1]; - union value *val0 = &c->data[v0->fv]; - union value *val1 = &c->data[v1->fv]; + const union value *val0 = &c->data[v0->fv]; + const union value *val1 = &c->data[v1->fv]; if ( value_is_missing(val0,v0) || value_is_missing(val1,v1) ) @@ -1627,8 +1541,8 @@ paired_calc (struct ccase *c, void *aux UNUSED) struct variable *v0 = pairs[i].v[0]; struct variable *v1 = pairs[i].v[1]; - union value *val0 = &c->data[v0->fv]; - union value *val1 = &c->data[v1->fv]; + const union value *val0 = &c->data[v0->fv]; + const union value *val1 = &c->data[v1->fv]; if ( ( !value_is_missing(val0,v0) && !value_is_missing(val1,v1) ) ) { @@ -1636,21 +1550,13 @@ paired_calc (struct ccase *c, void *aux UNUSED) pairs[i].sum[0] += weight * val0->f; pairs[i].sum[1] += weight * val1->f; - pairs[i].ssq[0] += weight * sqr(val0->f); - pairs[i].ssq[1] += weight * sqr(val1->f); - -#if 0 - pairs[i].correlation += weight * - ( val0->f - pairs[i].v[0]->p.t_t.ugs.mean ) - * - ( val1->f - pairs[i].v[1]->p.t_t.ugs.mean ); -#endif + pairs[i].ssq[0] += weight * pow2(val0->f); + pairs[i].ssq[1] += weight * pow2(val1->f); pairs[i].sum_of_prod += weight * val0->f * val1->f ; - pairs[i].sum_of_diffs += weight * ( val0->f - val1->f ) ; - pairs[i].ssq_diffs += weight * sqr(val0->f - val1->f); + pairs[i].ssq_diffs += weight * pow2(val0->f - val1->f); } } @@ -1658,7 +1564,7 @@ paired_calc (struct ccase *c, void *aux UNUSED) } static void -paired_postcalc (void *aux UNUSED) +paired_postcalc (struct cmd_t_test *cmd UNUSED) { int i; @@ -1671,11 +1577,11 @@ paired_postcalc (void *aux UNUSED) { pairs[i].mean[j] = pairs[i].sum[j] / n ; pairs[i].s_std_dev[j] = sqrt((pairs[i].ssq[j] / n - - sqr(pairs[i].mean[j])) + pow2(pairs[i].mean[j])) ); pairs[i].std_dev[j] = sqrt(n/(n-1)*(pairs[i].ssq[j] / n - - sqr(pairs[i].mean[j])) + pow2(pairs[i].mean[j])) ); } @@ -1686,20 +1592,12 @@ paired_postcalc (void *aux UNUSED) pairs[i].correlation /= pairs[i].std_dev[0] * pairs[i].std_dev[1]; pairs[i].correlation *= pairs[i].n / ( pairs[i].n - 1 ); -#if 0 - 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 /= n - 1; -#endif - - pairs[i].mean_diff = pairs[i].sum_of_diffs / n ; - pairs[i].std_dev_diff = sqrt ( n / (n - 1) * ( ( pairs[i].ssq_diffs / n ) - - sqr(pairs[i].mean_diff ) + pow2(pairs[i].mean_diff ) ) ); } } @@ -1743,14 +1641,14 @@ get_group(const union value *val, struct variable *indep) static void -group_precalc (void *aux UNUSED) +group_precalc (struct cmd_t_test *cmd ) { int i; int j; - for(i=0; i< cmd.n_variables ; ++i) + for(i=0; i< cmd->n_variables ; ++i) { - struct t_test_proc *ttpr = &cmd.v_variables[i]->p.t_t; + 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; @@ -1773,25 +1671,26 @@ group_precalc (void *aux UNUSED) } static int -group_calc (struct ccase *c, void *aux UNUSED) +group_calc (const struct ccase *c, struct cmd_t_test *cmd) { int i; int g; - union value *gv = &c->data[indep_var->fv]; - double weight = dict_get_case_weight(default_dict,c); + const union value *gv = &c->data[indep_var->fv]; + + const double weight = dict_get_case_weight(default_dict,c,&bad_weight_warn); if ( value_is_missing(gv,indep_var) ) { return 0; } - if ( cmd.miss == TTS_LISTWISE ) + if ( cmd->miss == TTS_LISTWISE ) { - for(i=0; i< cmd.n_variables ; ++i) + for(i=0; i< cmd->n_variables ; ++i) { - struct variable *v = cmd.v_variables[i]; - union value *val = &c->data[v->fv]; + struct variable *v = cmd->v_variables[i]; + const union value *val = &c->data[v->fv]; if (value_is_missing(val,v) ) { @@ -1805,24 +1704,25 @@ group_calc (struct ccase *c, void *aux UNUSED) g = get_group(gv,indep_var); + /* If the independent variable doesn't match either of the values for this case then move on to the next case */ if (g == -1 ) return 0; - for(i=0; i< cmd.n_variables ; ++i) + for(i=0; i< cmd->n_variables ; ++i) { - struct variable *var = cmd.v_variables[i]; + struct variable *var = cmd->v_variables[i]; struct group_statistics *gs = &var->p.t_t.gs[g]; - union value *val=&c->data[var->fv]; + const union value *val=&c->data[var->fv]; if ( !value_is_missing(val,var) ) { gs->n+=weight; gs->sum+=weight * val->f; - gs->ssq+=weight * sqr(val->f); + gs->ssq+=weight * pow2(val->f); } } @@ -1831,17 +1731,17 @@ group_calc (struct ccase *c, void *aux UNUSED) static void -group_postcalc (void *aux UNUSED) +group_postcalc ( struct cmd_t_test *cmd ) { int i; int j; - for(i=0; i< cmd.n_variables ; ++i) + 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=&cmd->v_variables[i]->p.t_t.gs[j]; gs->mean = gs->sum / gs->n; @@ -1859,3 +1759,79 @@ group_postcalc (void *aux UNUSED) } } + + +static void +calculate(const struct casefile *cf, void *cmd_) +{ + struct ssbox stat_summary_box; + struct trbox test_results_box; + + struct casereader *r; + const struct ccase *c; + + struct cmd_t_test *cmd = (struct cmd_t_test *) cmd_; + + common_precalc(cmd); + for(r = casefile_get_reader (cf); + casereader_read (r, &c) ; ) + { + common_calc(c,cmd); + } + casereader_destroy (r); + common_postcalc(cmd); + + switch(mode) + { + case T_1_SAMPLE: + one_sample_precalc(cmd); + for(r = casefile_get_reader (cf); + casereader_read (r, &c) ; ) + { + one_sample_calc(c,cmd); + } + casereader_destroy (r); + one_sample_postcalc(cmd); + + break; + case T_PAIRED: + paired_precalc(cmd); + for(r = casefile_get_reader (cf); + casereader_read (r, &c) ; ) + { + paired_calc(c,cmd); + } + casereader_destroy (r); + paired_postcalc(cmd); + + break; + case T_IND_SAMPLES: + + group_precalc(cmd); + for(r = casefile_get_reader (cf); + casereader_read (r, &c) ; ) + { + group_calc(c,cmd); + } + casereader_destroy (r); + group_postcalc(cmd); + + + levene(cf, indep_var, cmd->n_variables, cmd->v_variables, + (cmd->miss == TTS_LISTWISE)?LEV_LISTWISE:LEV_ANALYSIS , + value_is_missing); + break; + } + + ssbox_create(&stat_summary_box,cmd,mode); + ssbox_populate(&stat_summary_box,cmd); + ssbox_finalize(&stat_summary_box); + + if ( mode == T_PAIRED) + pscbox(); + + trbox_create(&test_results_box,cmd,mode); + trbox_populate(&test_results_box,cmd); + trbox_finalize(&test_results_box); + +}