+static void
+show_coords (struct roc_state *rs, const struct cmd_roc *roc)
+{
+ int x = 1;
+ int i;
+ const int n_cols = roc->n_vars > 1 ? 4 : 3;
+ int n_rows = 1;
+ struct tab_table *tbl ;
+
+ for (i = 0; i < roc->n_vars; ++i)
+ n_rows += casereader_count_cases (rs[i].cutpoint_rdr);
+
+ tbl = tab_create (n_cols, n_rows, 0);
+
+ if ( roc->n_vars > 1)
+ tab_title (tbl, _("Coordinates of the Curve"));
+ else
+ tab_title (tbl, _("Coordinates of the Curve (%s)"), var_to_string (roc->vars[0]));
+
+
+ tab_headers (tbl, 1, 0, 1, 0);
+
+ tab_dim (tbl, tab_natural_dimensions, NULL);
+
+ tab_hline (tbl, TAL_2, 0, n_cols - 1, 1);
+
+ if ( roc->n_vars > 1)
+ tab_text (tbl, 0, 0, TAT_TITLE, _("Test variable"));
+
+ tab_text (tbl, n_cols - 3, 0, TAT_TITLE, _("Positive if greater than or equal to"));
+ tab_text (tbl, n_cols - 2, 0, TAT_TITLE, _("Sensitivity"));
+ tab_text (tbl, n_cols - 1, 0, TAT_TITLE, _("1 - Specificity"));
+
+ tab_box (tbl,
+ TAL_2, TAL_2,
+ -1, TAL_1,
+ 0, 0,
+ n_cols - 1,
+ n_rows - 1);
+
+ if ( roc->n_vars > 1)
+ tab_vline (tbl, TAL_2, 1, 0, n_rows - 1);
+
+ for (i = 0; i < roc->n_vars; ++i)
+ {
+ struct ccase *cc;
+ struct casereader *r = casereader_clone (rs[i].cutpoint_rdr);
+
+ if ( roc->n_vars > 1)
+ tab_text (tbl, 0, x, TAT_TITLE, var_to_string (roc->vars[i]));
+
+ if ( i > 0)
+ tab_hline (tbl, TAL_1, 0, n_cols - 1, x);
+
+
+ for (; (cc = casereader_read (r)) != NULL;
+ case_unref (cc), x++)
+ {
+ const double se = case_data_idx (cc, TP)->f /
+ (
+ case_data_idx (cc, TP)->f
+ +
+ case_data_idx (cc, FN)->f
+ );
+
+ const double sp = case_data_idx (cc, TN)->f /
+ (
+ case_data_idx (cc, TN)->f
+ +
+ case_data_idx (cc, FP)->f
+ );
+
+ tab_double (tbl, n_cols - 3, x, 0, case_data_idx (cc, CUTPOINT)->f,
+ var_get_print_format (roc->vars[i]));
+
+ tab_double (tbl, n_cols - 2, x, 0, se, NULL);
+ tab_double (tbl, n_cols - 1, x, 0, 1 - sp, NULL);
+ }
+
+ casereader_destroy (r);
+ }
+
+ tab_submit (tbl);
+}
+
+
+static void
+draw_roc (struct roc_state *rs, const struct cmd_roc *roc)
+{
+ int i;
+
+ struct chart *roc_chart = chart_create ();
+
+ chart_write_title (roc_chart, _("ROC Curve"));
+ chart_write_xlabel (roc_chart, _("1 - Specificity"));
+ chart_write_ylabel (roc_chart, _("Sensitivity"));
+
+ chart_write_xscale (roc_chart, 0, 1, 5);
+ chart_write_yscale (roc_chart, 0, 1, 5);
+
+ if ( roc->reference )
+ {
+ chart_line (roc_chart, 1.0, 0,
+ 0.0, 1.0,
+ CHART_DIM_X);
+ }
+
+ for (i = 0; i < roc->n_vars; ++i)
+ {
+ struct ccase *cc;
+ struct casereader *r = casereader_clone (rs[i].cutpoint_rdr);
+
+ chart_vector_start (roc_chart, var_get_name (roc->vars[i]));
+ for (; (cc = casereader_read (r)) != NULL;
+ case_unref (cc))
+ {
+ double se = case_data_idx (cc, TP)->f;
+ double sp = case_data_idx (cc, TN)->f;
+
+ se /= case_data_idx (cc, FN)->f +
+ case_data_idx (cc, TP)->f ;
+
+ sp /= case_data_idx (cc, TN)->f +
+ case_data_idx (cc, FP)->f ;
+
+ chart_vector (roc_chart, 1 - sp, se);
+ }
+ chart_vector_end (roc_chart);
+ casereader_destroy (r);
+ }
+
+ chart_write_legend (roc_chart);
+
+ chart_submit (roc_chart);
+}
+
+