pspp-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: type 3 fixed in GLM


From: Jason Stover
Subject: Re: type 3 fixed in GLM
Date: Mon, 26 Sep 2011 14:42:51 -0400
User-agent: Mutt/1.5.18 (2008-05-17)

On Mon, Sep 26, 2011 at 05:54:25PM +0000, John Darrington wrote:
> I have a small patch which perhaps you could review before I push it.

Looks good to me.

-Jason

> 
> J'
> 
> On Sun, Sep 18, 2011 at 05:18:09PM -0400, Jason Stover wrote:
>      I just pushed a fixe for type 3 sums of squares in the presence of
>      interactions. 
>      
>      -Jason
>      
>      _______________________________________________
>      pspp-dev mailing list
>      address@hidden
>      https://lists.gnu.org/mailman/listinfo/pspp-dev
> 
> -- 
> PGP Public key ID: 1024D/2DE827B3 
> fingerprint = 8797 A26D 0854 2EAB 0285  A290 8A67 719C 2DE8 27B3
> See http://pgp.mit.edu or any PGP keyserver for public key.
> 

> commit fbfe1712cba1525b841bcbb6d5bf7c5532cda0c5
> Author: John Darrington <address@hidden>
> Date:   Fri Sep 23 15:56:45 2011 +0200
> 
>     Move interaction subset predicates out of glm.c into interaction.c
>     
>     Renamed function:   is_subset --> interaction_is_proper_subset
>                         drop_from_submodel --> interaction_is_subset
>     and moved them into interaction.c  This seems to me to be easier
>     to understand, and more efficient.
> 
> diff --git a/src/language/stats/glm.c b/src/language/stats/glm.c
> index dddf391..b23832f 100644
> --- a/src/language/stats/glm.c
> +++ b/src/language/stats/glm.c
> @@ -347,59 +347,6 @@ not_dropped (size_t j, const size_t *dropped, size_t 
> n_dropped)
>    return true;
>  }
>  
> -/*
> -  Do the variables in X->VARS constitute a proper
> -  subset of the variables in Y->VARS?
> - */
> -static bool
> -is_subset (const struct interaction *x, const struct interaction *y)
> -{
> -  size_t i;
> -  size_t j;
> -  size_t n = 0;
> -
> -  if (x->n_vars < y->n_vars)
> -    {
> -      for (i = 0; i < x->n_vars; i++)
> -     {
> -       for (j = 0; j < y->n_vars; j++)
> -         {
> -           if (x->vars [i] == y->vars [j])
> -             {
> -               n++;
> -             }
> -         }
> -     }
> -    }
> -  if (n >= x->n_vars)
> -    return true;
> -  return false;
> -}
> -
> -static bool
> -drop_from_submodel (const struct interaction *x, const struct interaction *y)
> -{
> -  size_t i;
> -  size_t j;
> -  size_t n = 0;
> -
> -  if (is_subset (x, y))
> -    return true;
> -
> -  for (i = 0; i < x->n_vars; i++)
> -    for (j = 0; j < y->n_vars; j++)
> -      {
> -     if (x->vars [i] == y->vars [j])
> -       n++;
> -      }
> -  if (n == x->n_vars)
> -    {
> -      return true;
> -    }
> -
> -  return false;
> -}
> -
>  static void
>  fill_submatrix (gsl_matrix * cov, gsl_matrix * submatrix, size_t * dropped,
>               size_t n_dropped)
> @@ -448,12 +395,12 @@ get_ssq (struct covariance *cov, gsl_vector *ssq, const 
> struct glm_spec *cmd)
>       {
>         const struct interaction * x = 
>           categoricals_get_interaction_by_subscript (cats, i - 
> cmd->n_dep_vars);
> -       if (is_subset (cmd->interactions [k], x))
> +       if (interaction_is_proper_subset (cmd->interactions [k], x))
>           {
>             assert (n_dropped_model < covariance_dim (cov));
>             model_dropped[n_dropped_model++] = i;
>           }
> -       if (drop_from_submodel (cmd->interactions [k], x))
> +       if (interaction_is_subset (cmd->interactions [k], x))
>           {
>             assert (n_dropped_submodel < covariance_dim (cov));
>             submodel_dropped[n_dropped_submodel++] = i;
> diff --git a/src/math/interaction.c b/src/math/interaction.c
> index d24166d..d81eba5 100644
> --- a/src/math/interaction.c
> +++ b/src/math/interaction.c
> @@ -72,6 +72,56 @@ interaction_add_variable (struct interaction *i, const 
> struct variable *v)
>  }
>  
>  
> +/*
> +  Do the variables in X->VARS constitute a proper
> +  subset of the variables in Y->VARS?
> + */
> +bool
> +interaction_is_proper_subset (const struct interaction *x, const struct 
> interaction *y)
> +{
> +  if (x->n_vars >= y->n_vars)
> +    return false;
> +
> +  return interaction_is_subset (x, y);
> +}
> +
> +/*
> +  Do the variables in X->VARS constitute a 
> +  subset (proper or otherwise) of the variables in Y->VARS?
> + */
> +bool
> +interaction_is_subset (const struct interaction *x, const struct interaction 
> *y)
> +{
> +  size_t i;
> +  size_t j;
> +  size_t n = 0;
> +
> +  /* By definition, a subset cannot have more members than its superset */
> +  if (x->n_vars > y->n_vars)
> +    return false;
> +
> +  /* Count the number of values which are members of both sets */
> +  for (i = 0; i < x->n_vars; i++)
> +    {
> +      for (j = 0; j < y->n_vars; j++)
> +     {
> +       if (x->vars [i] == y->vars [j])
> +         {
> +           n++;
> +         }
> +     }
> +    }
> +
> +  /* If ALL the members of X were also found in Y, then this must be a 
> subset */    
> +  if (n >= x->n_vars)
> +    return true;
> +
> +  return false;
> +}
> +
> +
> +
> +
>  void
>  interaction_dump (const struct interaction *i)
>  {
> diff --git a/src/math/interaction.h b/src/math/interaction.h
> index cd38ae2..0fb1f26 100644
> --- a/src/math/interaction.h
> +++ b/src/math/interaction.h
> @@ -37,6 +37,8 @@ void interaction_destroy (struct interaction *);
>  void interaction_add_variable (struct interaction *, const struct variable 
> *);
>  void interaction_dump (const struct interaction *);
>  void interaction_to_string (const struct interaction *iact, struct string 
> *str);
> +bool interaction_is_proper_subset (const struct interaction *x, const struct 
> interaction *y);
> +bool interaction_is_subset (const struct interaction *x, const struct 
> interaction *y);
>  
>  
>  struct ccase;






reply via email to

[Prev in Thread] Current Thread [Next in Thread]