#include "libpspp/message.h"
#include "libpspp/misc.h"
#include "math/sort.h"
-#include "output/tab.h"
+#include "output/pivot-table.h"
#include "gl/minmax.h"
#include "gl/xalloc.h"
+#include "gettext.h"
+#define N_(msgid) msgid
+#define _(msgid) gettext (msgid)
+
+
/* Returns true iff the independent variable lies in the
between val1 and val2. Regardless of which is the greater value.
*/
const struct n_sample_test *nst = aux;
const union value *bigger = NULL;
const union value *smaller = NULL;
-
+
if (0 > value_compare_3way (&nst->val1, &nst->val2, var_get_width (nst->indep_var)))
{
bigger = &nst->val2;
smaller = &nst->val2;
bigger = &nst->val1;
}
-
+
if (0 < value_compare_3way (smaller, case_data (c, nst->indep_var), var_get_width (nst->indep_var)))
return false;
{
/* The total of the caseweights in the group */
double cc;
-
+
/* A casereader containing the group data.
This casereader contains just two values:
0: The raw value of the data
{
struct ccase *c1;
struct casereader *r1 = casereader_clone (grp1->reader);
- double x0 = case_data_idx (c0, 0)->f;
- double cc0 = case_data_idx (c0, 1)->f;
+ double x0 = case_num_idx (c0, 0);
+ double cc0 = case_num_idx (c0, 1);
double w0 = cc0 - prev_cc0;
double prev_cc1 = 0;
for (; (c1 = casereader_read (r1)); case_unref (c1))
{
- double x1 = case_data_idx (c1, 0)->f;
- double cc1 = case_data_idx (c1, 1)->f;
-
+ double x1 = case_num_idx (c1, 0);
+ double cc1 = case_num_idx (c1, 1);
+
if (x0 > x1)
{
/* Do nothing */
else
{
#if 1
- usum += w0 * ( (grp1->cc - prev_cc1) / 2.0);
+ usum += w0 * ((grp1->cc - prev_cc1) / 2.0);
#else
usum += w0 * (grp1->cc - (prev_cc1 + cc1) / 2.0);
#endif
typedef double func_f (double e_l);
-/*
- These 3 functions are used repeatedly in the calculation of the
+/*
+ These 3 functions are used repeatedly in the calculation of the
variance of the JT statistic.
- Having them explicitly defined makes the variance calculation
+ Having them explicitly defined makes the variance calculation
a lot simpler.
*/
-static double
+static double
ff1 (double e)
{
return e * (e - 1) * (2*e + 5);
}
-static double
+static double
ff2 (double e)
{
return e * (e - 1) * (e - 2);
}
-static double
+static double
ff3 (double e)
{
return e * (e - 1) ;
}
-static func_f *mff[3] =
+static func_f *mff[3] =
{
ff1, ff2, ff3
};
*/
static
void variance_calculation (struct casereader *ir, const struct variable *var,
- const struct dictionary *dict,
+ const struct dictionary *dict,
func_f **f, double *result, size_t n)
{
int i;
r = sort_execute_1var (r, var);
r = casereader_create_distinct (r, var, dict_get_weight (dict));
-
+
for (; (c = casereader_read (r)); case_unref (c))
{
- double w = case_data_idx (c, w_idx)->f;
+ double w = case_num_idx (c, w_idx);
for (i = 0; i < n; ++i)
result[i] += f[i] (w);
double stddev;
};
-static void show_jt (const struct n_sample_test *nst, const struct jt *jt, const struct variable *wv);
+static void show_jt (const struct n_sample_test *, const struct jt *,
+ const struct fmt_spec *wfmt);
void
bool warn = true;
const struct dictionary *dict = dataset_dict (ds);
const struct n_sample_test *nst = UP_CAST (test, const struct n_sample_test, parent);
-
+
struct caseproto *proto = caseproto_create ();
proto = caseproto_add_width (proto, 0);
proto = caseproto_add_width (proto, 0);
/* If the independent variable is missing, then we ignore the case */
- input = casereader_create_filter_missing (input,
+ input = casereader_create_filter_missing (input,
&nst->indep_var, 1,
exclude,
NULL, NULL);
input = casereader_create_filter_weight (input, dict, &warn, NULL);
/* Remove all those cases which are outside the range (val1, val2) */
- input = casereader_create_filter_func (input, include_func_bi, NULL,
+ input = casereader_create_filter_func (input, include_func_bi, NULL,
CONST_CAST (struct n_sample_test *, nst), NULL);
/* Sort the data by the independent variable */
/* Get a few values into e_sum - we'll be needing these later */
variance_calculation (vreader, nst->vars[v], dict, mff, e_sum, 3);
-
+
grouper =
casegrouper_create_vars (vreader, &nst->indep_var, 1);
jt.obs = 0;
jt.levels = 0;
jt.n = 0;
- for (; casegrouper_get_next_group (grouper, &group);
- casereader_destroy (group) )
+ for (; casegrouper_get_next_group (grouper, &group);
+ casereader_destroy (group))
{
struct casewriter *writer = autopaging_writer_create (proto);
struct ccase *c;
for (; (c = casereader_read (group)); case_unref (c))
{
struct ccase *c_out = case_create (proto);
- const union value *x = case_data (c, nst->vars[v]);
- case_data_rw_idx (c_out, 0)->f = x->f;
+ *case_num_rw_idx (c_out, 0) = case_num (c, nst->vars[v]);
cc += dict_get_case_weight (dict, c, &warn);
- case_data_rw_idx (c_out, 1)->f = cc;
+ *case_num_rw_idx (c_out, 1) = cc;
casewriter_write (writer, c_out);
}
jt.mean = (pow2 (jt.n) - ccsq_sum) / 4.0;
- show_jt (nst, &jt, dict_get_weight (dict));
+ show_jt (nst, &jt, dict_get_weight_format (dict));
}
casereader_destroy (input);
caseproto_unref (proto);
}
-
\f
-
-#include "gettext.h"
-#define _(msgid) gettext (msgid)
-
static void
-show_jt (const struct n_sample_test *nst, const struct jt *jt, const struct variable *wv)
+show_jt (const struct n_sample_test *nst, const struct jt *jt,
+ const struct fmt_spec *wfmt)
{
- int i;
- const int row_headers = 1;
- const int column_headers = 1;
- const struct fmt_spec *wfmt = wv ? var_get_print_format (wv) : & F_8_0;
-
- struct tab_table *table =
- tab_create (row_headers + 7, column_headers + nst->n_vars);
-
- tab_headers (table, row_headers, 0, column_headers, 0);
-
- tab_title (table, _("Jonckheere-Terpstra Test"));
-
- /* Vertical lines inside the box */
- tab_box (table, 1, 0, -1, TAL_1,
- row_headers, 0, tab_nc (table) - 1, tab_nr (table) - 1 );
-
- /* Box around the table */
- tab_box (table, TAL_2, TAL_2, -1, -1,
- 0, 0, tab_nc (table) - 1, tab_nr (table) - 1 );
-
- tab_hline (table, TAL_2, 0, tab_nc (table) -1, column_headers);
- tab_vline (table, TAL_2, row_headers, 0, tab_nr (table) - 1);
-
- tab_text_format (table, 1, 0, TAT_TITLE | TAB_CENTER,
- _("Number of levels in %s"),
- var_to_string (nst->indep_var));
- tab_text (table, 2, 0, TAT_TITLE | TAB_CENTER, _("N"));
- tab_text (table, 3, 0, TAT_TITLE | TAB_CENTER, _("Observed J-T Statistic"));
- tab_text (table, 4, 0, TAT_TITLE | TAB_CENTER, _("Mean J-T Statistic"));
- tab_text (table, 5, 0, TAT_TITLE | TAB_CENTER, _("Std. Deviation of J-T Statistic"));
- tab_text (table, 6, 0, TAT_TITLE | TAB_CENTER, _("Std. J-T Statistic"));
- tab_text (table, 7, 0, TAT_TITLE | TAB_CENTER, _("Asymp. Sig. (2-tailed)"));
-
-
- for (i = 0; i < nst->n_vars; ++i)
+ struct pivot_table *table = pivot_table_create (
+ N_("Jonckheere-Terpstra Test"));
+ pivot_table_set_weight_format (table, wfmt);
+
+ struct pivot_dimension *statistics = pivot_dimension_create (
+ table, PIVOT_AXIS_COLUMN, N_("Statistics"));
+ pivot_category_create_leaf_rc (
+ statistics->root,
+ pivot_value_new_text_format (N_("Number of levels in %s"),
+ var_to_string (nst->indep_var)),
+ PIVOT_RC_INTEGER);
+ pivot_category_create_leaves (
+ statistics->root,
+ N_("N"), PIVOT_RC_COUNT,
+ N_("Observed J-T Statistic"), PIVOT_RC_OTHER,
+ N_("Mean J-T Statistic"), PIVOT_RC_OTHER,
+ N_("Std. Deviation of J-T Statistic"), PIVOT_RC_OTHER,
+ N_("Std. J-T Statistic"), PIVOT_RC_OTHER,
+ N_("Asymp. Sig. (2-tailed)"), PIVOT_RC_SIGNIFICANCE);
+
+ struct pivot_dimension *variables = pivot_dimension_create (
+ table, PIVOT_AXIS_ROW, N_("Variable"));
+
+ for (size_t i = 0; i < nst->n_vars; ++i)
{
- tab_text (table, 0, i + row_headers, TAT_TITLE,
- var_to_string (nst->vars[i]) );
-
- tab_double (table, 1, i + row_headers, TAT_TITLE,
- jt[0].levels, &F_8_0);
-
- tab_double (table, 2, i + row_headers, TAT_TITLE,
- jt[0].n, wfmt);
-
- tab_double (table, 3, i + row_headers, TAT_TITLE,
- jt[0].obs, 0);
-
- tab_double (table, 4, i + row_headers, TAT_TITLE,
- jt[0].mean, 0);
-
- tab_double (table, 5, i + row_headers, TAT_TITLE,
- jt[0].stddev, 0);
+ int row = pivot_category_create_leaf (
+ variables->root, pivot_value_new_variable (nst->vars[i]));
double std_jt = (jt[0].obs - jt[0].mean) / jt[0].stddev;
- tab_double (table, 6, i + row_headers, TAT_TITLE,
- std_jt, 0);
-
- tab_double (table, 7, i + row_headers, TAT_TITLE,
- 2.0 * ((std_jt > 0) ? gsl_cdf_ugaussian_Q (std_jt) : gsl_cdf_ugaussian_P (std_jt)), 0);
+ double sig = (2.0 * (std_jt > 0
+ ? gsl_cdf_ugaussian_Q (std_jt)
+ : gsl_cdf_ugaussian_P (std_jt)));
+ double entries[] = {
+ jt[0].levels,
+ jt[0].n,
+ jt[0].obs,
+ jt[0].mean,
+ jt[0].stddev,
+ std_jt,
+ sig,
+ };
+ for (size_t j = 0; j < sizeof entries / sizeof *entries; j++)
+ pivot_table_put2 (table, j, row, pivot_value_new_number (entries[j]));
}
-
- tab_submit (table);
+
+ pivot_table_submit (table);
}