if (!parse_variables_const (lexer, dict, &roc.vars, &roc.n_vars,
PV_APPEND | PV_NO_DUPLICATE | PV_NUMERIC))
- goto error;;
+ goto error;
if ( ! lex_force_match (lexer, T_BY))
{
- goto error;;
+ goto error;
}
roc.state_var = parse_variable (lexer, dict);
if ( !lex_force_match (lexer, '('))
{
- goto error;;
+ goto error;
}
parse_value (lexer, &roc.state_value, var_get_width (roc.state_var));
if ( !lex_force_match (lexer, ')'))
{
- goto error;;
+ goto error;
}
else
{
lex_error (lexer, NULL);
- goto error;;
+ goto error;
}
}
}
else
{
lex_error (lexer, NULL);
- goto error;;
+ goto error;
}
}
else if (lex_match_id (lexer, "PRINT"))
else
{
lex_error (lexer, NULL);
- goto error;;
+ goto error;
}
}
}
else
{
lex_error (lexer, NULL);
- goto error;;
+ goto error;
}
lex_force_match (lexer, ')');
}
else
{
lex_error (lexer, NULL);
- goto error;;
+ goto error;
}
lex_force_match (lexer, ')');
}
else
{
lex_error (lexer, NULL);
- goto error;;
+ goto error;
}
lex_force_match (lexer, ')');
}
else
{
lex_error (lexer, NULL);
- goto error;;
+ goto error;
}
}
}
}
if ( ! run_roc (ds, &roc))
- goto error;;
+ goto error;
+ free (roc.vars);
return CMD_SUCCESS;
error:
standard error values */
struct roc_state
{
- double auc;
+ double auc; /* Area under the curve */
- double n1;
- double n2;
+ double n1; /* total weight of positives */
+ double n2; /* total weight of negatives */
- double q1hat;
+ /* intermediates for standard error */
+ double q1hat;
double q2hat;
+ /* intermediates for cutpoints */
struct casewriter *cutpoint_wtr;
struct casereader *cutpoint_rdr;
double prev_result;
static void output_roc (struct roc_state *rs, const struct cmd_roc *roc);
+/*
+ This function does 3 things:
+
+ 1. Counts the number of cases which are equal to every other case in READER,
+ and those cases for which the relationship between it and every other case
+ satifies PRED (normally either > or <). VAR is variable defining a case's value
+ for this purpose.
+ 2. Counts the number of true and false cases in reader, and populates
+ CUTPOINT_RDR accordingly. TRUE_INDEX and FALSE_INDEX are the indices
+ which receive these values. POS_COND is the condition defining true
+ and false.
+
+ 3. CC is filled with the cumulative weight of all cases of READER.
+*/
static struct casereader *
process_group (const struct variable *var, struct casereader *reader,
bool (*pred) (double, double),
tab_text (tbl, n_cols - 2, 1, TAT_TITLE, _("Lower Bound"));
tab_text (tbl, n_cols - 1, 1, TAT_TITLE, _("Upper Bound"));
- tab_joint_text (tbl, n_cols - 2, 0, 4, 0,
- TAT_TITLE | TAB_CENTER | TAT_PRINTF,
- _("Asymp. %g%% Confidence Interval"), roc->ci);
+ tab_joint_text_format (tbl, n_cols - 2, 0, 4, 0,
+ TAT_TITLE | TAB_CENTER,
+ _("Asymp. %g%% Confidence Interval"), roc->ci);
tab_vline (tbl, 0, n_cols - 1, 0, 0);
tab_hline (tbl, TAL_1, n_cols - 2, n_cols - 1, 1);
}