X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Fexamine.q;h=e8333b1ceeaa5257d922b9be4700bc6aec8ef7d1;hb=2cf38ce51a9f34961d68a75e0b312a591b5c9abf;hp=2649968b31485b105f6a80f3119ab39bdc851eea;hpb=d6ede2e8f16079edae2e308583f8af4f7e9daddd;p=pspp-builds.git diff --git a/src/language/stats/examine.q b/src/language/stats/examine.q index 2649968b..e8333b1c 100644 --- a/src/language/stats/examine.q +++ b/src/language/stats/examine.q @@ -143,7 +143,7 @@ struct factor_result { struct ll ll; - union value *value[2]; + union value value[2]; /* An array of factor metrics, one for each variable */ struct factor_metrics *metrics; @@ -171,6 +171,7 @@ factor_destroy (struct xfactor *fctr) int v; struct factor_result *result = ll_data (ll, struct factor_result, ll); + int i; for (v = 0; v < n_dependent_vars; ++v) { @@ -189,8 +190,10 @@ factor_destroy (struct xfactor *fctr) casereader_destroy (result->metrics[v].up_reader); } - free (result->value[0]); - free (result->value[1]); + for (i = 0; i < 2; i++) + if (fctr->indep_var[i]) + value_destroy (&result->value[i], + var_get_width (fctr->indep_var[i])); free (result->metrics); ll = ll_next (ll); free (result); @@ -207,6 +210,7 @@ static int examine_parse_independent_vars (struct lexer *lexer, /* Output functions */ static void show_summary (const struct variable **dependent_var, int n_dep_var, + const struct dictionary *dict, const struct xfactor *f); @@ -231,7 +235,7 @@ static void show_extremes (const struct variable **dependent_var, static void run_examine (struct cmd_examine *, struct casereader *, struct dataset *); -static void output_examine (void); +static void output_examine (const struct dictionary *dict); void factor_calc (const struct ccase *c, int case_no, @@ -599,7 +603,7 @@ show_boxplot_variables (const struct variable **dependent_var, #if 0 ds_put_format (&title, "%s = ", var_get_name (fctr->indep_var[0])); - var_append_value_name (fctr->indep_var[0], result->value[0], &title); + var_append_value_name (fctr->indep_var[0], &result->value[0], &title); #endif chart_write_title (ch, ds_cstr (&title)); @@ -628,11 +632,11 @@ show_boxplot_variables (const struct variable **dependent_var, /* Show all the appropriate tables */ static void -output_examine (void) +output_examine (const struct dictionary *dict) { struct ll *ll; - show_summary (dependent_vars, n_dependent_vars, &level0_factor); + show_summary (dependent_vars, n_dependent_vars, dict, &level0_factor); if ( cmd.a_statistics[XMN_ST_EXTREME] ) show_extremes (dependent_vars, n_dependent_vars, &level0_factor); @@ -659,7 +663,7 @@ output_examine (void) ll != ll_null (&factor_list); ll = ll_next (ll)) { struct xfactor *factor = ll_data (ll, struct xfactor, ll); - show_summary (dependent_vars, n_dependent_vars, factor); + show_summary (dependent_vars, n_dependent_vars, dict, factor); if ( cmd.a_statistics[XMN_ST_EXTREME] ) show_extremes (dependent_vars, n_dependent_vars, factor); @@ -876,6 +880,11 @@ examine_group (struct cmd_examine *cmd, struct casereader *reader, int level, int v; int n_extrema = 1; struct factor_result *result = xzalloc (sizeof (*result)); + int i; + + for (i = 0; i < 2; i++) + if (factor->indep_var[i]) + value_init (&result->value[i], var_get_width (factor->indep_var[i])); result->metrics = xcalloc (n_dependent_vars, sizeof (*result->metrics)); @@ -887,16 +896,10 @@ examine_group (struct cmd_examine *cmd, struct casereader *reader, int level, if (c != NULL) { if ( level > 0) - { - result->value[0] = - value_dup (case_data (c, factor->indep_var[0]), - var_get_width (factor->indep_var[0])); - - if ( level > 1) - result->value[1] = - value_dup (case_data (c, factor->indep_var[1]), - var_get_width (factor->indep_var[1])); - } + for (i = 0; i < 2; i++) + if (factor->indep_var[i]) + value_copy (&result->value[i], case_data (c, factor->indep_var[i]), + var_get_width (factor->indep_var[i])); case_unref (c); } @@ -920,7 +923,7 @@ examine_group (struct cmd_examine *cmd, struct casereader *reader, int level, struct subcase up_ordering; subcase_init_var (&up_ordering, dependent_vars[v], SC_ASCEND); writer = sort_create_writer (&up_ordering, - casereader_get_value_cnt (reader)); + casereader_get_proto (reader)); subcase_destroy (&up_ordering); } else @@ -928,15 +931,15 @@ examine_group (struct cmd_examine *cmd, struct casereader *reader, int level, /* but in this case, sorting is unnecessary, so an ordinary casewriter is sufficient */ writer = - autopaging_writer_create (casereader_get_value_cnt (reader)); + autopaging_writer_create (casereader_get_proto (reader)); } /* Sort or just iterate, whilst calculating moments etc */ while ((c = casereader_read (input)) != NULL) { - const casenumber loc = - case_data_idx (c, casereader_get_value_cnt (reader) - 1)->f; + int n_vals = caseproto_get_n_widths (casereader_get_proto (reader)); + const casenumber loc = case_data_idx (c, n_vals - 1)->f; const double weight = wv ? case_data (c, wv)->f : 1.0; const union value *value = case_data (c, dependent_vars[v]); @@ -1004,8 +1007,8 @@ examine_group (struct cmd_examine *cmd, struct casereader *reader, int level, metric->quartiles[2] = metric->ptl[i]; } - metric->tukey_hinges = tukey_hinges_create (metric->n, metric->cmin); - metric->trimmed_mean = trimmed_mean_create (metric->n, 0.05); + metric->tukey_hinges = tukey_hinges_create (metric->n_valid, metric->cmin); + metric->trimmed_mean = trimmed_mean_create (metric->n_valid, 0.05); n_os = metric->n_ptiles + 2; @@ -1091,12 +1094,12 @@ examine_group (struct cmd_examine *cmd, struct casereader *reader, int level, for (v = 0; v < n_dependent_vars; ++v) { struct factor_metrics *metric = &result->metrics[v]; + int n_vals = caseproto_get_n_widths (casereader_get_proto ( + metric->up_reader)); metric->box_whisker = box_whisker_create ((struct tukey_hinges *) metric->tukey_hinges, - cmd->v_id, - casereader_get_value_cnt (metric->up_reader) - - 1); + cmd->v_id, n_vals - 1); order_stats_accumulate ((struct order_stats **) &metric->box_whisker, 1, @@ -1180,7 +1183,7 @@ run_examine (struct cmd_examine *cmd, struct casereader *input, casereader_destroy (input); - output_examine (); + output_examine (dict); factor_destroy (&level0_factor); @@ -1200,8 +1203,12 @@ run_examine (struct cmd_examine *cmd, struct casereader *input, static void show_summary (const struct variable **dependent_var, int n_dep_var, + const struct dictionary *dict, const struct xfactor *fctr) { + const struct variable *wv = dict_get_weight (dict); + const struct fmt_spec *wfmt = wv ? var_get_print_format (wv) : & F_8_0; + static const char *subtitle[]= { N_("Valid"), @@ -1238,7 +1245,7 @@ show_summary (const struct variable **dependent_var, int n_dep_var, tbl = tab_create (n_cols, n_rows, 0); tab_headers (tbl, heading_columns, 0, heading_rows, 0); - tab_dim (tbl, tab_natural_dimensions); + tab_dim (tbl, tab_natural_dimensions, NULL); /* Outline the box */ tab_box (tbl, @@ -1313,7 +1320,7 @@ show_summary (const struct variable **dependent_var, int n_dep_var, { int j = 0; struct ll *ll; - union value *last_value = NULL; + const union value *last_value = NULL; if ( v > 0 ) tab_hline (tbl, TAL_1, 0, n_cols -1 , @@ -1339,15 +1346,15 @@ show_summary (const struct variable **dependent_var, int n_dep_var, { if ( last_value == NULL || - compare_values_short (last_value, result->value[0], - fctr->indep_var[0])) + !value_equal (last_value, &result->value[0], + var_get_width (fctr->indep_var[0]))) { struct string str; - last_value = result->value[0]; + last_value = &result->value[0]; ds_init_empty (&str); - var_append_value_name (fctr->indep_var[0], result->value[0], + var_append_value_name (fctr->indep_var[0], &result->value[0], &str); tab_text (tbl, 1, @@ -1371,7 +1378,7 @@ show_summary (const struct variable **dependent_var, int n_dep_var, ds_init_empty (&str); var_append_value_name (fctr->indep_var[1], - result->value[1], &str); + &result->value[1], &str); tab_text (tbl, 2, heading_rows + j + @@ -1393,43 +1400,43 @@ show_summary (const struct variable **dependent_var, int n_dep_var, result->metrics[v].se_mean = sqrt (result->metrics[v].variance / n) ; /* Total Valid */ - tab_float (tbl, heading_columns, + tab_double (tbl, heading_columns, heading_rows + j + v * ll_count (&fctr->result_list), TAB_LEFT, - n, 8, 0); + n, wfmt); - tab_text (tbl, heading_columns + 1, - heading_rows + j + v * ll_count (&fctr->result_list), - TAB_RIGHT | TAT_PRINTF, - "%g%%", n * 100.0 / result->metrics[v].n); + tab_text_format (tbl, heading_columns + 1, + heading_rows + j + v * ll_count (&fctr->result_list), + TAB_RIGHT, + "%g%%", n * 100.0 / result->metrics[v].n); /* Total Missing */ - tab_float (tbl, heading_columns + 2, + tab_double (tbl, heading_columns + 2, heading_rows + j + v * ll_count (&fctr->result_list), TAB_LEFT, result->metrics[v].n - n, - 8, 0); + wfmt); - tab_text (tbl, heading_columns + 3, - heading_rows + j + v * ll_count (&fctr->result_list), - TAB_RIGHT | TAT_PRINTF, - "%g%%", - (result->metrics[v].n - n) * 100.0 / result->metrics[v].n - ); + tab_text_format (tbl, heading_columns + 3, + heading_rows + j + v * ll_count (&fctr->result_list), + TAB_RIGHT, + "%g%%", + (result->metrics[v].n - n) * 100.0 / result->metrics[v].n + ); /* Total Valid + Missing */ - tab_float (tbl, heading_columns + 4, + tab_double (tbl, heading_columns + 4, heading_rows + j + v * ll_count (&fctr->result_list), TAB_LEFT, result->metrics[v].n, - 8, 0); + wfmt); - tab_text (tbl, heading_columns + 5, - heading_rows + j + v * ll_count (&fctr->result_list), - TAB_RIGHT | TAT_PRINTF, - "%g%%", - (result->metrics[v].n) * 100.0 / result->metrics[v].n - ); + tab_text_format (tbl, heading_columns + 5, + heading_rows + j + v * ll_count (&fctr->result_list), + TAB_RIGHT, + "%g%%", + ((result->metrics[v].n) * 100.0 + / result->metrics[v].n)); ++j; } @@ -1475,7 +1482,7 @@ show_descriptives (const struct variable **dependent_var, tbl = tab_create (n_cols, n_rows, 0); tab_headers (tbl, heading_columns, 0, heading_rows, 0); - tab_dim (tbl, tab_natural_dimensions); + tab_dim (tbl, tab_natural_dimensions, NULL); /* Outline the box */ tab_box (tbl, @@ -1534,7 +1541,7 @@ show_descriptives (const struct variable **dependent_var, struct string vstr; ds_init_empty (&vstr); var_append_value_name (fctr->indep_var[0], - result->value[0], &vstr); + &result->value[0], &vstr); tab_text (tbl, 1, heading_rows + row_var_start + i * DESCRIPTIVE_ROWS, @@ -1551,11 +1558,11 @@ show_descriptives (const struct variable **dependent_var, TAB_LEFT, _("Mean")); - tab_text (tbl, n_cols - 4, - heading_rows + row_var_start + 1 + i * DESCRIPTIVE_ROWS, - TAB_LEFT | TAT_PRINTF, - _("%g%% Confidence Interval for Mean"), - cmd.n_cinterval[0]); + tab_text_format (tbl, n_cols - 4, + heading_rows + row_var_start + 1 + i * DESCRIPTIVE_ROWS, + TAB_LEFT, + _("%g%% Confidence Interval for Mean"), + cmd.n_cinterval[0]); tab_text (tbl, n_cols - 3, heading_rows + row_var_start + 1 + i * DESCRIPTIVE_ROWS, @@ -1568,9 +1575,8 @@ show_descriptives (const struct variable **dependent_var, _("Upper Bound")); tab_text (tbl, n_cols - 4, - heading_rows + row_var_start + 3 + i * DESCRIPTIVE_ROWS, - TAB_LEFT | TAT_PRINTF, - _("5%% Trimmed Mean")); + heading_rows + row_var_start + 3 + i * DESCRIPTIVE_ROWS, + TAB_LEFT, _("5% Trimmed Mean")); tab_text (tbl, n_cols - 4, heading_rows + row_var_start + 4 + i * DESCRIPTIVE_ROWS, @@ -1621,93 +1627,93 @@ show_descriptives (const struct variable **dependent_var, /* Now the statistics ... */ - tab_float (tbl, n_cols - 2, + tab_double (tbl, n_cols - 2, heading_rows + row_var_start + i * DESCRIPTIVE_ROWS, TAB_CENTER, result->metrics[v].mean, - 8, 2); + NULL); - tab_float (tbl, n_cols - 1, + tab_double (tbl, n_cols - 1, heading_rows + row_var_start + i * DESCRIPTIVE_ROWS, TAB_CENTER, result->metrics[v].se_mean, - 8, 3); + NULL); - tab_float (tbl, n_cols - 2, + tab_double (tbl, n_cols - 2, heading_rows + row_var_start + 1 + i * DESCRIPTIVE_ROWS, TAB_CENTER, result->metrics[v].mean - t * result->metrics[v].se_mean, - 8, 3); + NULL); - tab_float (tbl, n_cols - 2, + tab_double (tbl, n_cols - 2, heading_rows + row_var_start + 2 + i * DESCRIPTIVE_ROWS, TAB_CENTER, result->metrics[v].mean + t * result->metrics[v].se_mean, - 8, 3); + NULL); - tab_float (tbl, n_cols - 2, + tab_double (tbl, n_cols - 2, heading_rows + row_var_start + 3 + i * DESCRIPTIVE_ROWS, TAB_CENTER, trimmed_mean_calculate ((struct trimmed_mean *) result->metrics[v].trimmed_mean), - 8, 2); + NULL); - tab_float (tbl, n_cols - 2, + tab_double (tbl, n_cols - 2, heading_rows + row_var_start + 4 + i * DESCRIPTIVE_ROWS, TAB_CENTER, percentile_calculate (result->metrics[v].quartiles[1], percentile_algorithm), - 8, 2); + NULL); - tab_float (tbl, n_cols - 2, + tab_double (tbl, n_cols - 2, heading_rows + row_var_start + 5 + i * DESCRIPTIVE_ROWS, TAB_CENTER, result->metrics[v].variance, - 8, 3); + NULL); - tab_float (tbl, n_cols - 2, + tab_double (tbl, n_cols - 2, heading_rows + row_var_start + 6 + i * DESCRIPTIVE_ROWS, TAB_CENTER, sqrt (result->metrics[v].variance), - 8, 3); + NULL); - tab_float (tbl, n_cols - 2, + tab_double (tbl, n_cols - 2, heading_rows + row_var_start + 10 + i * DESCRIPTIVE_ROWS, TAB_CENTER, percentile_calculate (result->metrics[v].quartiles[2], percentile_algorithm) - percentile_calculate (result->metrics[v].quartiles[0], percentile_algorithm), - 8, 2); + NULL); - tab_float (tbl, n_cols - 2, + tab_double (tbl, n_cols - 2, heading_rows + row_var_start + 11 + i * DESCRIPTIVE_ROWS, TAB_CENTER, result->metrics[v].skewness, - 8, 3); + NULL); - tab_float (tbl, n_cols - 2, + tab_double (tbl, n_cols - 2, heading_rows + row_var_start + 12 + i * DESCRIPTIVE_ROWS, TAB_CENTER, result->metrics[v].kurtosis, - 8, 3); + NULL); - tab_float (tbl, n_cols - 1, + tab_double (tbl, n_cols - 1, heading_rows + row_var_start + 11 + i * DESCRIPTIVE_ROWS, TAB_CENTER, calc_seskew (result->metrics[v].n), - 8, 3); + NULL); - tab_float (tbl, n_cols - 1, + tab_double (tbl, n_cols - 1, heading_rows + row_var_start + 12 + i * DESCRIPTIVE_ROWS, TAB_CENTER, calc_sekurt (result->metrics[v].n), - 8, 3); + NULL); { struct extremum *minimum, *maximum ; @@ -1718,23 +1724,23 @@ show_descriptives (const struct variable **dependent_var, maximum = ll_data (max_ll, struct extremum, ll); minimum = ll_data (min_ll, struct extremum, ll); - tab_float (tbl, n_cols - 2, + tab_double (tbl, n_cols - 2, heading_rows + row_var_start + 7 + i * DESCRIPTIVE_ROWS, TAB_CENTER, minimum->value, - 8, 3); + NULL); - tab_float (tbl, n_cols - 2, + tab_double (tbl, n_cols - 2, heading_rows + row_var_start + 8 + i * DESCRIPTIVE_ROWS, TAB_CENTER, maximum->value, - 8, 3); + NULL); - tab_float (tbl, n_cols - 2, + tab_double (tbl, n_cols - 2, heading_rows + row_var_start + 9 + i * DESCRIPTIVE_ROWS, TAB_CENTER, maximum->value - minimum->value, - 8, 3); + NULL); } } } @@ -1788,7 +1794,7 @@ show_extremes (const struct variable **dependent_var, tbl = tab_create (n_cols, n_rows, 0); tab_headers (tbl, heading_columns, 0, heading_rows, 0); - tab_dim (tbl, tab_natural_dimensions); + tab_dim (tbl, tab_natural_dimensions, NULL); /* Outline the box */ tab_box (tbl, @@ -1841,15 +1847,15 @@ show_extremes (const struct variable **dependent_var, for ( e = 1; e <= cmd.st_n; ++e ) { - tab_text (tbl, n_cols - 3, - heading_rows + row_var_start + row_result_start + e - 1, - TAB_RIGHT | TAT_PRINTF, - _("%d"), e); - - tab_text (tbl, n_cols - 3, - heading_rows + row_var_start + row_result_start + cmd.st_n + e - 1, - TAB_RIGHT | TAT_PRINTF, - _("%d"), e); + tab_text_format (tbl, n_cols - 3, + heading_rows + row_var_start + row_result_start + e - 1, + TAB_RIGHT, + "%d", e); + + tab_text_format (tbl, n_cols - 3, + heading_rows + row_var_start + row_result_start + cmd.st_n + e - 1, + TAB_RIGHT, + "%d", e); } @@ -1861,18 +1867,19 @@ show_extremes (const struct variable **dependent_var, while (weight-- > 0 && e < cmd.st_n) { - tab_float (tbl, n_cols - 1, + tab_double (tbl, n_cols - 1, heading_rows + row_var_start + row_result_start + cmd.st_n + e, TAB_RIGHT, minimum->value, - 8, 2); + NULL); - tab_float (tbl, n_cols - 2, - heading_rows + row_var_start + row_result_start + cmd.st_n + e, + tab_fixed (tbl, n_cols - 2, + heading_rows + row_var_start + + row_result_start + cmd.st_n + e, TAB_RIGHT, minimum->location, - 8, 0); + 10, 0); ++e; } @@ -1888,18 +1895,20 @@ show_extremes (const struct variable **dependent_var, while (weight-- > 0 && e < cmd.st_n) { - tab_float (tbl, n_cols - 1, - heading_rows + row_var_start + row_result_start + e, + tab_double (tbl, n_cols - 1, + heading_rows + row_var_start + + row_result_start + e, TAB_RIGHT, maximum->value, - 8, 2); + NULL); - tab_float (tbl, n_cols - 2, - heading_rows + row_var_start + row_result_start + e, + tab_fixed (tbl, n_cols - 2, + heading_rows + row_var_start + + row_result_start + e, TAB_RIGHT, maximum->location, - 8, 0); + 10, 0); ++e; } @@ -1912,7 +1921,7 @@ show_extremes (const struct variable **dependent_var, struct string vstr; ds_init_empty (&vstr); var_append_value_name (fctr->indep_var[0], - result->value[0], &vstr); + &result->value[0], &vstr); tab_text (tbl, 1, heading_rows + row_var_start + row_result_start, @@ -1990,7 +1999,7 @@ show_percentiles (const struct variable **dependent_var, tbl = tab_create (n_cols, n_rows, 0); tab_headers (tbl, heading_columns, 0, heading_rows, 0); - tab_dim (tbl, tab_natural_dimensions); + tab_dim (tbl, tab_natural_dimensions, NULL); /* Outline the box */ tab_box (tbl, @@ -2044,7 +2053,7 @@ show_percentiles (const struct variable **dependent_var, struct string vstr; ds_init_empty (&vstr); var_append_value_name (fctr->indep_var[0], - result->value[0], &vstr); + &result->value[0], &vstr); tab_text (tbl, 1, heading_rows + row_var_start + i * PERCENTILE_ROWS, @@ -2076,12 +2085,12 @@ show_percentiles (const struct variable **dependent_var, for (j = 0; j < n_percentiles; ++j) { double hinge = SYSMIS; - tab_float (tbl, n_cols - n_percentiles + j, + tab_double (tbl, n_cols - n_percentiles + j, heading_rows + row_var_start + i * PERCENTILE_ROWS, TAB_CENTER, percentile_calculate (result->metrics[v].ptl[j], percentile_algorithm), - 8, 2 + NULL ); if ( result->metrics[v].ptl[j]->ptile == 0.5) @@ -2092,11 +2101,11 @@ show_percentiles (const struct variable **dependent_var, hinge = hinges[2]; if ( hinge != SYSMIS) - tab_float (tbl, n_cols - n_percentiles + j, + tab_double (tbl, n_cols - n_percentiles + j, heading_rows + row_var_start + 1 + i * PERCENTILE_ROWS, TAB_CENTER, hinge, - 8, 2 + NULL ); } @@ -2110,11 +2119,10 @@ show_percentiles (const struct variable **dependent_var, for (i = 0 ; i < n_percentiles; ++i ) { - tab_text (tbl, n_cols - n_percentiles + i, 1, - TAB_CENTER | TAT_TITLE | TAT_PRINTF, - _("%g"), - subc_list_double_at (&percentile_list, i) - ); + tab_text_format (tbl, n_cols - n_percentiles + i, 1, + TAB_CENTER | TAT_TITLE, + _("%g"), + subc_list_double_at (&percentile_list, i)); } @@ -2147,13 +2155,13 @@ factor_to_string_concise (const struct xfactor *fctr, { if (fctr->indep_var[0]) { - var_append_value_name (fctr->indep_var[0], result->value[0], str); + var_append_value_name (fctr->indep_var[0], &result->value[0], str); if ( fctr->indep_var[1] ) { ds_put_cstr (str, ","); - var_append_value_name (fctr->indep_var[1], result->value[1], str); + var_append_value_name (fctr->indep_var[1], &result->value[1], str); ds_put_cstr (str, ")"); } @@ -2171,14 +2179,14 @@ factor_to_string (const struct xfactor *fctr, { ds_put_format (str, "(%s = ", var_get_name (fctr->indep_var[0])); - var_append_value_name (fctr->indep_var[0], result->value[0], str); + var_append_value_name (fctr->indep_var[0], &result->value[0], str); if ( fctr->indep_var[1] ) { ds_put_cstr (str, ","); ds_put_format (str, "%s = ", var_get_name (fctr->indep_var[1])); - var_append_value_name (fctr->indep_var[1], result->value[1], str); + var_append_value_name (fctr->indep_var[1], &result->value[1], str); } ds_put_cstr (str, ")"); }