Initial version of interaction
authorJason Stover <jhs@math.gcsu.edu>
Thu, 31 May 2007 23:09:21 +0000 (23:09 +0000)
committerJason Stover <jhs@math.gcsu.edu>
Thu, 31 May 2007 23:09:21 +0000 (23:09 +0000)
src/math/ChangeLog
src/math/automake.mk
src/math/interaction.c [new file with mode: 0644]
src/math/interaction.h [new file with mode: 0644]

index e351fbbb4fdd43a0e00ab73fc99bb05387761d95..acc403883b9ba9fd3b4ea1ff9283a3575e22cbf9 100644 (file)
@@ -1,3 +1,8 @@
+2007-05-31  Jason Stover  <jhs@math.gcsu.edu>
+
+       * interaction.c: New file.
+       * interaction.h : New file.
+
 Mon Feb  5 15:42:14 2007  Ben Pfaff  <blp@gnu.org>
 
        * moments.c (moments_pass_two): Reduce number of multiplications.
index 45543fc3c21c8d90412cc795f4ecce3c3d5afe6e..2a8f4408a0fe548e827f5149f6bf3cc775462517 100644 (file)
@@ -13,8 +13,10 @@ src_math_libpspp_math_a_SOURCES = \
        src/math/coefficient.c \
        src/math/coefficient.h \
        src/math/group.c  src/math/group.h \
-       src/math/histogram.c src/math/histogram.h \
        src/math/group-proc.h \
+       src/math/histogram.c src/math/histogram.h \
+       src/math/interaction.c \
+       src/math/interaction.h \
        src/math/levene.c \
        src/math/levene.h \
        src/math/moments.c  src/math/moments.h \
diff --git a/src/math/interaction.c b/src/math/interaction.c
new file mode 100644 (file)
index 0000000..be3d3ed
--- /dev/null
@@ -0,0 +1,103 @@
+/* PSPP - Creates data structures to store interactions for
+   statistical routines.  
+
+   Copyright (C) 2007 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA. */
+
+/*
+  An interaction is a gsl_vector containing a "product" of other
+  variables. The variables can be either categorical or numeric.
+  If the variables are all numeric, the interaction is just the
+  scalar product. If any of the variables are categorical, their
+  product is a vector containing 0's in all but one entry. This entry
+  is found by combining the vectors corresponding to the variables'
+  OBS_VALS member. If there are K categorical variables, each with
+  N_1, N_2, ..., N_K categories, then the interaction will have
+  N_1 * N_2 * N_3 *...* N_K - 1 entries.
+ */
+#include <assert.h>
+#include <libpspp/alloc.h>
+#include <gsl/gsl_math.h>
+#include <gsl/gsl_vector.h>
+#include <data/category.h>
+#include <data/variable.h>
+
+/*
+  Convert a list of values to a binary vector. The order of VALS must
+  correspond to the order of V.
+ */
+gsl_vector *
+get_interaction (union value **vals, const struct variable **v, size_t n_vars)
+{
+  gsl_vector *result = NULL;
+  size_t *subs = NULL;
+  size_t length = 1;
+  size_t i;
+  size_t j;
+  double tmp = 1.0;
+
+  assert (n_vars > 0);
+  for (i = 0; i < n_vars; i++)
+    {
+      if (var_is_alpha (v[i]))
+       {
+         length *= cat_get_n_categories (v[i]);
+       }
+      else
+       {
+         length = (length > 0) ? length : 1;
+       }
+    }
+  if (length > 0)
+    {
+      length--;
+    }
+
+  result = gsl_vector_calloc (length);
+  subs = xnmalloc (n_vars, sizeof (*subs));
+  for (j = 0; j < n_vars; j++)
+    {
+      if (var_is_alpha (v[j]))
+       {
+         subs[j] = cat_value_find (v[j], vals[j]);
+       }
+    }
+  j = subs[0];
+  for (i = 1; i < n_vars; i++)
+    {
+      j = j * cat_get_n_categories (v[i]) + subs[i];
+    }
+  gsl_vector_set (result, j, 1.0);
+  /*
+     If any of the variables are numeric, the interaction of that
+     variable with another is just a scalar product.
+   */
+  for (i = 1; i < n_vars; i++)
+    {
+      if (var_is_numeric (v[i]))
+       {
+         tmp *= vals[i]->f;
+       }
+    }
+  if (fabs (tmp - 1.0) > GSL_DBL_EPSILON)
+    {
+      gsl_vector_set (result, j, tmp);
+    }
+  free (subs);
+
+  return result;
+}
diff --git a/src/math/interaction.h b/src/math/interaction.h
new file mode 100644 (file)
index 0000000..4e70981
--- /dev/null
@@ -0,0 +1,21 @@
+/* PSPP - Creates data structures to store interactions for
+   statistical routines.  
+
+   Copyright (C) 2007 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA. */
+gsl_vector *
+get_interaction (union value **, const struct variable **, size_t);