From 881d64eab83b0b53d25e86322cac561c2ad550fb Mon Sep 17 00:00:00 2001 From: John Darrington Date: Thu, 22 Nov 2012 20:15:44 +0100 Subject: [PATCH] Logistic Regression: Added options dialog box --- src/ui/gui/logistic.ui | 184 +++++++++++++++++++- src/ui/gui/psppire-dialog-action-logistic.c | 78 +++++++++ src/ui/gui/psppire-dialog-action-logistic.h | 14 ++ 3 files changed, 274 insertions(+), 2 deletions(-) diff --git a/src/ui/gui/logistic.ui b/src/ui/gui/logistic.ui index 79cb55b16c..9b8e73c3be 100644 --- a/src/ui/gui/logistic.ui +++ b/src/ui/gui/logistic.ui @@ -28,8 +28,9 @@ GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK spread - - S_tatistics... + + _Options... + True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK @@ -233,4 +234,183 @@ + + GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK + Logistic Regression: Options + True + + + True + 2 + + + True + 5 + 5 + + + True + vertical + + + True + + + CI for _exp(B): + True + True + False + True + 1 + True + + + False + False + 0 + + + + + True + True + False + 2 + adjustment1 + + + 1 + + + + + True + % + + + False + False + 2 + + + + + 0 + + + + + True + 2 + 2 + + + True + True + + adjustment2 + 2 + + + 1 + 2 + + + + + True + True + + adjustment3 + + + 1 + 2 + 1 + 2 + + + + + True + Classification cu_toff: + True + spinbutton2 + + + + + + + + True + _Maximum Iterations: + True + spinbutton3 + + + 1 + 2 + + + + + + 1 + + + + + Include _constant in model + True + True + False + True + True + + + 2 + + + + + + + 5 + 0 + + + + + True + 5 + PSPPIRE_BUTTON_CONTINUE_MASK | PSPPIRE_BUTTON_CANCEL_MASK | PSPPIRE_BUTTON_HELP_MASK + + + False + False + end + 1 + + + + + + + 100 + 1 + 10 + + + 0.5 + 1 + 0.01 + 0.10000000000000001 + + + 1 + 1000 + 1 + 10 + diff --git a/src/ui/gui/psppire-dialog-action-logistic.c b/src/ui/gui/psppire-dialog-action-logistic.c index fab3b15aa1..d93a2f5b0c 100644 --- a/src/ui/gui/psppire-dialog-action-logistic.c +++ b/src/ui/gui/psppire-dialog-action-logistic.c @@ -41,6 +41,16 @@ psppire_dialog_action_logistic_class_init (PsppireDialogActionLogisticClass *cla G_DEFINE_TYPE (PsppireDialogActionLogistic, psppire_dialog_action_logistic, PSPPIRE_TYPE_DIALOG_ACTION); +static void +set_sensitivity_from_toggle (GtkToggleButton *togglebutton, gpointer data) +{ + GtkWidget *w = data; + gboolean active = gtk_toggle_button_get_active (togglebutton); + + gtk_widget_set_sensitive (w, active); +} + + static gboolean dialog_state_valid (gpointer data) { @@ -68,19 +78,72 @@ refresh (PsppireDialogAction *rd_) } +static void +on_opts_clicked (PsppireDialogActionLogistic *act) +{ + int ret; + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(act->conf_checkbox), act->conf); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (act->conf_entry), act->conf_level); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(act->const_checkbox), act->constant); + + gtk_spin_button_set_value (GTK_SPIN_BUTTON (act->cut_point_entry), act->cut_point); + gtk_spin_button_set_value (GTK_SPIN_BUTTON (act->iterations_entry), act->max_iterations); + + + ret = psppire_dialog_run (PSPPIRE_DIALOG (act->opts_dialog)); + + if ( ret == PSPPIRE_RESPONSE_CONTINUE ) + { + act->conf = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(act->conf_checkbox)); + act->conf_level = gtk_spin_button_get_value (GTK_SPIN_BUTTON (act->conf_entry)); + + act->constant = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(act->const_checkbox)); + + act->cut_point = gtk_spin_button_get_value (GTK_SPIN_BUTTON (act->cut_point_entry)); + act->max_iterations = gtk_spin_button_get_value (GTK_SPIN_BUTTON (act->iterations_entry)); + } +} + + static void psppire_dialog_action_logistic_activate (GtkAction *a) { PsppireDialogActionLogistic *act = PSPPIRE_DIALOG_ACTION_LOGISTIC (a); PsppireDialogAction *pda = PSPPIRE_DIALOG_ACTION (a); + GtkWidget *opts_button; GtkBuilder *xml = builder_new ("logistic.ui"); pda->dialog = get_widget_assert (xml, "logistic-dialog"); pda->source = get_widget_assert (xml, "dict-view"); + act->cut_point = 0.5; + act->max_iterations = 20; + act->constant = true; + act->conf = false; + act->conf_level = 95; act->dep_var = get_widget_assert (xml, "dependent-entry"); act->indep_vars = get_widget_assert (xml, "indep-view"); + act->opts_dialog = get_widget_assert (xml, "options-dialog"); + act->conf_checkbox = get_widget_assert (xml, "checkbutton2"); + act->conf_entry = get_widget_assert (xml, "spinbutton1"); + act->const_checkbox = get_widget_assert (xml, "checkbutton1"); + + act->iterations_entry = get_widget_assert (xml, "spinbutton3"); + act->cut_point_entry = get_widget_assert (xml, "spinbutton2"); + + opts_button = get_widget_assert (xml, "options-button"); + + g_signal_connect_swapped (opts_button, "clicked", + G_CALLBACK (on_opts_clicked), act); + + g_signal_connect (act->conf_checkbox, "toggled", + G_CALLBACK (set_sensitivity_from_toggle), + act->conf_entry); + + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(act->conf_checkbox), TRUE); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(act->conf_checkbox), FALSE); g_object_unref (xml); @@ -111,6 +174,21 @@ generate_syntax (PsppireDialogAction *a) psppire_var_view_append_names (PSPPIRE_VAR_VIEW (rd->indep_vars), 0, string); + g_string_append (string, "\n\t/CRITERIA ="); + + g_string_append_printf (string, " CUT(%g)", rd->cut_point); + g_string_append_printf (string, " ITERATE(%d)", rd->max_iterations); + + if (rd->conf) + { + g_string_append_printf (string, "\n\t/PRINT = CI(%g)", rd->conf_level); + } + + if (rd->constant) + g_string_append (string, "\n\t/NOORIGIN"); + else + g_string_append (string, "\n\t/ORIGIN"); + g_string_append (string, ".\n"); text = string->str; diff --git a/src/ui/gui/psppire-dialog-action-logistic.h b/src/ui/gui/psppire-dialog-action-logistic.h index 8607dff749..9dab276acb 100644 --- a/src/ui/gui/psppire-dialog-action-logistic.h +++ b/src/ui/gui/psppire-dialog-action-logistic.h @@ -62,6 +62,20 @@ struct _PsppireDialogActionLogistic GtkWidget *dep_var; GtkWidget *indep_vars; + + GtkWidget *opts_dialog; + GtkWidget *conf_checkbox; + GtkWidget *conf_entry; + GtkWidget *const_checkbox; + GtkWidget *iterations_entry; + GtkWidget *cut_point_entry; + + gdouble cut_point; + gint max_iterations; + gboolean constant; + + gboolean conf; + gdouble conf_level; }; -- 2.30.2