X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Flanguage%2Fstats%2Fglm.c;h=2536c5f52de069c9e326f3891e18600d61394c1e;hb=7235f7f42b61c2b111174c3ee5ca72aac8815cd5;hp=ad344576dc8afd0ca140077834fa3377f261d46d;hpb=d8fff4b13efef42dcb8ef94bf99ee275d889c860;p=pspp diff --git a/src/language/stats/glm.c b/src/language/stats/glm.c index ad344576dc..2536c5f52d 100644 --- a/src/language/stats/glm.c +++ b/src/language/stats/glm.c @@ -124,8 +124,6 @@ static void run_glm (struct glm_spec *cmd, struct casereader *input, static bool parse_design_spec (struct lexer *lexer, struct glm_spec *glm); -/* Define to 1 if the /DESIGN subcommand should not be optional */ -#define DESIGN_MANDATORY 1 int cmd_glm (struct lexer *lexer, struct dataset *ds) @@ -283,18 +281,8 @@ cmd_glm (struct lexer *lexer, struct dataset *ds) if (! parse_design_spec (lexer, &glm)) goto error; -#if DESIGN_MANDATORY - if ( glm.n_interactions == 0) - { - msg (ME, _("One or more design variables must be given")); - goto error; - } - - design = true; -#else if (glm.n_interactions > 0) design = true; -#endif } else { @@ -305,11 +293,6 @@ cmd_glm (struct lexer *lexer, struct dataset *ds) if ( ! design ) { -#if DESIGN_MANDATORY - lex_error (lexer, _("/DESIGN is mandatory in GLM")); - goto error; -#endif - design_full (&glm); } @@ -351,75 +334,14 @@ error: static void get_ssq (struct covariance *, gsl_vector *, const struct glm_spec *); -static bool -not_dropped (size_t j, const size_t *dropped, size_t n_dropped) +static inline bool +not_dropped (size_t j, const bool *ff) { - size_t i; - - for (i = 0; i < n_dropped; i++) - { - if (j == dropped[i]) - return false; - } - return true; -} - -/* - Do the variables in X->VARS constitute a proper - subset of the variables in Y->VARS? - */ -static bool -is_subset (struct interaction *x, 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 (struct interaction *x, 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; + return ! ff[j]; } static void -fill_submatrix (gsl_matrix * cov, gsl_matrix * submatrix, size_t * dropped, - size_t n_dropped) +fill_submatrix (const gsl_matrix * cov, gsl_matrix * submatrix, bool *dropped_f) { size_t i; size_t j; @@ -428,12 +350,12 @@ fill_submatrix (gsl_matrix * cov, gsl_matrix * submatrix, size_t * dropped, for (i = 0; i < cov->size1; i++) { - if (not_dropped (i, dropped, n_dropped)) + if (not_dropped (i, dropped_f)) { m = 0; for (j = 0; j < cov->size2; j++) { - if (not_dropped (j, dropped, n_dropped)) + if (not_dropped (j, dropped_f)) { gsl_matrix_set (submatrix, n, m, gsl_matrix_get (cov, i, j)); @@ -451,8 +373,8 @@ get_ssq (struct covariance *cov, gsl_vector *ssq, const struct glm_spec *cmd) gsl_matrix *cm = covariance_calculate_unnormalized (cov); size_t i; size_t k; - size_t *model_dropped = xcalloc (covariance_dim (cov), sizeof (*model_dropped)); - size_t *submodel_dropped = xcalloc (covariance_dim (cov), sizeof (*submodel_dropped)); + bool *model_dropped = xcalloc (covariance_dim (cov), sizeof (*model_dropped)); + bool *submodel_dropped = xcalloc (covariance_dim (cov), sizeof (*submodel_dropped)); const struct categoricals *cats = covariance_get_categoricals (cov); for (k = 0; k < cmd->n_interactions; k++) @@ -465,30 +387,38 @@ 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)) - { - assert (n_dropped_model < covariance_dim (cov)); - model_dropped[n_dropped_model++] = i; - } - if (drop_from_submodel (cmd->interactions [k], x)) + + model_dropped[i] = false; + submodel_dropped[i] = false; + if (interaction_is_subset (cmd->interactions [k], x)) { assert (n_dropped_submodel < covariance_dim (cov)); - submodel_dropped[n_dropped_submodel++] = i; + n_dropped_submodel++; + submodel_dropped[i] = true; + + if ( cmd->interactions [k]->n_vars < x->n_vars) + { + assert (n_dropped_model < covariance_dim (cov)); + n_dropped_model++; + model_dropped[i] = true; + } } } - model_cov = - gsl_matrix_alloc (cm->size1 - n_dropped_model, cm->size2 - n_dropped_model); + + model_cov = gsl_matrix_alloc (cm->size1 - n_dropped_model, cm->size2 - n_dropped_model); gsl_matrix_set (model_cov, 0, 0, gsl_matrix_get (cm, 0, 0)); - submodel_cov = - gsl_matrix_calloc (cm->size1 - n_dropped_submodel, cm->size2 - n_dropped_submodel); - fill_submatrix (cm, model_cov, model_dropped, n_dropped_model); - fill_submatrix (cm, submodel_cov, submodel_dropped, n_dropped_submodel); + submodel_cov = gsl_matrix_calloc (cm->size1 - n_dropped_submodel, cm->size2 - n_dropped_submodel); + + fill_submatrix (cm, model_cov, model_dropped); + fill_submatrix (cm, submodel_cov, submodel_dropped); reg_sweep (model_cov, 0); reg_sweep (submodel_cov, 0); + gsl_vector_set (ssq, k + 1, - gsl_matrix_get (submodel_cov, 0, 0) - - gsl_matrix_get (model_cov, 0, 0)); + gsl_matrix_get (submodel_cov, 0, 0) - gsl_matrix_get (model_cov, 0, 0) + ); + gsl_matrix_free (model_cov); gsl_matrix_free (submodel_cov); } @@ -613,6 +543,7 @@ output_glm (const struct glm_spec *cmd, const struct glm_workspace *ws) if (cmd->intercept) nr++; + msg (MW, "GLM is experimental. Do not rely on these results."); t = tab_create (nc, nr); tab_title (t, _("Tests of Between-Subjects Effects")); @@ -801,9 +732,6 @@ parse_design_interaction (struct lexer *lexer, struct glm_spec *glm, struct inte if ( lex_match (lexer, T_ASTERISK) || lex_match (lexer, T_BY)) { -#if 0 - lex_error (lexer, "Interactions are not yet implemented"); return false; -#endif return parse_design_interaction (lexer, glm, iact); }