X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Fnpar.c;h=ce0c3d6d06419fecdad91ca79666de840dcbe42a;hb=b609b8bb1f90ef0e98fde74c0c58187456c2f877;hp=3d977a7dc106ae6da6defeca2a16695486bcdfca;hpb=2be9bee9da6a2ce27715e58128569594319abfa2;p=pspp-builds.git diff --git a/src/language/stats/npar.c b/src/language/stats/npar.c index 3d977a7d..ce0c3d6d 100644 --- a/src/language/stats/npar.c +++ b/src/language/stats/npar.c @@ -38,6 +38,7 @@ #include "language/stats/friedman.h" #include "language/stats/kruskal-wallis.h" #include "language/stats/mann-whitney.h" +#include "language/stats/mcnemar.h" #include "language/stats/npar-summary.h" #include "language/stats/runs.h" #include "language/stats/sign.h" @@ -89,6 +90,7 @@ struct cmd_npar_tests int kendall; int kruskal_wallis; int mann_whitney; + int mcnemar; int missing; int method; int statistics; @@ -132,6 +134,7 @@ 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_mann_whitney (struct lexer *, struct dataset *, struct npar_specs *); +static int npar_mcnemar (struct lexer *, struct dataset *, struct npar_specs *); static int npar_method (struct lexer *, struct npar_specs *); /* Command parsing functions. */ @@ -148,6 +151,7 @@ parse_npar_tests (struct lexer *lexer, struct dataset *ds, struct cmd_npar_tests npt->friedman = 0; npt->kruskal_wallis = 0; npt->mann_whitney = 0; + npt->mcnemar = 0; npt->runs = 0; npt->sign = 0; npt->wilcoxon = 0; @@ -276,6 +280,23 @@ parse_npar_tests (struct lexer *lexer, struct dataset *ds, struct cmd_npar_tests NOT_REACHED (); } } + else if (lex_match_phrase (lexer, "MCNEMAR")) + { + lex_match (lexer, T_EQUALS); + npt->mcnemar++; + switch (npar_mcnemar (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_phrase (lexer, "M-W") || lex_match_phrase (lexer, "MANN-WHITNEY")) { @@ -888,14 +909,6 @@ npar_binomial (struct lexer *lexer, struct dataset *ds, } -static bool -parse_two_sample_related_test (struct lexer *lexer, - const struct dictionary *dict, - struct two_sample_test *test_parameters, - struct pool *pool - ); - - static bool parse_two_sample_related_test (struct lexer *lexer, const struct dictionary *dict, @@ -965,8 +978,8 @@ parse_two_sample_related_test (struct lexer *lexer, assert (n_vlist1 == n_vlist2); for ( i = 0 ; i < n_vlist1; ++i ) { - test_parameters->pairs[n][1] = vlist1[i]; - test_parameters->pairs[n][0] = vlist2[i]; + test_parameters->pairs[n][0] = vlist1[i]; + test_parameters->pairs[n][1] = vlist2[i]; n++; } } @@ -977,8 +990,8 @@ parse_two_sample_related_test (struct lexer *lexer, { for ( j = 0 ; j < n_vlist2; ++j ) { - test_parameters->pairs[n][1] = vlist1[i]; - test_parameters->pairs[n][0] = vlist2[j]; + test_parameters->pairs[n][0] = vlist1[i]; + test_parameters->pairs[n][1] = vlist2[j]; n++; } } @@ -992,8 +1005,8 @@ parse_two_sample_related_test (struct lexer *lexer, for ( j = i + 1 ; j < n_vlist1; ++j ) { assert ( n < test_parameters->n_pairs); - test_parameters->pairs[n][1] = vlist1[i]; - test_parameters->pairs[n][0] = vlist1[j]; + test_parameters->pairs[n][0] = vlist1[i]; + test_parameters->pairs[n][1] = vlist1[j]; n++; } } @@ -1027,7 +1040,7 @@ parse_n_sample_related_test (struct lexer *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))) + if ( ! parse_value (lexer, &nst->val1, nst->indep_var)) { value_destroy (&nst->val1, var_get_width (nst->indep_var)); return false; @@ -1036,7 +1049,7 @@ parse_n_sample_related_test (struct lexer *lexer, lex_match (lexer, T_COMMA); value_init (&nst->val2, var_get_width (nst->indep_var)); - if ( ! parse_value (lexer, &nst->val2, var_get_width (nst->indep_var))) + if ( ! parse_value (lexer, &nst->val2, nst->indep_var)) { value_destroy (&nst->val2, var_get_width (nst->indep_var)); return false; @@ -1053,8 +1066,6 @@ npar_wilcoxon (struct lexer *lexer, struct dataset *ds, struct npar_specs *specs ) { - - struct two_sample_test *tp = pool_alloc (specs->pool, sizeof (*tp)); struct npar_test *nt = &tp->parent; nt->execute = wilcoxon_execute; @@ -1098,6 +1109,8 @@ npar_mann_whitney (struct lexer *lexer, } + + static int npar_sign (struct lexer *lexer, struct dataset *ds, struct npar_specs *specs) @@ -1120,6 +1133,30 @@ npar_sign (struct lexer *lexer, struct dataset *ds, return 1; } + +static int +npar_mcnemar (struct lexer *lexer, struct dataset *ds, + struct npar_specs *specs) +{ + struct two_sample_test *tp = pool_alloc (specs->pool, sizeof (*tp)); + struct npar_test *nt = &tp->parent; + + nt->execute = mcnemar_execute; + + if (!parse_two_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; +} + + static int npar_kruskal_wallis (struct lexer *lexer, struct dataset *ds, struct npar_specs *specs)