X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Fnpar.c;h=1db0a1b79be2c526aebaebbe81eb471c7376a0dc;hb=2c327bbf83aee01efec9a44157521888e34f81f5;hp=73a36bda0bc10b46afa8ef2552fa62526590df20;hpb=7ebdbb57cdb7f8e9413cccc0426d6cd6af3d98b9;p=pspp diff --git a/src/language/stats/npar.c b/src/language/stats/npar.c index 73a36bda0b..1db0a1b79b 100644 --- a/src/language/stats/npar.c +++ b/src/language/stats/npar.c @@ -46,6 +46,7 @@ #include #include #include +#include #include #include #include @@ -80,6 +81,7 @@ struct cmd_npar_tests int wilcoxon; int sign; int runs; + int friedman; int kruskal_wallis; int missing; int method; @@ -116,8 +118,8 @@ struct npar_specs /* Prototype for custom subcommands of NPAR TESTS. */ 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_runs (struct lexer *lexer, struct dataset *, struct npar_specs *); - +static int npar_runs (struct lexer *, struct dataset *, struct npar_specs *); +static int npar_friedman (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 *); @@ -135,6 +137,7 @@ parse_npar_tests (struct lexer *lexer, struct dataset *ds, struct cmd_npar_tests npt->binomial = 0; npt->wilcoxon = 0; npt->runs = 0; + npt->friedman = 0; npt->sign = 0; npt->missing = 0; npt->miss = MISS_ANALYSIS; @@ -143,7 +146,23 @@ parse_npar_tests (struct lexer *lexer, struct dataset *ds, struct cmd_npar_tests memset (npt->a_statistics, 0, sizeof npt->a_statistics); for (;;) { - if (lex_match_hyphenated_word (lexer, "RUNS")) + if (lex_match_hyphenated_word (lexer, "FRIEDMAN")) + { + npt->friedman++; + switch (npar_friedman (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, "RUNS")) { npt->runs++; switch (npar_runs (lexer, ds, nps)) @@ -158,7 +177,6 @@ parse_npar_tests (struct lexer *lexer, struct dataset *ds, struct cmd_npar_tests default: NOT_REACHED (); } - } else if (lex_match_hyphenated_word (lexer, "CHISQUARE")) { @@ -540,6 +558,35 @@ npar_runs (struct lexer *lexer, struct dataset *ds, return 1; } +static int +npar_friedman (struct lexer *lexer, struct dataset *ds, + struct npar_specs *specs) +{ + struct one_sample_test *ft = pool_alloc (specs->pool, sizeof (*ft)); + struct npar_test *nt = &ft->parent; + + nt->execute = friedman_execute; + nt->insert_variables = one_sample_insert_variables; + + lex_match (lexer, '='); + + if (!parse_variables_const_pool (lexer, specs->pool, dataset_dict (ds), + &ft->vars, &ft->n_vars, + PV_NO_SCRATCH | PV_NO_DUPLICATE | PV_NUMERIC)) + { + return 2; + } + + 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; +} + static int npar_chisquare (struct lexer *lexer, struct dataset *ds,