#include "output/charts/boxplot.h"
#include "output/charts/np-plot.h"
+#include "output/charts/spreadlevel-plot.h"
#include "output/charts/plot-hist.h"
#include "language/command.h"
#define _(msgid) gettext (msgid)
#define N_(msgid) msgid
+static void
+append_value_name (const struct variable *var, const union value *val, struct string *str)
+{
+ var_append_value_name (var, val, str);
+ if ( var_is_value_missing (var, val, MV_ANY))
+ ds_put_cstr (str, _(" (missing)"));
+}
+
enum bp_mode
{
BP_GROUPS,
size_t n_iacts;
struct interaction **iacts;
- enum mv_class exclude;
+ enum mv_class dep_excl;
+ enum mv_class fctr_excl;
const struct dictionary *dict;
bool npplot;
bool histogram;
bool boxplot;
+ bool spreadlevel;
+ int sl_power;
enum bp_mode boxplot_mode;
ds_put_cstr (&label, var_to_string (ivar));
ds_put_cstr (&label, " = ");
- var_append_value_name (ivar, val, &label);
+ append_value_name (ivar, val, &label);
ds_put_cstr (&label, "; ");
}
ds_put_cstr (&label, var_to_string (ivar));
ds_put_cstr (&label, " = ");
- var_append_value_name (ivar, val, &label);
+ append_value_name (ivar, val, &label);
ds_put_cstr (&label, "; ");
}
ds_put_cstr (&label, var_to_string (ivar));
ds_put_cstr (&label, " = ");
- var_append_value_name (ivar, val, &label);
+ append_value_name (ivar, val, &label);
ds_put_cstr (&label, "; ");
}
}
}
+static void
+show_spreadlevel (const struct examine *cmd, int iact_idx)
+{
+ const struct interaction *iact = cmd->iacts[iact_idx];
+ const size_t n_cats = categoricals_n_count (cmd->cats, iact_idx);
+
+ int v;
+
+ /* Spreadlevel when there are no levels is not useful */
+ if (iact->n_vars == 0)
+ return;
+
+ for (v = 0; v < cmd->n_dep_vars; ++v)
+ {
+ int grp;
+ struct chart_item *sl;
+
+ struct string label;
+ ds_init_cstr (&label,
+ var_to_string (cmd->dep_vars[v]));
+
+ if (iact->n_vars > 0)
+ {
+ ds_put_cstr (&label, " (");
+ interaction_to_string (iact, &label);
+ ds_put_cstr (&label, ")");
+ }
+
+ sl = spreadlevel_plot_create (ds_cstr (&label), cmd->sl_power);
+
+ for (grp = 0; grp < n_cats; ++grp)
+ {
+ const struct exploratory_stats *es =
+ categoricals_get_user_data_by_category_real (cmd->cats, iact_idx, grp);
+
+ double median = percentile_calculate (es[v].quartiles[1], cmd->pc_alg);
+
+ double iqr = percentile_calculate (es[v].quartiles[2], cmd->pc_alg) -
+ percentile_calculate (es[v].quartiles[0], cmd->pc_alg);
+
+ spreadlevel_plot_add (sl, iqr, median);
+ }
+
+ if (sl == NULL)
+ msg (MW, _("Not creating spreadlevel chart for %s"), ds_cstr (&label));
+ else
+ chart_item_submit (sl);
+
+ ds_destroy (&label);
+ }
+}
+
static void
show_histogram (const struct examine *cmd, int iact_idx)
ds_put_cstr (&label, var_to_string (ivar));
ds_put_cstr (&label, " = ");
- var_append_value_name (ivar, val, &label);
+ append_value_name (ivar, val, &label);
ds_put_cstr (&label, "; ");
}
{
struct string str;
ds_init_empty (&str);
- var_append_value_name (ivar, val, &str);
+ append_value_name (ivar, val, &str);
tab_text (t,
1 + ivar_idx,
{
struct string str;
ds_init_empty (&str);
- var_append_value_name (ivar, val, &str);
+ append_value_name (ivar, val, &str);
tab_text (t,
1 + ivar_idx,
{
struct string str;
ds_init_empty (&str);
- var_append_value_name (ivar, val, &str);
+ append_value_name (ivar, val, &str);
tab_text (t,
1 + ivar_idx,
&F_8_0);
tab_double (t,
- heading_columns + 1,
- heading_rows + v * rows_per_var + i * rows_per_cat + e,
- 0,
- es->maxima[e].val,
- 0);
-
-
+ heading_columns + 1,
+ heading_rows + v * rows_per_var + i * rows_per_cat + e,
+ 0,
+ es->maxima[e].val,
+ var_get_print_format (cmd->dep_vars[v]));
+
tab_double (t,
heading_columns - 1,
heading_rows + v * rows_per_var + i * rows_per_cat + cmd->disp_extremes + e,
0,
es->minima[e].val,
- 0);
+ var_get_print_format (cmd->dep_vars[v]));
}
}
free (prev_val);
{
struct string str;
ds_init_empty (&str);
- var_append_value_name (ivar, val, &str);
+ append_value_name (ivar, val, &str);
tab_text (t,
1 + ivar_idx, heading_rows + n_cats * v + i,
const struct variable *var = examine->dep_vars[v];
const double x = case_data (c, var)->f;
- if (var_is_value_missing (var, case_data (c, var), examine->exclude))
+ if (var_is_value_missing (var, case_data (c, var), examine->dep_excl))
{
es[v].missing += weight;
continue;
/ (1 + log2 (es[v].cc))
;
- bin_width = chart_rounded_tick (bin_width);
-
es[v].histogram =
histogram_create (bin_width, es[v].minimum, es[v].maximum);
}
cmd->cats
= categoricals_create (cmd->iacts, cmd->n_iacts,
- cmd->wv, cmd->exclude);
+ cmd->wv, cmd->dep_excl, cmd->fctr_excl);
categoricals_set_payload (cmd->cats, &payload, cmd, NULL);
case_unref (c);
}
- /* FIXME: Filter out missing factor variables */
-
/* Remove cases on a listwise basis if requested */
if ( cmd->missing_pw == false)
input = casereader_create_filter_missing (input,
cmd->dep_vars,
cmd->n_dep_vars,
- cmd->exclude,
+ cmd->dep_excl,
NULL,
NULL);
if (cmd->npplot)
show_npplot (cmd, i);
+ if (cmd->spreadlevel)
+ show_spreadlevel (cmd, i);
+
if (cmd->descriptives)
descriptives_report (cmd, i);
}
examine.iacts = iacts_mem = pool_zalloc (examine.pool, sizeof (struct interaction *));
examine.iacts[0] = interaction_create (NULL);
- examine.exclude = MV_ANY;
+ examine.dep_excl = MV_ANY;
+ examine.fctr_excl = MV_ANY;
examine.histogram = false;
examine.npplot = false;
examine.boxplot = false;
+ examine.spreadlevel = false;
+ examine.sl_power = 0;
examine.dict = dataset_dict (ds);
}
else if (lex_match_id (lexer, "EXCLUDE"))
{
- examine.exclude = MV_ANY;
+ examine.dep_excl = MV_ANY;
}
else if (lex_match_id (lexer, "INCLUDE"))
{
- examine.exclude = MV_SYSTEM;
+ examine.dep_excl = MV_SYSTEM;
+ }
+ else if (lex_match_id (lexer, "REPORT"))
+ {
+ examine.fctr_excl = MV_NEVER;
+ }
+ else if (lex_match_id (lexer, "NOREPORT"))
+ {
+ examine.fctr_excl = MV_ANY;
}
else
{
{
examine.histogram = true;
}
+ else if (lex_match_id (lexer, "SPREADLEVEL"))
+ {
+ examine.spreadlevel = true;
+ examine.sl_power = 0;
+ if (lex_match (lexer, T_LPAREN))
+ {
+ examine.sl_power = lex_integer (lexer);
+
+ lex_get (lexer);
+ if (! lex_force_match (lexer, T_RPAREN))
+ goto error;
+ }
+ }
else if (lex_match_id (lexer, "NONE"))
{
examine.histogram = false;
error:
caseproto_unref (examine.ex_proto);
+ examine.iacts = iacts_mem;
for (i = 0; i < examine.n_iacts; ++i)
interaction_destroy (examine.iacts[i]);
free (examine.dep_vars);