X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Fnpar.c;h=27d2d22d14947b3b9f39abcabc2dfdd81e0145c5;hb=758bb90bac15899ca7f18a55dc4f90e1345c7179;hp=409369edbf52ac4c143ee3f1f6896ee0849d52bf;hpb=f5f0b6da1e66e087a45152ee74c3aeab60612cf7;p=pspp diff --git a/src/language/stats/npar.c b/src/language/stats/npar.c index 409369edbf..27d2d22d14 100644 --- a/src/language/stats/npar.c +++ b/src/language/stats/npar.c @@ -33,8 +33,10 @@ #include #include #include +#include #include #include +#include #include #include #include @@ -74,6 +76,7 @@ struct cmd_npar_tests int binomial; int wilcoxon; int sign; + int kruskal_wallis; int missing; int method; int statistics; @@ -111,6 +114,7 @@ static int npar_chisquare (struct lexer *, struct dataset *, struct npar_specs * static int npar_binomial (struct lexer *, struct dataset *, struct npar_specs *); static int npar_wilcoxon (struct lexer *, struct dataset *, struct npar_specs *); static int npar_sign (struct lexer *, struct dataset *, struct npar_specs *); +static int npar_kruskal_wallis (struct lexer *, struct dataset *, struct npar_specs *); static int npar_method (struct lexer *, struct npar_specs *); /* Command parsing functions. */ @@ -166,6 +170,24 @@ parse_npar_tests (struct lexer *lexer, struct dataset *ds, struct cmd_npar_tests NOT_REACHED (); } } + else if (lex_match_hyphenated_word (lexer, "K-W") || + lex_match_hyphenated_word (lexer, "KRUSKAL-WALLIS")) + { + lex_match (lexer, '='); + npt->kruskal_wallis++; + switch (npar_kruskal_wallis (lexer, ds, nps)) + { + case 0: + goto lossage; + case 1: + break; + case 2: + lex_error (lexer, NULL); + goto lossage; + default: + NOT_REACHED (); + } + } else if (lex_match_hyphenated_word (lexer, "WILCOXON")) { lex_match (lexer, '='); @@ -303,6 +325,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, @@ -720,6 +747,50 @@ parse_two_sample_related_test (struct lexer *lexer, } +static bool +parse_n_sample_related_test (struct lexer *lexer, + const struct dictionary *dict, + struct n_sample_test *nst, + struct pool *pool + ) +{ + 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 (&nst->val1, var_get_width (nst->indep_var)); + if ( ! parse_value (lexer, &nst->val1, var_get_width (nst->indep_var))) + { + value_destroy (&nst->val1, var_get_width (nst->indep_var)); + return false; + } + + if ( ! lex_force_match (lexer, ',')) + return false; + + value_init (&nst->val2, var_get_width (nst->indep_var)); + if ( ! parse_value (lexer, &nst->val2, var_get_width (nst->indep_var))) + { + value_destroy (&nst->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, @@ -766,6 +837,29 @@ npar_sign (struct lexer *lexer, struct dataset *ds, return 1; } +static int +npar_kruskal_wallis (struct lexer *lexer, struct dataset *ds, + struct npar_specs *specs) +{ + struct n_sample_test *tp = pool_alloc (specs->pool, sizeof (*tp)); + struct npar_test *nt = &tp->parent; + + nt->insert_variables = n_sample_insert_variables; + + nt->execute = kruskal_wallis_execute; + + if (!parse_n_sample_related_test (lexer, dataset_dict (ds), + tp, specs->pool) ) + return 0; + + specs->n_tests++; + specs->test = pool_realloc (specs->pool, + specs->test, + sizeof (*specs->test) * specs->n_tests); + specs->test[specs->n_tests - 1] = nt; + + return 1; +} /* Insert the variables for TEST into VAR_HASH */ static void @@ -785,7 +879,6 @@ two_sample_insert_variables (const struct npar_test *test, struct const_hsh_table *var_hash) { int i; - const struct two_sample_test *tst = UP_CAST (test, const struct two_sample_test, parent); for ( i = 0 ; i < tst->n_pairs ; ++i ) @@ -797,6 +890,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) {