Added second ROC test
[pspp-builds.git] / src / language / stats / roc.c
index 21b70318618960d8782398598c1a3512895c763d..88f954044f2122c6ae64be9f20093719b522de13 100644 (file)
@@ -36,6 +36,9 @@
 #include <gsl/gsl_cdf.h>
 #include <output/table.h>
 
+#include <output/charts/plot-chart.h>
+#include <output/charts/cartesian.h>
+
 #include "gettext.h"
 #define _(msgid) gettext (msgid)
 #define N_(msgid) msgid
@@ -557,8 +560,7 @@ do_roc (struct cmd_roc *roc, struct casereader *input, struct dictionary *dict)
     struct caseproto *proto = caseproto_create ();
 
     struct subcase ordering;
-    struct variable *iv = var_create_internal (CUTPOINT);
-    subcase_init_var (&ordering, iv, SC_ASCEND);
+    subcase_init (&ordering, CUTPOINT, 0, SC_ASCEND);
 
 
     proto = caseproto_add_width (proto, 0); /* cutpoint */
@@ -638,6 +640,13 @@ do_roc (struct cmd_roc *roc, struct casereader *input, struct dictionary *dict)
       n_neg = process_negative_group (var, neg, dict, &rs[i]);
 
 
+      printf ("Positives:\n");
+      dump_casereader (n_pos);
+
+      printf ("Negatives:\n");
+      dump_casereader (n_neg);
+
+#if 0
       /* Simple join on VALUE */
       for ( ; (cpos = casereader_read (n_pos) ); case_unref (cpos))
        {
@@ -688,6 +697,7 @@ do_roc (struct cmd_roc *roc, struct casereader *input, struct dictionary *dict)
          rs[i].q2hat /= rs[i].n1 * pow2 (rs[i].n2);
        }
     }
+#endif
 
   casereader_destroy (positives);
   casereader_destroy (negatives);
@@ -936,17 +946,64 @@ show_coords (struct roc_state *rs, const struct cmd_roc *roc)
 }
 
 
+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);
+}
+
 
 static void
 output_roc (struct roc_state *rs, const struct cmd_roc *roc)
 {
   show_summary (roc);
 
-#if 0
-
   if ( roc->curve )
     draw_roc (rs, roc);
-#endif
 
   show_auc (rs, roc);