X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;ds=inline;f=src%2Flanguage%2Fstats%2Fnpar.c;h=ad1724da151fbdd1313570b1a59d11bead7f4d3a;hb=ec7e9edc4433264efc66e6e3d661c198148f87c9;hp=7ebb12c4bfd471557510ed9c859df4fb780c92c6;hpb=9c535e8fa636ab539d06d8888efaca68448cff64;p=pspp diff --git a/src/language/stats/npar.c b/src/language/stats/npar.c index 7ebb12c4bf..ad1724da15 100644 --- a/src/language/stats/npar.c +++ b/src/language/stats/npar.c @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -49,18 +50,11 @@ #include "gettext.h" #define _(msgid) gettext (msgid) -struct dataset; /* Settings for subcommand specifiers. */ -enum +enum missing_type { - NPAR_ANALYSIS, - NPAR_LISTWISE, - }; - -enum - { - NPAR_INCLUDE, - NPAR_EXCLUDE + MISS_ANALYSIS, + MISS_LISTWISE, }; /* Array indices for STATISTICS subcommand. */ @@ -75,28 +69,20 @@ enum /* NPAR TESTS structure. */ struct cmd_npar_tests { - /* CHISQUARE subcommand. */ + /* Count variables indicating how many + of the subcommands have been given. */ int chisquare; - - /* BINOMIAL subcommand. */ int binomial; - - /* WILCOXON subcommand. */ int wilcoxon; - - /* SIGN subcommand. */ int sign; - - /* MISSING subcommand. */ int missing; - long miss; - long incl; - - /* METHOD subcommand. */ int method; - - /* STATISTICS subcommand. */ int statistics; + + /* How missing values should be treated */ + long miss; + + /* Which statistics have been requested */ int a_statistics[NPAR_ST_count]; }; @@ -141,8 +127,7 @@ parse_npar_tests (struct lexer *lexer, struct dataset *ds, struct cmd_npar_tests npt->wilcoxon = 0; npt->sign = 0; npt->missing = 0; - npt->miss = NPAR_ANALYSIS; - npt->incl = NPAR_EXCLUDE; + npt->miss = MISS_ANALYSIS; npt->method = 0; npt->statistics = 0; memset (npt->a_statistics, 0, sizeof npt->a_statistics); @@ -228,13 +213,13 @@ parse_npar_tests (struct lexer *lexer, struct dataset *ds, struct cmd_npar_tests while (lex_token (lexer) != '/' && lex_token (lexer) != '.') { if (lex_match_hyphenated_word (lexer, "ANALYSIS")) - npt->miss = NPAR_ANALYSIS; + npt->miss = MISS_ANALYSIS; else if (lex_match_hyphenated_word (lexer, "LISTWISE")) - npt->miss = NPAR_LISTWISE; + npt->miss = MISS_LISTWISE; else if (lex_match_hyphenated_word (lexer, "INCLUDE")) - npt->incl = NPAR_INCLUDE; + nps->filter = MV_SYSTEM; else if (lex_match_hyphenated_word (lexer, "EXCLUDE")) - npt->incl = NPAR_EXCLUDE; + nps->filter = MV_ANY; else { lex_error (lexer, NULL); @@ -319,6 +304,11 @@ static void two_sample_insert_variables (const struct npar_test *test, struct const_hsh_table *variables); +static void n_sample_insert_variables (const struct npar_test *test, + struct const_hsh_table *variables); + + + static void npar_execute (struct casereader *input, const struct npar_specs *specs, @@ -371,6 +361,7 @@ cmd_npar_tests (struct lexer *lexer, struct dataset *ds) struct casereader *input, *group; npar_specs.pool = pool_create (); + npar_specs.filter = MV_ANY; var_hash = const_hsh_create_pool (npar_specs.pool, 0, compare_vars_by_name, hash_var_by_name, @@ -418,10 +409,8 @@ cmd_npar_tests (struct lexer *lexer, struct dataset *ds) } } - npar_specs.filter = cmd.incl == NPAR_EXCLUDE ? MV_ANY : MV_SYSTEM; - input = proc_open (ds); - if ( cmd.miss == NPAR_LISTWISE ) + if ( cmd.miss == MISS_LISTWISE ) { input = casereader_create_filter_missing (input, npar_specs.vv, @@ -736,6 +725,53 @@ parse_two_sample_related_test (struct lexer *lexer, return true; } + +static bool +parse_n_sample_related_test (struct lexer *lexer, + const struct dictionary *dict, + struct n_sample_test *nst, + struct pool *pool + ) +{ + union value val1, val2; + + if (!parse_variables_const_pool (lexer, pool, + dict, + &nst->vars, &nst->n_vars, + PV_NUMERIC | PV_NO_SCRATCH | PV_NO_DUPLICATE) ) + return false; + + if ( ! lex_force_match (lexer, T_BY)) + return false; + + nst->indep_var = parse_variable_const (lexer, dict); + + if ( ! lex_force_match (lexer, '(')) + return false; + + value_init (&val1, var_get_width (nst->indep_var)); + if ( ! parse_value (lexer, &val1, var_get_width (nst->indep_var))) + { + value_destroy (&val1, var_get_width (nst->indep_var)); + return false; + } + + if ( ! lex_force_match (lexer, ',')) + return false; + + value_init (&val2, var_get_width (nst->indep_var)); + if ( ! parse_value (lexer, &val2, var_get_width (nst->indep_var))) + { + value_destroy (&val2, var_get_width (nst->indep_var)); + return false; + } + + if ( ! lex_force_match (lexer, ')')) + return false; + + return true; +} + static int npar_wilcoxon (struct lexer *lexer, struct dataset *ds, @@ -788,19 +824,20 @@ one_sample_insert_variables (const struct npar_test *test, struct const_hsh_table *var_hash) { int i; - struct one_sample_test *ost = UP_CAST (test, struct one_sample_test, parent); + const struct one_sample_test *ost = UP_CAST (test, const struct one_sample_test, parent); for ( i = 0 ; i < ost->n_vars ; ++i ) const_hsh_insert (var_hash, ost->vars[i]); } + static void two_sample_insert_variables (const struct npar_test *test, struct const_hsh_table *var_hash) { int i; - const struct two_sample_test *tst = (const struct two_sample_test *) test; + const struct two_sample_test *tst = UP_CAST (test, const struct two_sample_test, parent); for ( i = 0 ; i < tst->n_pairs ; ++i ) { @@ -811,6 +848,19 @@ two_sample_insert_variables (const struct npar_test *test, } } +static void +n_sample_insert_variables (const struct npar_test *test, + struct const_hsh_table *var_hash) +{ + int i; + const struct n_sample_test *tst = UP_CAST (test, const struct n_sample_test, parent); + + for ( i = 0 ; i < tst->n_vars ; ++i ) + const_hsh_insert (var_hash, tst->vars[i]); + + const_hsh_insert (var_hash, tst->indep_var); +} + static int npar_method (struct lexer *lexer, struct npar_specs *specs) {