/* Pspp - a program for statistical analysis.
- Copyright (C) 2008, 2009 Free Software Foundation, Inc.
+ Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#include <config.h>
+
#include "wilcoxon.h"
-#include <data/variable.h>
+
+#include <gsl/gsl_cdf.h>
+#include <math.h>
+#include <signal.h>
+#include <unistd.h>
+
#include <data/casereader.h>
#include <data/casewriter.h>
+#include <data/dictionary.h>
+#include <data/format.h>
+#include <data/procedure.h>
#include <data/subcase.h>
-#include <math/sort.h>
+#include <data/variable.h>
+#include <gsl/gsl_cdf.h>
+#include <libpspp/assertion.h>
#include <libpspp/message.h>
-#include <xalloc.h>
-#include <output/table.h>
-#include <data/procedure.h>
-#include <data/dictionary.h>
+#include <libpspp/misc.h>
+#include <math/sort.h>
#include <math/wilcoxon-sig.h>
-#include <gsl/gsl_cdf.h>
-#include <unistd.h>
+#include <output/tab.h>
#include <signal.h>
-#include <libpspp/assertion.h>
+#include <unistd.h>
+
+#include "minmax.h"
+#include "xalloc.h"
static double
append_difference (const struct ccase *c, casenumber n UNUSED, void *aux)
}
static void show_ranks_box (const struct wilcoxon_state *,
- const struct two_sample_test *);
+ const struct two_sample_test *,
+ const struct dictionary *);
static void show_tests_box (const struct wilcoxon_state *,
const struct two_sample_test *,
struct wilcoxon_state *ws = xcalloc (sizeof (*ws), t2s->n_pairs);
const struct variable *weight = dict_get_weight (dict);
- struct variable *weightx = var_create_internal (WEIGHT_IDX);
+ struct variable *weightx = dict_create_internal_var (WEIGHT_IDX, 0);
+ struct caseproto *proto;
input =
casereader_create_filter_weight (input, dict, &warn, NULL);
+ proto = caseproto_create ();
+ proto = caseproto_add_width (proto, 0);
+ proto = caseproto_add_width (proto, 0);
+ if (weight != NULL)
+ proto = caseproto_add_width (proto, 0);
+
for (i = 0 ; i < t2s->n_pairs; ++i )
{
struct casereader *r = casereader_clone (input);
struct subcase ordering;
variable_pair *vp = &t2s->pairs[i];
- const int reader_width = weight ? 3 : 2;
-
- ws[i].sign = var_create_internal (0);
- ws[i].absdiff = var_create_internal (1);
+ ws[i].sign = dict_create_internal_var (0, 0);
+ ws[i].absdiff = dict_create_internal_var (1, 0);
r = casereader_create_filter_missing (r, *vp, 2,
exclude,
NULL, NULL);
subcase_init_var (&ordering, ws[i].absdiff, SC_ASCEND);
- writer = sort_create_writer (&ordering, reader_width);
+ writer = sort_create_writer (&ordering, proto);
subcase_destroy (&ordering);
for (; (c = casereader_read (r)) != NULL; case_unref (c))
{
- struct ccase *output = case_create (reader_width);
+ struct ccase *output = case_create (proto);
double d = append_difference (c, 0, vp);
if (d > 0)
casereader_destroy (r);
ws[i].reader = casewriter_make_reader (writer);
}
+ caseproto_unref (proto);
for (i = 0 ; i < t2s->n_pairs; ++i )
{
casereader_destroy (input);
- var_destroy (weightx);
+ dict_destroy_internal_var (weightx);
- show_ranks_box (ws, t2s);
+ show_ranks_box (ws, t2s, dict);
show_tests_box (ws, t2s, exact, timer);
for (i = 0 ; i < t2s->n_pairs; ++i )
{
- var_destroy (ws[i].sign);
- var_destroy (ws[i].absdiff);
+ dict_destroy_internal_var (ws[i].sign);
+ dict_destroy_internal_var (ws[i].absdiff);
}
free (ws);
#define _(msgid) gettext (msgid)
static void
-show_ranks_box (const struct wilcoxon_state *ws, const struct two_sample_test *t2s)
+show_ranks_box (const struct wilcoxon_state *ws,
+ const struct two_sample_test *t2s,
+ const struct dictionary *dict)
{
size_t i;
- struct tab_table *table = tab_create (5, 1 + 4 * t2s->n_pairs, 0);
- tab_dim (table, tab_natural_dimensions);
+ const struct variable *wv = dict_get_weight (dict);
+ const struct fmt_spec *wfmt = wv ? var_get_print_format (wv) : & F_8_0;
+
+ struct tab_table *table = tab_create (5, 1 + 4 * t2s->n_pairs);
tab_title (table, _("Ranks"));
/* Vertical lines inside the box */
tab_box (table, 0, 0, -1, TAL_1,
- 1, 0, table->nc - 1, tab_nr (table) - 1 );
+ 1, 0, tab_nc (table) - 1, tab_nr (table) - 1 );
/* Box around entire table */
tab_box (table, TAL_2, TAL_2, -1, -1,
- 0, 0, table->nc - 1, tab_nr (table) - 1 );
+ 0, 0, tab_nc (table) - 1, tab_nr (table) - 1 );
tab_text (table, 2, 0, TAB_CENTER, _("N"));
tab_text (table, 1, 3 + i * 4, TAB_LEFT, _("Ties"));
tab_text (table, 1, 4 + i * 4, TAB_LEFT, _("Total"));
- tab_hline (table, TAL_1, 0, table->nc - 1, 1 + i * 4);
+ tab_hline (table, TAL_1, 0, tab_nc (table) - 1, 1 + i * 4);
tab_text (table, 0, 1 + i * 4, TAB_LEFT, ds_cstr (&pair_name));
/* N */
- tab_float (table, 2, 1 + i * 4, TAB_RIGHT, ws[i].negatives.n, 8, 0);
- tab_float (table, 2, 2 + i * 4, TAB_RIGHT, ws[i].positives.n, 8, 0);
- tab_float (table, 2, 3 + i * 4, TAB_RIGHT, ws[i].n_zeros, 8, 0);
+ tab_double (table, 2, 1 + i * 4, TAB_RIGHT, ws[i].negatives.n, wfmt);
+ tab_double (table, 2, 2 + i * 4, TAB_RIGHT, ws[i].positives.n, wfmt);
+ tab_double (table, 2, 3 + i * 4, TAB_RIGHT, ws[i].n_zeros, wfmt);
- tab_float (table, 2, 4 + i * 4, TAB_RIGHT,
- ws[i].n_zeros + ws[i].positives.n + ws[i].negatives.n, 8, 0);
+ tab_double (table, 2, 4 + i * 4, TAB_RIGHT,
+ ws[i].n_zeros + ws[i].positives.n + ws[i].negatives.n, wfmt);
/* Sums */
- tab_float (table, 4, 1 + i * 4, TAB_RIGHT, ws[i].negatives.sum, 8, 2);
- tab_float (table, 4, 2 + i * 4, TAB_RIGHT, ws[i].positives.sum, 8, 2);
+ tab_double (table, 4, 1 + i * 4, TAB_RIGHT, ws[i].negatives.sum, NULL);
+ tab_double (table, 4, 2 + i * 4, TAB_RIGHT, ws[i].positives.sum, NULL);
/* Means */
- tab_float (table, 3, 1 + i * 4, TAB_RIGHT,
- ws[i].negatives.sum / (double) ws[i].negatives.n, 8, 2);
+ tab_double (table, 3, 1 + i * 4, TAB_RIGHT,
+ ws[i].negatives.sum / (double) ws[i].negatives.n, NULL);
- tab_float (table, 3, 2 + i * 4, TAB_RIGHT,
- ws[i].positives.sum / (double) ws[i].positives.n, 8, 2);
+ tab_double (table, 3, 2 + i * 4, TAB_RIGHT,
+ ws[i].positives.sum / (double) ws[i].positives.n, NULL);
}
- tab_hline (table, TAL_2, 0, table->nc - 1, 1);
- tab_vline (table, TAL_2, 2, 0, table->nr - 1);
+ tab_hline (table, TAL_2, 0, tab_nc (table) - 1, 1);
+ tab_vline (table, TAL_2, 2, 0, tab_nr (table) - 1);
tab_submit (table);
)
{
size_t i;
- struct tab_table *table = tab_create (1 + t2s->n_pairs, exact ? 5 : 3, 0);
-
- tab_dim (table, tab_natural_dimensions);
+ struct tab_table *table = tab_create (1 + t2s->n_pairs, exact ? 5 : 3);
tab_title (table, _("Test Statistics"));
/* Vertical lines inside the box */
tab_box (table, 0, 0, -1, TAL_1,
- 0, 0, table->nc - 1, tab_nr (table) - 1 );
+ 0, 0, tab_nc (table) - 1, tab_nr (table) - 1 );
/* Box around entire table */
tab_box (table, TAL_2, TAL_2, -1, -1,
- 0, 0, table->nc - 1, tab_nr (table) - 1 );
+ 0, 0, tab_nc (table) - 1, tab_nr (table) - 1 );
tab_text (table, 0, 1, TAB_LEFT, _("Z"));
- tab_text (table, 0, 2, TAB_LEFT, _("Asymp. Sig (2-tailed)"));
+ tab_text (table, 0, 2, TAB_LEFT, _("Asymp. Sig. (2-tailed)"));
if ( exact )
{
- tab_text (table, 0, 3, TAB_LEFT, _("Exact Sig (2-tailed)"));
- tab_text (table, 0, 4, TAB_LEFT, _("Exact Sig (1-tailed)"));
+ tab_text (table, 0, 3, TAB_LEFT, _("Exact Sig. (2-tailed)"));
+ tab_text (table, 0, 4, TAB_LEFT, _("Exact Sig. (1-tailed)"));
#if 0
tab_text (table, 0, 5, TAB_LEFT, _("Point Probability"));
z /= sqrt (n * (n + 1) * (2*n + 1)/24.0 - ws[i].tiebreaker / 48.0);
- tab_float (table, 1 + i, 1, TAB_RIGHT, z, 8, 3);
+ tab_double (table, 1 + i, 1, TAB_RIGHT, z, NULL);
- tab_float (table, 1 + i, 2, TAB_RIGHT,
+ tab_double (table, 1 + i, 2, TAB_RIGHT,
2.0 * gsl_cdf_ugaussian_P (z),
- 8, 3);
+ NULL);
if (exact)
{
}
else
{
- tab_float (table, 1 + i, 3, TAB_RIGHT, p, 8, 3);
- tab_float (table, 1 + i, 4, TAB_RIGHT, p / 2.0, 8, 3);
+ tab_double (table, 1 + i, 3, TAB_RIGHT, p, NULL);
+ tab_double (table, 1 + i, 4, TAB_RIGHT, p / 2.0, NULL);
}
}
}
- tab_hline (table, TAL_2, 0, table->nc - 1, 1);
- tab_vline (table, TAL_2, 1, 0, table->nr - 1);
+ tab_hline (table, TAL_2, 0, tab_nc (table) - 1, 1);
+ tab_vline (table, TAL_2, 1, 0, tab_nr (table) - 1);
tab_submit (table);